次の方法で共有


Bicep でデプロイ スクリプトを使う

deploymentScripts リソースを使用して、Bicep デプロイでスクリプトを実行し、実行結果を確認できます。 これらのスクリプトは、次のカスタム手順を実行するのに役立ちます。

  • ユーザーをディレクトリに追加します。
  • データ プレーン操作 (BLOB のコピー、シード データベースなど) を実行する。
  • ライセンス キーを検索して検証します。
  • 自己署名証明書を作成します。
  • Microsoft Entra ID でオブジェクトを作成します。
  • カスタム システムから IP アドレス ブロックを検索する。

デプロイ スクリプトには次のような利点があります。

  • 簡単にコーディング、使用、デバッグができます。 デプロイ スクリプトは、好みの開発環境で開発できます。 スクリプトは、Bicep ファイルか外部スクリプト ファイルに埋め込むことができます。
  • スクリプト言語とプラットフォームを指定できます。 現時点では、Linux 環境の Azure PowerShell および Azure CLI デプロイ スクリプトがサポートされています。
  • スクリプトにコマンドライン引数を渡すことができます。
  • スクリプトの出力を指定して、デプロイに渡すことができます。

デプロイ スクリプト リソースは、Azure Container Instances が使用可能なリージョンでのみ使用できます。 詳細については、「リージョン別利用可能な ACI と製品のリソースの可用性とクォータの制限」を参照してください。

警告

デプロイ スクリプト サービスでは、スクリプトの実行とトラブルシューティングのために、ストレージ アカウントとコンテナー インスタンスという 2 つの追加リソースが必要です。 一般に、デプロイ スクリプトが完了すると、このサービスによってこれらのリソースはクリーンアップされます。 これらのリソースが削除されるまでは料金が発生します。

価格については、 Azure Container Instances の価格Azure Blob Storage の価格に関するページを参照してください。 詳細については、「デプロイ スクリプト リソースのクリーンアップ」を参照してください。

最低限のアクセス許可を構成する

デプロイ スクリプトの 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/actionMicrosoft.ContainerInstance/register/actionを追加します。

  • デプロイ スクリプト プリンシパル: このプリンシパルが必要になるのは、デプロイ スクリプトが Azure に対して認証を行い、Azure CLI または PowerShell を呼び出す必要がある場合のみです。 デプロイ スクリプト プリンシパルの指定には 2 とおりの方法があります。

    • プロパティでidentity指定します。デプロイ スクリプトのリソース構文を参照してください。 ユーザー割り当てマネージド 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

デプロイ スクリプト リソースの作成の詳細については、「 Bicep でのデプロイ スクリプトの開発」を参照してください。 デプロイ スクリプト リソースのスクリプトを作成するには、Azure コンテナー インスタンスや Docker イメージなどの専用スクリプト開発環境を確立することをお勧めします。 スクリプトを開発し、十分にテストしたら、デプロイ スクリプト リソースからスクリプト ファイルを統合するか呼び出すことができます。 詳細については、 Bicep ファイル内のデプロイ スクリプトの開発環境の構成に関するページを参照してください。

スクリプトを 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@2025-06-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@2025-01-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 ファイルを保存するためのストレージ アカウントが必要です。 独自のストレージ アカウントを指定できます。 詳細については、「既存のストレージ アカウントを使用する」を参照してください。

自分のストレージ アカウントを指定するのではなく、cleanupPreferenceOnExpiration に設定することもできます。 次に、ストレージ アカウントが削除される前に余裕を持って出力を確認できる期間として、retentionInterval を構成します。 詳細については、「デプロイ スクリプト リソースをクリーンアップする」を参照してください。

先ほどの Bicep ファイルに cleanupPreference プロパティを追加し、値を OnExpiration に設定します。 既定値は Always です。 また、rentalIntervalPT1H (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 が付いたファイル共有を選びます。 azscriptinputazscriptoutput という 2 つのフォルダーが一覧に表示されます。 出力フォルダーには、executionresult.json ファイルとスクリプトの出力ファイルが含まれています。 executionresult.json ファイルには、スクリプト実行エラー メッセージが含まれています。 出力ファイルは、スクリプトが正常に実行された場合にのみ作成されます。

デプロイ スクリプトの出力フォルダーの内容を示すスクリーンショット。

入力フォルダーには、システム スクリプト ファイルとユーザー デプロイ スクリプト ファイルが含まれています。 ユーザー用デプロイ スクリプトを変更したものに置き換え、Azure コンテナー インスタンスからデプロイ スクリプトを再実行することができます。

Azure CLI

Azure CLI を使うと、サブスクリプションまたはリソース グループのスコープでデプロイ スクリプトを管理できます。

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 の出力は次の例のようになります。

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 : 14.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 デプロイ スクリプトからプライベート仮想ネットワークにアクセス する」または「 プライベート エンドポイント経由で Bicep デプロイ スクリプトをプライベートに実行する」を参照してください。

次のステップ

この記事では、デプロイ スクリプトの使用方法について学習しました。 この記事のトピックについては、以下を参照してください。