==================================================================================== === Показать информацию об Azure Container Registry: ==================================================================================== # az acr show -n rgnameacr ==================================================================================== === Показать логи контейнера: ==================================================================================== # az container logs --resource-group "rg_name" --name "container_name" ==================================================================================== === Показать информацию о контейнере: ==================================================================================== # az container show --resource-group "rg_name" --name "container_name" ==================================================================================== === При создании контейнера с dns-именем и приватной сетью появляется ошибка "IP Address type can't be public when network profile is set". Мудилы не умеют корректно описывать причину ошибки: ==================================================================================== ==================================================================================== === При первой попытке создания контейнера с приватной сетью в West Europe вываливается: ==================================================================================== # ERROR: The command failed with an unexpected error. Here is the traceback: ERROR: 'NetworkProfile' object has no attribute 'result' Traceback (most recent call last): File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-taryuzhh\knack\cli.py", line 233, in invoke File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 660, in execute File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 723, in _run_jobs_serially File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 716, in _run_job File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-l7ikczg1\six.py", line 703, in reraise File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 694, in _run_job File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 331, in __call__ File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\__init__.py", line 808, in default_command_handler File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-ibh5mnup\azure\cli\command_modules\container\custom.py", line 190, in create_container File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-ibh5mnup\azure\cli\command_modules\container\custom.py", line 348, in _get_vnet_network_profile AttributeError: 'NetworkProfile' object has no attribute 'result' To open an issue, please run: 'az feedback' == При повторном запуске - всё ок == ==================================================================================== === Как логиниться в докер токеном из acr (пользователь именно с нулями): ==================================================================================== # https://docs.microsoft.com/uk-ua/azure/container-registry/container-registry-authentication $TOKEN = (az acr login --name $registry_username --expose-token --output tsv --query accessToken) docker login $acr_loginserver -u 00000000-0000-0000-0000-000000000000 -p $TOKEN ==================================================================================== === Как логиниться в azure с помощью service principal ==================================================================================== # az login --service-principal --username $app_id --password $client_secret --tenant $tenant_id ==================================================================================== === Как использовать service principal для работы с Databricks: ==================================================================================== # 0. Use "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d" as resource_id - it's default id for Databricks. 1. Get admin's PAT in Databricks interface. 2. Create Service Principal for Databricks. 3. Add SP to Databricks IAM as Contributor. 4. Grant necessary permissions for SP in "API permissions" section (it should be "user_impersonation" permissions). 5. Manage "User consent" in "Enterprise applications" section. 6. Click "Grant admin consent for Default Directory" if you see necessary resources below. 7. **HERE SHOULD BE SOME CURL COMMAND** ==================================================================================== === Как логиниться в докер из Windows Jenkins-ноды, которая подключена к мастеру через ssh (ssh в этом случае принципиален, потому что логин с локалхоста выполняется без проблем.): ==================================================================================== == После попытки логина из Jenkins с помощью (думаю, первый "az acr login" не нужен, но всё же): == # $registry_username = $YOUR_AZURE_REGISTRY_NAME $registry_secret = $YOUR_AZURE_REGISTRY_SECRET $loginserver = "SOMETHING.azurecr.io" az acr login -n $registry_username -u $registry_username -p $registry_secret $token = (az acr login --name $registry_username --expose-token --output tsv --query accessToken) docker login $loginserver -u 00000000-0000-0000-0000-000000000000 -p $token появляется файл C:\Users\$YOUR_USER\.docker\config.json с примерно таким содержимым: { "auths": { "testdockerregistry.azurecr.io": {} }, "credsStore": "wincred" } == Если так и оставить, то Jenkins, при попытке залогиниться одной из своих нод, будет отваливаться с ошибкой: "Error saving credentials: error storing credentials - err: exit status 1, out: `A specified logon session does not exist. It may already have been terminated.`" Чтобы это починить, в config.json нужно заменить "wincred" на "". После этого запустить джобу повторно. В config.json должна появиться запись с полученным токеном. Всё должно быть хорошо по-крайней мере до следующей перезагрузки. По-нормальному же это можно сделать, генерируя файл config.json с помощью Set-Content, заполняя его при сборке каждый раз заново. == ==================================================================================== === Обязательное экранирование кавычек при парсинге json в azure cli: ==================================================================================== # $jv = '[{\"category\": \"AllMetrics\",\"enabled\": true,\"retentionPolicy\": {\"enabled\": false, \"days\": 0 }}]' az monitor diagnostic-settings create -n "lalala" --resource "devkvpmtengine" -g " --resource-type "Microsoft.KeyVault/vaults" --workspace "devlgspaceapp" --metrics $jv using-quotation-marks-in-values Концепция вцелом (лень проверять, какой из вариантов валидный): az version --query '\"azure-cli\"' az version --query "\`"azure-cli\`"" az version --query "\""azure-cli\""" az --% version --query "\"azure-cli\"" az --% version --query \"azure-cli\" ==================================================================================== === Экспортировать содержимое таблицы CosmosDB в JSON: ==================================================================================== == На 20211029 нужно использовать "datamigrationtool". Ясная схема работы - указывается источник данных, его кастомный connection string (AccountEndpoint, AccountKey, Database) и название таблицы, а также получатель данных - расположение JSON, необязательные параметры для него. Данные для Connection String берутся из соответствующего раздела CosmosDB в портале. Но, оказывается, есть нюанс - на портале endpoint выглядит как "https://testname.table.azure.com:443/", а должен быть "https://testname.documents.azure.com:443/" (это по состоянию на 20211029 и dt_v.1.8.3). Пример строки экспорта: == # ./dt.exe /s:DocumentDB /s.ConnectionString:"AccountEndpoint=https://tablename.documents.azure.com:443/;AccountKey=somekey==;Database=db_name" /s.Collection:"collection_name" /t:JsonFile /t.File:"1.json" /ErrorDetails:All ==================================================================================== === Если в Azure Webapp при попытке открыть *.json отдается 404, на файл находится в корректном каталоге, нужно редактировать web.config хотя бы до такого состояния: ==================================================================================== # ==================================================================================== === The resource you are looking for has been removed had its name changed or is temporarily unavailable (Azure Webapp). Снова нужно редактировать web.config: ==================================================================================== # ==================================================================================== === Дефолтный web.config для netcore приложения: ==================================================================================== # ==================================================================================== === Экспортировать notebook из Azure Databricks Workspace: ==================================================================================== # curl --netrc --request GET https://adb-11.11.azuredatabricks.net/api/2.0/workspace/export --header 'Authorization: Bearer token' --header 'Accept: application/json' --data '{ "path": "/Users/user@outlook.com/folder/notebook", "format": "SOURCE", "direct_download": true }' > filename ==================================================================================== === Получить tenant_id и subscription_id через az cli: ==================================================================================== # az login ==================================================================================== === Создать service principal с правами "Owner" на уровень подписки: ==================================================================================== az ad sp create-for-rbac --display-name "subscription-manager" --role "Owner" --scopes "/subscriptions/SUBSCRIPTION_ID" ==================================================================================== === Авторизоваться в Azure с помощью service principal: ==================================================================================== # # Создать в терминале следующие переменные среды: $Env:ARM_CLIENT_ID = $APP_ID $Env:ARM_CLIENT_SECRET = $PASSWORD $Env:ARM_SUBSCRIPTION_ID = $SUBSCRIPTION_ID $Env:ARM_TENANT_ID = $TENANT_ID ==================================================================================== === Получить object_id service principal (это не тот object_id, который отображается на странице Overview service principal): ==================================================================================== == Через консоль в Azure Portal: # $(Get-AzureADServicePrincipal -Filter "AppId eq '35e6b976-cb9d-408c-bc77-a60ddc8e30be'").ObjectId ==================================================================================== === Страдания в попытках получить данные о потраченных на подписку деньгах. Зависит вроде как от версии api, но я так и не установил четкую корреляция (попытки конца 2021 года): ==================================================================================== # https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?$filter=properties%2FresourceGroup%20eq%20%27dev-project%27&$top=10&api-version=2021-01-01 GET https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Billing/billingPeriods/${billingPeriod}/providers/Microsoft.Consumption/usageDetails?$filter=properties/usageEnd ge '20210807' AND properties/usageEnd le '20210810' https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?&api-version=2019-10-01 curl -X GET -H "Authorization: Bearer ...FP-YiNecsLhEFsdU4s0Ym7Dg.." -H "Content-Type: application/json" 'https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?startDate=2021-11-05&endDate=2021-11-05&$top=100&api-version=2021-10-01' GET https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?startDate=2024-04-10&endDate=2024-04-10&$top=1000&api-version=2019-10-01 GET https://management.azure.com/{scope}/providers/Microsoft.Consumption/usageDetails?startDate=2020-08-01&endDate=2020-08-05&$top=1000&api-version=2019-10-01 GET https://management.azure.com/providers/Microsoft.Management/managementGroups/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/aggregatedcost?api-version=2021-10-01 '/providers/Microsoft.Management/managementGroups/$SUBSCRIPTION_ID/settings/$SUBSCRIPTION_ID' ==================================================================================== === Publish-AzWebApp: Deployment failed with status code Unauthorized: ==================================================================================== # == Установить environment setting для вебаппа: SCM_DO_BUILD_DURING_DEPLOYMENT true ==================================================================================== === Создать app service plan для function и прилинковать function к этому asp: ==================================================================================== # == Не забудь, что нельзя даунгрейдить премиум-план до бесплатного - можно только создать бесплатный и привязать function к новому плану, после чего удалять премиум. az functionapp plan list az functionapp plan create --name "dev-project-function-asp1" --resource-group "dev-project-rg1" --sku EP1 --min-instances 1 --max-burst 2 az functionapp update --plan "dev-project-function-asp1" -n "dev-project-worker" --resource-group "dev-project-rg1" az functionapp plan list az functionapp plan create --name "dev-project-function-asp1" --resource-group "dev-project-rg1" --sku Y1 az functionapp update --plan "dev-project-function-asp1" -n "dev-project-worker" --resource-group "dev-project-rg1" ==================================================================================== === Получить суточный биллинг по подписке (цифры почти сходятся с тем, что выдает Azure Portal): ==================================================================================== # GET subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?startDate=2024-04-10&endDate=2024-04-10&$expand=MeterDetails,additionalInfo&api-version=2019-10-01&metric=actualcost