Bicep でデプロイ スクリプトを使う
deploymentScripts リソースを使うと、Bicep デプロイでスクリプトを実行し、実行結果を確認できます。 これらのスクリプトを使って、次のようなカスタム手順を実行できます。
- ユーザーをディレクトリに追加します。
- データ プレーン操作 (BLOB のコピー、シード データベースなど) を実行する。
- ライセンス キーを検索して検証します。
- 自己署名証明書を作成します。
- Microsoft Entra ID でオブジェクトを作成します。
- カスタム システムから IP アドレス ブロックを検索する。
デプロイ スクリプトには次のような利点があります。
- 簡単にコーディング、使用、デバッグができます。 デプロイ スクリプトは、好みの開発環境で開発できます。 スクリプトは、Bicep ファイルか外部スクリプト ファイルに埋め込むことができます。
- スクリプト言語とプラットフォームを指定できます。 現時点では、Linux 環境の Azure PowerShell と Azure CLI のデプロイ スクリプトがサポートされています。
- スクリプトにコマンドライン引数を渡すことができます。
- スクリプトの出力を指定して、デプロイに渡すことができます。
デプロイ スクリプト リソースは、Azure Container Instances が使用可能なリージョンでのみ使用できます。 詳細については、「Azure リージョンの Azure Container Instances のリソースの可用性」を参照してください。
警告
デプロイ スクリプト サービスでは、スクリプトの実行とトラブルシューティングのために、ストレージ アカウントとコンテナー インスタンスという 2 つの追加リソースが必要です。 一般に、デプロイ スクリプトが完了すると、このサービスによってこれらのリソースはクリーンアップされます。 これらのリソースが削除されるまでは料金が発生します。
価格情報については、「Container Instances の価格」と「Azure Storage の料金」を参照してください。 詳細については、「デプロイ スクリプト リソースのクリーンアップ」を参照してください。
トレーニング リソース
ステップバイステップ ガイダンスでデプロイ スクリプトについて学習する場合は、「デプロイ スクリプトを使用して Bicep および ARM テンプレートを拡張する」を参照してください。
最低限のアクセス許可を構成する
デプロイ スクリプトの API バージョン 2020-10-01
以降では、デプロイ スクリプトの実行に 2 つのプリンシパルが関係します。
デプロイ プリンシパル: このプリンシパルは、Bicep ファイルのデプロイに使われます。 これにより、デプロイ スクリプト リソースの実行に必要な基となるリソース (ストレージ アカウントと Azure コンテナー インスタンス) が作成されます。 最小限の特権のアクセス許可を構成するには、次のプロパティを含んだカスタム ロールをデプロイ プリンシパルに割り当てます。
{ "roleName": "deployment-script-minimum-privilege-for-deployment-principal", "description": "Configure least privilege for the deployment principal in deployment script", "type": "customRole", "IsCustom": true, "permissions": [ { "actions": [ "Microsoft.Storage/storageAccounts/*", "Microsoft.ContainerInstance/containerGroups/*", "Microsoft.Resources/deployments/*", "Microsoft.Resources/deploymentScripts/*" ], } ], "assignableScopes": [ "[subscription().id]" ] }
Azure Storage と Azure Container Instances のリソース プロバイダーが登録されていない場合は、必ず
Microsoft.Storage/register/action
とMicrosoft.ContainerInstance/register/action
を追加してください。デプロイ スクリプト プリンシパル: このプリンシパルが必要になるのは、デプロイ スクリプトが Azure に対して認証を行い、Azure CLI または PowerShell を呼び出す必要がある場合のみです。 デプロイ スクリプト プリンシパルの指定には 2 とおりの方法があります。
identity
プロパティにユーザー割り当てマネージド ID を指定します (デプロイ スクリプト リソースの構文を参照してください)。ユーザー割り当てマネージド ID を指定すると、スクリプト サービスにより、デプロイ スクリプトの呼び出し前にConnect-AzAccount -Identity
が呼び出されます。 マネージド ID に、スクリプト内の操作を完了するために必要なアクセス権がある必要があります。 現在、identity
プロパティにサポートされているのは、ユーザー割り当てマネージド ID のみです。 別の ID でログインするには、この箇条書きの 2 つ目の方法を使用してください。- サービス プリンシパルの資格情報を安全な環境変数として渡してから、デプロイ スクリプトで Connect-AzAccount または az login を呼び出します。
マネージド ID を使う場合は、マネージ ID リソースに割り当てられた組み込みのマネージド ID オペレーター ロールがデプロイ プリンシパルに必要です。
現在のところ、デプロイ スクリプトのアクセス許可を構成するための組み込みロールはありません。
配置スクリプトを作成する
次の例は、デプロイ スクリプト リソースを含む単純な Bicep ファイルを示しています。 このスクリプトは 1 つの文字列パラメーターを受け取り、別の文字列を作成します。
param name string = 'John Dole'
param location string = resourceGroup().location
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
name: 'inlineCLI'
location: location
kind: 'AzureCLI'
properties: {
azCliVersion: '2.52.0'
arguments: name
scriptContent: 'echo "The argument is ${name}."; jq -n -c --arg st "Hello ${name}" \'{"text": $st}\' > $AZ_SCRIPTS_OUTPUT_PATH'
retentionInterval: 'PT1H'
}
}
output text string = deploymentScript.properties.outputs.text
デプロイ スクリプト リソースの作成の詳細については、デプロイ スクリプトの作成に関する記事を参照してください。 デプロイ スクリプト リソースのためにスクリプトを作成するには、Azure Container Instances や Docker イメージなど、専用のスクリプト開発環境を構築することをお勧めします。 スクリプトを開発し、十分にテストしたら、デプロイ スクリプト リソースからスクリプト ファイルを統合するか呼び出すことができます。 詳細については、スクリプト開発環境の構成に関する記事を参照してください。
スクリプトを inlineScript.bicep ファイルに保存してから、次のスクリプトを使ってリソースをデプロイします。
$resourceGroupName = Read-Host -Prompt "Enter the name of the resource group to be created"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
New-AzResourceGroup -Name $resourceGroupName -Location $location
New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateFile "inlineScript.bicep"
Write-Host "Press [ENTER] to continue ..."
マネージド ID の使用
次の例では、マネージド ID を使用してデプロイ スクリプト内から Azure と対話する方法を示します。
@description('The location of the resources.')
param location string = resourceGroup().location
@description('The storage account to list blobs from.')
param storageAccountData {
name: string
container: string
}
@description('The role id of Storage Blob Data Reader.')
var storageBlobDataReaderRoleId = '2a2b9908-6ea1-4ae2-8e65-a410df84e7d1'
@description('The storage account to read blobs from.')
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' existing = {
name: storageAccountData.name
}
@description('The Storage Blob Data Reader Role definition from [Built In Roles](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles).')
resource storageBlobDataReaderRoleDef 'Microsoft.Authorization/roleDefinitions@2022-05-01-preview' existing = {
scope: subscription()
name: storageBlobDataReaderRoleId
}
@description('The user identity for the deployment script.')
resource scriptIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = {
name: 'script-identity'
location: location
}
@description('Assign permission for the deployment scripts user identity access to the read blobs from the storage account.')
resource dataReaderRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
scope: storageAccount
name: guid(storageBlobDataReaderRoleDef.id, scriptIdentity.id, storageAccount.id)
properties: {
principalType: 'ServicePrincipal'
principalId: scriptIdentity.properties.principalId
roleDefinitionId: storageBlobDataReaderRoleDef.id
}
}
@description('The deployment script.')
resource script 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
name: 'script'
location: location
kind: 'AzureCLI'
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${scriptIdentity.id}': {}
}
}
properties: {
azCliVersion: '2.59.0'
retentionInterval: 'PT1H'
arguments: '${storageAccount.properties.primaryEndpoints.blob} ${storageAccountData.container}'
scriptContent: '''
#!/bin/bash
set -e
az storage blob list --auth-mode login --blob-endpoint $1 --container-name $2
'''
}
}
デプロイ スクリプトの監視とトラブルシューティング
デプロイ スクリプト リソースをデプロイするときは、ユーザー スクリプト、実行結果、stdout
ファイルを保存するためのストレージ アカウントが必要です。 独自のストレージ アカウントを指定できます。 詳細については、「既存のストレージ アカウントを使用する」を参照してください。
自分のストレージ アカウントを指定するのではなく、cleanupPreference
を OnExpiration
に設定することもできます。 次に、ストレージ アカウントが削除される前に余裕を持って出力を確認できる期間として、retentionInterval
を構成します。 詳細については、「デプロイ スクリプト リソースをクリーンアップする」を参照してください。
先ほどの Bicep ファイルに cleanupPreference
プロパティを追加し、値を OnExpiration
に設定します。 既定値は Always
です。 また、rentalInterval
を PT1H
(1 時間) 以下に設定します。
param name string = 'John Dole'
param location string = resourceGroup().location
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
name: 'inlineCLI'
location: location
kind: 'AzureCLI'
properties: {
azCliVersion: '2.52.0'
arguments: name
scriptContent: 'echo "The argument is ${name}."; jq -n -c --arg st "Hello ${name}" \'{"text": $st}\' > $AZ_SCRIPTS_OUTPUT_PATH'
cleanupPreference: 'OnExpiration'
retentionInterval: 'PT1H'
}
}
output text string = deploymentScript.properties.outputs.text
Bicep ファイルを正常にデプロイしたら、Azure portal、Azure CLI、Azure PowerShell、または REST API を使って結果を確認します。
Azure portal
デプロイ スクリプト リソースをデプロイすると、Azure portal のリソース グループの下にそのリソースが一覧表示されます。 [概要] ページには、デプロイ スクリプト リソースに加えて、2 つのサポート リソースが表示されます。 リテンション期間が過ぎると、サポート リソースは削除されます。
これらのリソースは自動的に作成されるため、両方のサポート リソースの名前に azscripts というサフィックスが付いていることに注目してください。 サポート リソースを特定するもう 1 つの方法は、タグを使うことです。
一覧からデプロイ スクリプト リソースを選びます。 デプロイ スクリプト リソースの [概要] ページには、リソースに関する重要な情報が表示されます。たとえば、[プロビジョニングの状態]、2 つのサポート リソース ([ストレージ アカウント] と [コンテナー インスタンス]) などです。 [ログ] 領域には、スクリプトからの出力テキストが表示されます。
[出力] を選ぶと、スクリプトの出力が表示されます。
リソース グループに戻り、ストレージ アカウントを選び、[ファイル共有] を選びます。次に、共有名に azscripts が付いたファイル共有を選びます。 azscriptinput と azscriptoutput という 2 つのフォルダーが一覧に表示されます。 出力フォルダーには、executionresult.json ファイルとスクリプトの出力ファイルが含まれています。 executionresult.json ファイルには、スクリプト実行エラー メッセージが含まれています。 出力ファイルは、スクリプトが正常に実行された場合にのみ作成されます。
入力フォルダーには、システム スクリプト ファイルとユーザー デプロイ スクリプト ファイルが含まれています。 ユーザー用デプロイ スクリプトを変更したものに置き換え、Azure コンテナー インスタンスからデプロイ スクリプトを再実行することができます。
Azure CLI
Azure CLI を使うと、サブスクリプションまたはリソース グループのスコープでデプロイ スクリプトを管理できます。
- az deployment-scripts delete:デプロイ スクリプトを削除します。
- az deployment-scripts list:すべてのデプロイ スクリプトを一覧表示します。
- az deployment-scripts show:デプロイ スクリプトを取得します。
- az deployment-scripts show-log:デプロイ スクリプトのログを表示します。
list コマンドの出力は、次の例のようになります。
{
"arguments": "John Dole",
"azCliVersion": "2.52.0",
"cleanupPreference": "OnExpiration",
"containerSettings": {
"containerGroupName": null
},
"environmentVariables": null,
"forceUpdateTag": null,
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/dsDemo/providers/Microsoft.Resources/deploymentScripts/inlineCLI",
"identity": null,
"kind": "AzureCLI",
"location": "centralus",
"name": "inlineCLI",
"outputs": {
"text": "Hello John Dole"
},
"primaryScriptUri": null,
"provisioningState": "Succeeded",
"resourceGroup": "dsDemo",
"retentionInterval": "1:00:00",
"scriptContent": "echo \"The argument is John Dole.\"; jq -n -c --arg st \"Hello John Dole\" '{\"text\": $st}' > $AZ_SCRIPTS_OUTPUT_PATH",
"status": {
"containerInstanceId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/dsDemo/providers/Microsoft.ContainerInstance/containerGroups/jgczqtxom5oreazscripts",
"endTime": "2023-12-11T20:20:12.149468+00:00",
"error": null,
"expirationTime": "2023-12-11T21:20:12.149468+00:00",
"startTime": "2023-12-11T20:18:26.674492+00:00",
"storageAccountId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/dsDemo/providers/Microsoft.Storage/storageAccounts/jgczqtxom5oreazscripts"
},
"storageAccountSettings": null,
"supportingScriptUris": null,
"systemData": {
"createdAt": "2023-12-11T19:45:32.239063+00:00",
"createdBy": "johndole@contoso.com",
"createdByType": "User",
"lastModifiedAt": "2023-12-11T20:18:26.183565+00:00",
"lastModifiedBy": "johndole@contoso.com",
"lastModifiedByType": "User"
},
"tags": null,
"timeout": "1 day, 0:00:00",
"type": "Microsoft.Resources/deploymentScripts"
}
Azure PowerShell
Azure PowerShell を使うと、サブスクリプションまたはリソース グループのスコープでデプロイ スクリプトを管理できます。
- Get-AzDeploymentScript: デプロイ スクリプトを取得または一覧表示します。
- Get-AzDeploymentScriptLog: デプロイ スクリプト実行のログを取得します。
- Remove-AzDeploymentScript: デプロイ スクリプトとそれに関連付けられているリソースを削除します。
- Save-AzDeploymentScriptLog: デプロイ スクリプト実行のログをディスクに保存します。
Get-AzDeploymentScript
の出力は次の例のようになります。
Name : inlinePS
Id : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/dsDemo/providers/Microsoft.Resources/deploymentScripts/inlinePS
ResourceGroupName : dsDemo
Location : centralus
SubscriptionId : aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
ProvisioningState : Succeeded
Identity :
ScriptKind : AzurePowerShell
AzPowerShellVersion : 10.0
StartTime : 12/11/2023 9:45:50 PM
EndTime : 12/11/2023 9:46:59 PM
ExpirationDate : 12/11/2023 10:46:59 PM
CleanupPreference : OnExpiration
StorageAccountId : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/dsDemo/providers/Microsoft.Storage/storageAccounts/ee5o4rmoo6ilmazscripts
ContainerInstanceId : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/dsDemo/providers/Microsoft.ContainerInstance/containerGroups/ee5o4rmoo6ilmazscripts
Outputs :
Key Value
================== ==================
text Hello John Dole.
RetentionInterval : PT1H
Timeout : P1D
REST API
REST API を使うと、リソース グループ レベルとサブスクリプション レベルでデプロイ スクリプト リソースに関するデプロイ情報を取得できます。
/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>?api-version=2020-10-01
/subscriptions/<SubscriptionID>/providers/microsoft.resources/deploymentScripts?api-version=2020-10-01
ARMClient を使う例を次に示します。 ARMClient はサポートされている Microsoft ツールではありません。
armclient login
armclient get /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/myrg/providers/microsoft.resources/deploymentScripts/myDeployementScript?api-version=2020-10-01
出力は次の例のようになります。
{
"kind": "AzureCLI",
"identity": null,
"location": "centralus",
"systemData": {
"createdAt": "2023-12-11T19:45:32.239063+00:00",
"createdBy": "johndole@contoso.com",
"createdByType": "User",
"lastModifiedAt": "2023-12-11T20:18:26.183565+00:00",
"lastModifiedBy": "johndole@contoso.com",
"lastModifiedByType": "User"
},
"properties": {
"provisioningState": "Succeeded",
"azCliVersion": "2.52.0",
"scriptContent": "echo \"The argument is John Dole.\"; jq -n -c --arg st \"Hello John Dole\" '{\"text\": $st}' > $AZ_SCRIPTS_OUTPUT_PATH",
"arguments": "John Dole",
"retentionInterval": "1:00:00",
"timeout": "1 day, 0:00:00",
"containerSettings": {
"containerGroupName": null
},
"status": {
"containerInstanceId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/dsDemo/providers/Microsoft.ContainerInstance/containerGroups/jgczqtxom5oreazscripts",
"endTime": "2023-12-11T20:20:12.149468+00:00",
"error": null,
"expirationTime": "2023-12-11T21:20:12.149468+00:00",
"startTime": "2023-12-11T20:18:26.674492+00:00",
"storageAccountId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/dsDemo/providers/Microsoft.Storage/storageAccounts/jgczqtxom5oreazscripts"
},
"outputs": {
"text": "Hello John Dole"
},
"cleanupPreference": "OnSuccess"
},
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/dsDemo/providers/Microsoft.Resources/deploymentScripts/inlineCLI",
"type": "Microsoft.Resources/deploymentScripts",
"name": "inlineCLI",
}
次の REST API では、ログが返されます。
/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>/logs?api-version=2020-10-01
これはデプロイ スクリプト リソースが削除される前にのみ機能します。
デプロイ スクリプトのエラー コード
次の表にデプロイ スクリプトのエラー コードを示します。
エラー コード | 説明 |
---|---|
DeploymentScriptInvalidOperation |
Bicep ファイルのデプロイ スクリプト リソース定義に、無効なプロパティ名が含まれています。 |
DeploymentScriptResourceConflict |
終了していない状態で、かつ実行が 1 時間を超えていないデプロイ スクリプト リソースは削除できません。 また、リソース識別子が同じ (サブスクリプション、リソース グループ名、リソース名は同じ) であっても、スクリプト本文のコンテンツが異なる同じデプロイ スクリプトを同時に再実行することはできません。 |
DeploymentScriptOperationFailed |
内部でデプロイ スクリプトの操作が失敗しました。 Microsoft サポートにお問い合わせください |
DeploymentScriptStorageAccountAccessKeyNotSpecified |
既存のストレージ アカウントにアクセス キーが指定されていませんでした。 |
DeploymentScriptContainerGroupContainsInvalidContainers |
デプロイ スクリプト サービスによって作成されたコンテナー グループが外部で変更され、無効なコンテナーが追加されました。 |
DeploymentScriptContainerGroupInNonterminalState |
2 つ以上のデプロイ スクリプト リソースによって、同じリソース グループ内で同じ Azure コンテナー インスタンス名が使用されており、そのうちの 1 つでまだ実行が完了していません。 |
DeploymentScriptExistingStorageNotInSameSubscriptionAsDeploymentScript |
デプロイで提供される既存のストレージが、スクリプトがデプロイされているサブスクリプションで見つかりません。 |
DeploymentScriptStorageAccountInvalidKind |
BlobBlobStorage または BlobStorage 型の既存のストレージ アカウントはファイル共有をサポートしていないため、使用できません。 |
DeploymentScriptStorageAccountInvalidKindAndSku |
既存のストレージ アカウントではファイル共有はサポートされていません。 サポートされているストレージ アカウントの種類の一覧については、「既存のストレージ アカウントを使用する」を参照してください。 |
DeploymentScriptStorageAccountNotFound |
ストレージ アカウントが存在しないか、外部のプロセスまたはツールによって削除されています。 |
DeploymentScriptStorageAccountWithServiceEndpointEnabled |
指定されたストレージ アカウントには、サービス エンドポイントがあります。 サービス エンドポイントを持つストレージ アカウントはサポートされていません。 |
DeploymentScriptStorageAccountInvalidAccessKey |
既存のストレージ アカウントに無効なアクセス キーが指定されました。 |
DeploymentScriptStorageAccountInvalidAccessKeyFormat |
ストレージ アカウント キーの形式が無効です。 「ストレージ アカウント アクセス キーを管理する」をご覧ください。 |
DeploymentScriptExceededMaxAllowedTime |
デプロイ スクリプトの実行時間が、デプロイ スクリプトのリソース定義で指定されているタイムアウト値を超えました。 |
DeploymentScriptInvalidOutputs |
デプロイ スクリプトの出力が有効な JSON オブジェクトではありません。 |
DeploymentScriptContainerInstancesServiceLoginFailure |
ユーザー割り当てマネージド ID によって、1 分間隔で 10 回ログインが試行されましたが、サインインできませんでした。 |
DeploymentScriptContainerGroupNotFound |
外部ツールまたはプロセスにより、デプロイ スクリプト サービスが作成したコンテナー グループが削除されました。 |
DeploymentScriptDownloadFailure |
サポート スクリプトのダウンロードに失敗しました。 「サポート スクリプトを使用する」を参照してください。 |
DeploymentScriptError |
ユーザー スクリプトがエラーをスローしました。 |
DeploymentScriptBootstrapScriptExecutionFailed |
ブートストラップ スクリプトがエラーをスローしました。 ブートストラップ スクリプトは、デプロイ スクリプトの実行を調整するシステム スクリプトです。 |
DeploymentScriptExecutionFailed |
デプロイ スクリプトの実行中に不明なエラーが発生しました。 |
DeploymentScriptContainerInstancesServiceUnavailable |
コンテナー インスタンスの作成中に、Azure Container Instances サービスから "サービスを利用できません" というエラーがスローされました。 |
DeploymentScriptContainerGroupInNonterminalState |
コンテナー インスタンスの作成時に、別のデプロイ スクリプトが同じスコープ (同じサブスクリプション、リソース グループ名、リソース名) の同じコンテナー インスタンス名を使っていました。 |
DeploymentScriptContainerGroupNameInvalid |
指定されたコンテナー インスタンス名が Azure Container Instances の要件を満たしていません。 「Azure Container Instances における、トラブルシューティングに関する一般的問題」を参照してください。 |
プライベート仮想ネットワークにアクセスする
追加で構成すると、プライベート ネットワークでデプロイ スクリプトを実行できます。 詳細については、「サービス エンドポイントを使用してプライベート仮想ネットワークにアクセスする」または「プライベート エンドポイント経由で Bicep デプロイ スクリプトをプライベートに実行する」を参照してください。
次のステップ
この記事では、デプロイ スクリプトの使用方法について学習しました。 詳細については、以下をご覧ください。