Azure Deployment Environmentの最大の難点が、BicepやPulumi、Terraformで環境構築中にエラーが出たときに実行ログを確認できないことでした。今回ついにデプロイログ
という名で実行ログがとれるようになったのでメモです。
Azure Deployment Environmentの問題点
Azure Deployment Environmentは、カスタムイメージで環境構築時にエラーが出ると環境はFailed状態になります。 ただ、従来はIaCの何が原因でエラーになったのか調べようとしてもカスタムイメージのデプロイメントエラー手順でエラーログは確認できました。例えば、Bicepで展開するときのエラーでエラーが表示されています。
しかしPulumiやTerraformでAzure Deployment Environmentの環境構築時に実行エラーが出ても、エラーが出るのは実行ログであってエラーログではありません。このため、Azure Deployment Environmentのエラーログ確認方法では肝心のエラーが'null'
と表示されて虚無でした。
"message": "Operation failed with exit code UnknownError! Additional Error Details: ERROR: 'null' is not a valid ID. warning: A new version of Pulumi is available. To upgrade from version...."
これはaz
(Azure CLI)でも同様です。
# Get list of operations on the environment, choose the latest operation $ az devcenter dev environment list-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME} # Using the latest operation ID, view the operation logs $ az devcenter dev environment show-logs-by-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME} --operation-id {LATEST_OPERATION_ID}
ほしいのはデプロイの実行ログであってエラーログではないというのが問題の根幹にあります。
デプロイログがとれるようになった
2025年2月になって、Azure Deployment Environmentのデプロイ失敗時に、開発者ポータルからデプロイログがとれるようになりました。デプロイログはPulumiやTerraformの実行ログ(標準出力)が入っているので、まさに欲しかったものになります。
デプロイログを見るには開発者ポータル > 失敗した環境 > メニュー > デプロイ ログを選択 > デプロイの操作IDからダウンロードアイコンをクリック
します。これでログがダウンロードされて手元で確認できます。
Pulumiで構築している場合、実行ログ = Pulumiの標準出力です。例えば、次のような実行ログを取得できるので、Network Security Groupのルール数が制限を超えていることがわかります。最高!
{"timestamp": "02/23/2025 14:24:03", "type": "verbose", "filename": "Deploy", "content": "Initializing runner"} {"timestamp": "02/23/2025 14:24:06", "type": "verbose", "filename": "Deploy", "content": "Downloading environment state to /ade/storage"} {"timestamp": "02/23/2025 14:24:07", "type": "verbose", "filename": "Deploy", "content": "Selecting catalog directory: /ade/repository/Environments/PulumiTemplates/this-is-test"} {"timestamp": "02/23/2025 14:24:08", "type": "verbose", "filename": "Deploy", "content": "Executing script (/scripts/deploy.sh)"} {"timestamp": "02/23/2025 14:24:09", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:24:09", "type": "log", "filename": "Deploy", "content": ">>> Pulumi/.NET/Node/Python Versions..."} {"timestamp": "02/23/2025 14:24:09", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:24:09", "type": "log", "filename": "Deploy", "content": "v3.115.1"} // ...省略 {"timestamp": "02/23/2025 14:24:15", "type": "log", "filename": "Deploy", "content": ">>> Initializing Pulumi Stack..."} {"timestamp": "02/23/2025 14:24:15", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:24:15", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:24:15", "type": "log", "filename": "Deploy", "content": ">>> Setting Pulumi Configuration..."} {"timestamp": "02/23/2025 14:24:15", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:24:16", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:24:16", "type": "log", "filename": "Deploy", "content": ">>> Restore dependencies..."} {"timestamp": "02/23/2025 14:24:16", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:24:16", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:24:16", "type": "log", "filename": "Deploy", "content": ">>> Running Pulumi Up..."} {"timestamp": "02/23/2025 14:24:16", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:24:16", "type": "log", "filename": "Deploy", "content": "Previewing update (foo):"} // ... 省略 {"timestamp": "02/23/2025 14:24:49", "type": "log", "filename": "Deploy", "content": " pulumi:pulumi:Stack this-is-test-foo running 'dotnet build -nologo .' completed successfully"} {"timestamp": "02/23/2025 14:24:50", "type": "log", "filename": "Deploy", "content": "@ previewing update....."} {"timestamp": "02/23/2025 14:24:51", "type": "log", "filename": "Deploy", "content": " pulumi:pulumi:Stack this-is-test-foo "} {"timestamp": "02/23/2025 14:24:51", "type": "log", "filename": "Deploy", "content": "Resources:"} {"timestamp": "02/23/2025 14:24:51", "type": "log", "filename": "Deploy", "content": " + 21 to create"} {"timestamp": "02/23/2025 14:24:51", "type": "log", "filename": "Deploy", "content": " 1 unchanged"} // ... 省略 {"timestamp": "02/23/2025 14:25:00", "type": "log", "filename": "Deploy", "content": "Diagnostics:"} {"timestamp": "02/23/2025 14:25:00", "type": "log", "filename": "Deploy", "content": " azure-native:network:NetworkSecurityGroup (foo-nsg):"} {"timestamp": "02/23/2025 14:25:00", "type": "log", "filename": "Deploy", "content": " error: Status=400 Code=\"SecurityRuleAddressesOrPortsPerSecurityGroupLimitReached\" Message=\"Network security group /subscriptions/12345678-1234-1234-1234-123456781234/resourceGroups/this-is-test-foo/providers/Microsoft.Network/networkSecurityGroups/foo-sg has 4099 SourceAddressPrefixes. A security group cannot have more than 4000 SourceAddressPrefixes as per the limit MaxSecurityRuleAddressesOrPortsPerSecurityGroup.\""} {"timestamp": "02/23/2025 14:25:00", "type": "log", "filename": "Deploy", "content": ""} {"timestamp": "02/23/2025 14:25:00", "type": "log", "filename": "Deploy", "content": " pulumi:pulumi:Stack (this-is-test-foo):"} {"timestamp": "02/23/2025 14:25:00", "type": "log", "filename": "Deploy", "content": " error: update failed"}
まとめ
これでPulumiやTerraformを使ってAzure Deployment Environmentを使っているときに、エラー原因をエスパーしなくてよくなりました!エラーが一度おこると解消が本当に難しかったので、心からうれしいです。
なお、現時点でこのデプロイログはAzure CLIからは取得できないようです。Azure CLIから取得できるようになると、エラーが出たときにエラーを自動取得できるのでぜひほしいところです。また、Microsoft Learnのドキュメントに記載を見つけることができていないので、こちらも早くドキュメントに起こしてほしいですね。
ほかにもAzure Deployment Environmentの不満はあるので今後もよくなっていくといいのですが、年単位でドキュメントの貧弱さが放置されているのを見ると利用者は多くないのでしょうか。Azureは利用者が少ないサービスはサービス終了する印象を持っているので、利用者が増えてほしいですね。
Azure Deployment Environmentは、他クラウドを見てもほかにないサービスなのでもっと知られてもいい気がします。