Bicep 内でデプロイ スクリプトを開発する

この記事では、Bicep 内でデプロイ スクリプトを開発する方法の例を示します。

デプロイ スクリプト リソースのデプロイに時間がかかる場合があります。 これらのスクリプトの開発とテストを効率的に行うには、Azure Container Instances や Docker インスタンスなどの専用の開発環境を構築することを検討してください。 詳細については、開発環境の作成に関する記事を参照してください。

構文

次の Bicep ファイルはデプロイ スクリプト リソースの例です。 詳細については、最新のデプロイ スクリプトのスキーマに関する記事を参照してください。

resource <symbolic-name> 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: '<resource-name>'
  location: resourceGroup().location
  tags: {}
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '<user-assigned-identity-id>': {}
    }
  }
  kind: 'AzureCLI'
  properties: {
    storageAccountSettings: {
      storageAccountName: '<storage-account-name>'
      storageAccountKey: '<storage-account-key>'
    }
    containerSettings: {
      containerGroupName: '<container-group-name>'
      subnetIds: [
        {
          id: '<subnet-id>'
        }
      ]
    }
    environmentVariables: []
    azCliVersion: '2.52.0'
    arguments: '<script-arguments>'
    scriptContent: '''<azure-cli-or-azure-powershell-script>''' // or primaryScriptUri: 'https://raw.githubusercontent.com/Azure/azure-docs-bicep-samples/main/samples/deployment-script/inlineScript.ps1'
    supportingScriptUris: []
    timeout: 'P1D'
    cleanupPreference: 'OnSuccess'
    retentionInterval: 'P1D'
    forceUpdateTag: '1'
  }
}

デプロイ スクリプトで次のプロパティ値を指定します。

  • tags: デプロイ スクリプトのタグを指定します。 デプロイ スクリプト サービスが 2 つのサポート リソース (ストレージ アカウントとコンテナー インスタンス) を生成した場合、両方のリソースにタグが渡されます。 タグを使用するとリソースを識別できます。 これらのサポート リソースを識別するもう 1 つの方法は、azscripts を含むサフィックスを使うことです。 詳しくは、「デプロイ スクリプトの監視とトラブルシューティング」をご覧ください。

  • identity: デプロイ スクリプト API バージョン 2020-10-01 以降では、スクリプトで Azure 固有のアクションを実行する必要がない限り、またはプライベート ネットワーク内でデプロイ スクリプトを実行する必要がない限り、ユーザー割り当てマネージド ID は省略可能です。 API バージョン 2019-10-01-preview では、デプロイ スクリプト サービスでスクリプトを実行するために使用されるため、マネージド ID が必要です。

    identity プロパティを指定すると、スクリプト サービスはユーザー スクリプトを呼び出す前に Connect-AzAccount -Identity を呼び出します。 現時点では、ユーザー割り当てマネージド ID のみがサポートされています。 デプロイ スクリプトで別の ID を使ってログインするには、Connect-AzAccount を呼び出すことができます。 詳細については、「最低限のアクセス許可を構成する」を参照してください。

  • kind: スクリプトの種類 (AzurePowerShell または AzureCLI) を指定します。 kind に加えて、azPowerShellVersion プロパティまたは azCliVersion プロパティも指定する必要があります。

  • storageAccountSettings:既存のストレージ アカウントを使用するための設定を指定します。 storageAccountName が指定されていない場合、ストレージ アカウントは自動的に作成されます。 詳細については、「既存のストレージ アカウントを使用する」を参照してください。

  • containerSettings: Azure コンテナー インスタンスの名前をカスタマイズします。 コンテナーのグループ名の構成については、この記事で後述する「コンテナー インスタンスの構成」を参照してください。 プライベート ネットワークでデプロイ スクリプトを実行するために subnetIds を構成する方法については、「プライベート仮想ネットワークにアクセスする」を参照してください。

  • environmentVariables: スクリプトに渡す環境変数を指定します。

  • azPowerShellVersion/azCliVersion: 使用するモジュールのバージョンを指定します。

    サポートされている Azure CLI バージョンの一覧を参照してください。

    重要

    デプロイ スクリプトは、Microsoft Artifact Registry から入手可能な CLI イメージを使用します。 デプロイ スクリプト用の CLI イメージの認定には通常 1 か月ほどかかります。 過去 30 日以内にリリースされた CLI バージョンは使用しないでください。 イメージのリリース日を確認するには、「Azure CLI リリース ノート」を参照してください。 サポートされていないバージョンを使用している場合、エラー メッセージにサポートされているバージョンが一覧表示されます。

  • arguments:パラメーター値を指定します。 値はスペースで区切ります。

    デプロイ スクリプトは CommandLineToArgvW システム呼び出しを起動することで、引数を文字列の配列に分割します。 この手順が必要なのは、引数がコマンド プロパティとして Azure Container Instances に渡され、このコマンド プロパティが文字列の配列であるためです。

    引数にエスケープ文字が含まれている場合は、文字をダブル エスケープします。 たとえば、前のサンプル Bicep 構文の引数は -name \"John Dole\" です。 エスケープされた文字列は -name \\"John Dole\\" です。

    object 型の Bicep パラメーターを引数として渡すには、string () 関数を使用してオブジェクトを文字列に変換してから、replace () 関数を使用してすべての引用符 (") をダブル エスケープした引用符 (\\") に置き換えます。 次に例を示します。

    replace(string(parameters('tables')), '"', '\\"')
    

    詳しくは、サンプル Bicep ファイルを参照してください。

  • scriptContent:スクリプトの内容を指定します。 これはインライン スクリプトにするか、loadTextContent 関数を使ってインポートした外部スクリプト ファイルにすることができます。 詳細については、この記事で後述する「インラインと外部ファイル」を参照してください。 外部スクリプトを実行するには、代わりに primaryScriptUri を使用します。

  • primaryScriptUri: サポートされているファイル拡張子を含むプライマリ デプロイ スクリプトへのパブリックにアクセス可能な URL を指定します。 詳細については、この記事で後述する「外部関数を使用する」を参照してください。

  • supportingScriptUris: scriptContent または primaryScriptUri で呼び出されるサポート ファイルへのパブリックにアクセス可能な URL の配列を指定します。 詳細については、この記事で後述する「インラインと外部ファイル」を参照してください。

  • timeout: ISO 8601 形式でスクリプトの許容最長実行時間を指定します。 既定値は P1D です。

  • forceUpdateTag: Bicep ファイルのデプロイ間でこの値を変更すると、デプロイ スクリプトが強制的に再実行されます。 newGuid() 関数または utcNow() 関数を使用する場合は、パラメーターの既定値でのみ使用できます。 詳細については、この記事で後述する「スクリプトを複数回実行する」を参照してください。

  • cleanupPreference スクリプトの実行が終了状態になったときに 2 つのデプロイ サポート リソース (ストレージ アカウントとコンテナー インスタンス) をクリーンアップする方法を指定します。 既定の設定は Always です。これは、終了状態 (SucceededFailed、または Canceled) に関係なくサポート リソースの削除を要求します。 詳細については、この記事で後述する「デプロイ スクリプト リソースのクリーンアップ」を参照してください。

  • retentionInterval: デプロイ スクリプトの実行が終了状態に達した後、サービスがデプロイ スクリプト リソースを保持する間隔を指定します。 この期限を過ぎると、デプロイ スクリプト リソースは削除されます。 期間は ISO 8601 のパターンに基づきます。 保持期間は 1 時間 (PT1H) から 26 時間 (PT26H) です。 このプロパティは、cleanupPreferenceOnExpiration に設定されている場合に使用します。 詳細については、この記事で後述する「デプロイ スクリプト リソースのクリーンアップ」を参照してください。

その他のサンプル

  • サンプル 1: キー コンテナーを作成し、デプロイ スクリプトを使用してキー コンテナーに証明書を割り当てます。
  • サンプル 2: サブスクリプション レベルでリソース グループを作成し、リソース グループにキー コンテナーを作成した後、デプロイ スクリプトを使用してキー コンテナーに証明書を割り当てます。
  • サンプル 3: ユーザー割り当てマネージド ID を作成し、リソース グループ レベルで ID に共同作成者ロールを割り当て、キー コンテナーを作成した後、デプロイ スクリプトを使用してキー コンテナーに証明書を割り当てます。
  • サンプル 4: ユーザー割り当てマネージド ID を手動で作成し、Microsoft Graph API を使用して Microsoft Entra アプリケーションを作成するための権限を割り当てます。 Bicep ファイルでデプロイ スクリプトを使用して Microsoft Entra アプリケーションとサービス プリンシパルを作成し、オブジェクト ID とクライアント ID を出力します。

インラインと外部ファイル

デプロイ スクリプトは、Bicep ファイル内に含めるか、別のファイルとして外部に保存できます。

インライン スクリプトを使用する

次の Bicep ファイルはインライン スクリプトの使用方法を示しています。

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: 'set -e; output="Hello $1"; echo $output'
    retentionInterval: 'P1D'
  }
}

スクリプトに set -e を含めると、コマンドが 0 以外の状態を返した場合に即時に終了できます。 こうすることで、エラーのデバッグ プロセスが効率化されます。

スクリプト ファイルを読み込む

loadTextContent 関数を使って、スクリプト ファイルを文字列として取得します。 この関数を使うと、スクリプトを外部ファイルに保持し、デプロイ スクリプトとしてアクセスできます。 スクリプト ファイルに指定するパスは、Bicep ファイルに対する相対パスです。

先ほどの Bicep ファイルからインライン スクリプトを hello.sh ファイルに抽出した後、このファイルを scripts というサブフォルダーに配置できます。

output="Hello $1"
echo $output

これで、次の例のように上記の Bicep ファイルを変更できるようになります。

param name string = 'John Dole'
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'loadTextContentCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    arguments: name
    scriptContent: loadTextContent('./scripts/hello.sh')
    retentionInterval: 'P1D'
  }
}

外部スクリプトを使用する

インライン スクリプトの代わりに外部スクリプト ファイルを使用できます。 ps1 拡張子を持つプライマリ PowerShell スクリプトのみがサポートされます。 CLI スクリプトの場合、有効な Bash スクリプト拡張子が付いているか、拡張子がまったくないプライマリ スクリプトを使用できます。 外部スクリプト ファイルを使用するには、scriptContentprimaryScriptUri で置き換えます。

param name string = 'John Dole'
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'externalScriptCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    primaryScriptUri: 'https://raw.githubusercontent.com/Azure/azure-docs-bicep-samples/main/samples/deployment-script/hello.sh'
    arguments: '-name ${name}'
    retentionInterval: 'P1D'
  }
}

外部スクリプト ファイルにアクセスできる必要があります。 Azure ストレージ アカウントに保存されているスクリプト ファイルをセキュリティで保護するには、Shared Access Signature (SAS) トークンを生成し、テンプレートの URI に含めます。 デプロイの完了に必要な時間を確保できるように有効期限を設定します。 詳細については、「SAS トークンを使用してプライベート ARM テンプレートをデプロイする」を参照してください。

デプロイ スクリプトが参照するスクリプト (primaryScriptUri または supportingScriptUris のいずれか) の整合性を確保する必要があります。 信頼できるスクリプトのみを参照します。

サポート スクリプトを使用する

複雑なロジックを、1 以上のサポート スクリプト ファイルに分けることができます。 supportingScriptUris プロパティを使用すると、必要に応じてサポート スクリプト ファイルに URI の配列を指定できます。

param name string = 'John Dole'
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'supportingScriptCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    arguments: name
    scriptContent: 'output="Hello $1"; echo $output; ./hello.sh "$1"'
    supportingScriptUris: [
      'https://raw.githubusercontent.com/Azure/azure-docs-bicep-samples/master/samples/deployment-script/hello.sh'
    ]
    retentionInterval: 'P1D'
  }
}

サポート スクリプト ファイルは、インライン スクリプトとプライマリ スクリプト ファイルの両方から呼び出すことができます。 サポート スクリプト ファイルには、ファイル拡張子に関する制限はありません。

サポート ファイルは、ランタイムで azscripts/azscriptinput にコピーされます。 インライン スクリプトおよびプライマリ スクリプト ファイルからサポート ファイルを参照するには、相対パスを使用します。

Azure リソースへのアクセス

Azure リソースにアクセスするには、identity 要素を構成する必要があります。 次の Bicep ファイルは、Azure キー コンテナーの一覧を取得する方法を示しています。 さらに、キー コンテナーにアクセスできる権限をユーザー割り当てマネージド ID に付与する必要があります。

param identity string
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'listKvCLI'
  location: location
  kind: 'AzureCLI'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${identity}': {}
    }
  }
  properties: {
    azCliVersion: '2.52.0'
    scriptContent: 'result=$(az keyvault list); echo $result | jq -c \'{Result: map({id: .id})}\' > $AZ_SCRIPTS_OUTPUT_PATH'
    retentionInterval: 'P1D'
  }
}

output result object = deploymentScript.properties.outputs

Note

現在、Azure サインインの再試行ロジックがラッパー スクリプトに組み込まれています。 デプロイ スクリプトと同じ Bicep ファイルで権限を付与する場合、マネージド ID のロール割り当てがレプリケートされるまで、デプロイ スクリプト サービスは 10 分間 (10 秒間隔) サインインを再試行します。

出力を操作する

出力を処理するアプローチは、使っているスクリプトの種類 (Azure PowerShell または Azure CLI) によって異なります。

Azure CLI デプロイ スクリプトは AZ_SCRIPTS_OUTPUT_PATH という名前の環境変数を利用して、スクリプトを出力するファイルの場所を示します。 Bicep ファイル内でデプロイ スクリプトを実行している場合、Bash シェルが自動的にこの環境変数を構成します。 定義済みの値は /mnt/azscripts/azscriptoutput/scriptoutputs.json に設定されます。

出力は有効な JSON 文字列オブジェクト構造に準拠する必要があります。 ファイルの内容は、キーと値のペアとして設定する必要があります。 たとえば、文字列の配列を { "MyResult": [ "foo", "bar"] } として保存します。 [ "foo", "bar" ] など配列の結果のみを保存すると無効になります。

param name string = 'John Dole'
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'outputCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    arguments: name
    scriptContent: 'jq -n -c --arg st "Hello ${name}" \'{"text": $st}\' > $AZ_SCRIPTS_OUTPUT_PATH'
    retentionInterval: 'P1D'
  }
}

output text string = deploymentScript.properties.outputs.text

先ほどのサンプルは出力を構築するために jq を使用します。 jq ツールにはコンテナー イメージが付属しています。 詳細については、開発環境の構成に関する記事を参照してください。

環境変数を使う

セキュリティで保護された文字列をデプロイ スクリプトに渡す

コンテナー インスタンス (EnvironmentVariable) で環境変数を設定すると、コンテナーが実行するアプリケーションまたはスクリプトの動的な構成を提供できます。 デプロイ スクリプトは、Azure Container Instance と同じ方法でセキュリティで保護されていない環境変数と保護されている環境変数を処理します。 詳細については、「コンテナー インスタンスで環境変数を設定する」を参照してください。

環境変数の最大許容サイズは 64 KB です。

param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'passEnvVariablesCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    environmentVariables: [
      {
        name: 'UserName'
        value: 'jdole'
      }
      {
        name: 'Password'
        secureValue: 'jDolePassword'
      }
    ]
    scriptContent: 'echo "Username is :$Username"; echo "Password is: $Password"'
    retentionInterval: 'P1D'
  }
}

システム定義環境変数

システム定義の環境変数を次の表に示します。

環境変数 既定値 (CLI) 既定値 (PowerShell) システムで予約済み
AZ_SCRIPTS_AZURE_ENVIRONMENT AzureCloud AzureCloud いいえ
AZ_SCRIPTS_CLEANUP_PREFERENCE Always Always いいえ
AZ_SCRIPTS_OUTPUT_PATH /mnt/azscripts/azscriptoutput/scriptoutputs.json 適用なし 有効
AZ_SCRIPTS_PATH_INPUT_DIRECTORY /mnt/azscripts/azscriptinput|/mnt/azscripts/azscriptinput 適用できません 有効
AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY /mnt/azscripts/azscriptoutput|/mnt/azscripts/azscriptoutput 適用できません はい
AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME userscript.sh userscript.ps1 イエス
AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME primaryscripturi.config primaryscripturi.config イエス
AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME supportingscripturi.config supportingscripturi.config イエス
AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME scriptoutputs.json scriptoutputs.json イエス
AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME executionresult.json executionresult.json 有効
AZ_SCRIPTS_USER_ASSIGNED_IDENTITY 適用できません 適用できません いいえ

AZ_SCRIPTS_OUTPUT_PATH の使用例については、この記事で前述する「出力の操作」を参照してください。

環境変数にアクセスするには、次のコマンドを使います。

param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'listEnvVariablesCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    scriptContent: 'echo "AZ_SCRIPTS_AZURE_ENVIRONMENT is : $AZ_SCRIPTS_AZURE_ENVIRONMENT",echo "AZ_SCRIPTS_CLEANUP_PREFERENCE	is : $AZ_SCRIPTS_CLEANUP_PREFERENCE",echo "AZ_SCRIPTS_OUTPUT_PATH	is : $AZ_SCRIPTS_OUTPUT_PATH",echo "AZ_SCRIPTS_PATH_INPUT_DIRECTORY is : $AZ_SCRIPTS_PATH_INPUT_DIRECTORY",echo "AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY is : $AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY",echo "AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME is : $AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME",echo "AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME	is : $AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME",echo "AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME	is : $AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME",echo "AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME	is : $AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME",echo "AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME	is : $AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME",echo "AZ_SCRIPTS_USER_ASSIGNED_IDENTITY	is : $AZ_SCRIPTS_USER_ASSIGNED_IDENTITY"'
    retentionInterval: 'P1D'
  }
}

既存のストレージ アカウントの使用

スクリプトを実行し、トラブルシューティングを行うには、ストレージ アカウントとコンテナー インスタンスが必要です。 既存のストレージ アカウントを指定するか、スクリプト サービスを使ってストレージ アカウントとコンテナー インスタンスの両方を自動的に作成できます。

既存のストレージ アカウントを使用するための要件は次のとおりです。

  • 次の表は、サポートされるアカウントの種類の一覧を示します。 層の列は、-SkuName パラメーターまたは --sku パラメーターの値を参照します。 サポートされる種類の列は、-Kind パラメーターまたは --kind パラメーターの値を参照します。

    レベル サポートされる種類
    Premium_LRS FileStorage
    Premium_ZRS FileStorage
    Standard_GRS StorageStorageV2
    Standard_GZRS StorageV2
    Standard_LRS StorageStorageV2
    Standard_RAGRS StorageStorageV2
    Standard_RAGZRS StorageV2
    Standard_ZRS StorageV2

    これらの組み合わせによりファイル共有がサポートされます。 詳細については、「Azure ファイル共有を作成する」および「ストレージ アカウントの種類」を参照してください。

  • ストレージ アカウントのファイアウォール規則はまだサポートされていません。 詳細については、Azure Storage ファイアウォールおよび仮想ネットワークの構成に関する記事を参照してください。

  • デプロイ プリンシパルには、ストレージ アカウントを管理するための権限が必要です。これには、ファイル共有の読み取り、作成、削除が含まれます。 詳細については、「最低限のアクセス許可を構成する」を参照してください。

既存のストレージ アカウントを指定するには、次の Bicep コードを Microsoft.Resources/deploymentScripts のプロパティ要素に追加します。

param storageAccountName string = 'myStorageAccount'

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  ...
  properties: {
    ...
    storageAccountSettings: {
      storageAccountName: storageAccountName
      storageAccountKey: listKeys(resourceId('Microsoft.Storage/storageAccounts', storageAccountName), '2023-01-01').keys[0].value
    }
  }
}

完全な Microsoft.Resources/deploymentScripts 定義のサンプルについては、この記事で前述する「構文」を参照してください。

既存のストレージ アカウントを使用すると、スクリプト サービスが一意の名前を持つファイル共有を作成します。 スクリプト サービスがファイル共有をクリーンアップする方法については、この記事で後述する「デプロイ スクリプト リソースのクリーンアップ」を参照してください。

コンテナー インスタンスを構成する

デプロイ スクリプトには、新しい Azure コンテナー インスタンスが必要です。 既存のコンテナー インスタンスは指定できません。 ただし、containerGroupName を使用してコンテナーのグループ名をカスタマイズできます。 グループ名を指定しない場合は、自動的に生成されます。 このコンテナー インスタンスを作成するには、追加の構成が必要です。 詳細については、「最低限のアクセス許可を構成する」を参照してください。

プライベート ネットワークでデプロイ スクリプトを実行するための subnetId 値を指定することもできます。 詳細については、「プライベート仮想ネットワークにアクセスする」を参照してください。

param containerGroupName string = 'mycustomaci'
param subnetId string = '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/mySubnet'

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  ...
  properties: {
    ...
    containerSettings: {
      containerGroupName: containerGroupName
      subnetIds: [
        {
          id: subnetId
        }
      ]
    }
  }
}

スクリプトを複数回実行する

デプロイ スクリプトの実行はべき等操作です。 インライン スクリプトを含むどの deploymentScripts リソース プロパティにも変更がない場合、Bicep ファイルを再デプロイしてもスクリプトは実行されません。

デプロイ スクリプト サービスは、Bicep ファイル内のリソース名と同じリソース グループ内の既存のリソースを比較します。 同じデプロイ スクリプトを複数回実行する場合は、次の 2 つのオプションがあります。

  • deploymentScripts リソースの名前を変更します。 たとえば、utcNow 関数をリソース名として使用するか、リソース名の一部として使用します。 utcNow 関数はパラメーターの既定値でのみ使用できます。

    リソース名を変更すると、新しい deploymentScripts リソースが作成されます。 これは、スクリプトの実行履歴を保持するのに適しています。

  • forceUpdateTag プロパティに別の値を指定してください。 たとえば、値として utcNow を使用します。

べき等性を確保するためにデプロイ スクリプトを作成すると、誤って再実行してもシステムが変更されることはありません。 たとえば、デプロイ スクリプトを使って Azure リソースを作成する場合、作成前に当該リソースが存在しないことを検証することで、スクリプトが成功することを保証するか、冗長なリソースの作成を防止します。

デプロイ スクリプト内で Microsoft Graph を使用する

配置スクリプトで Microsoft Graph を使用して、Microsoft Entra ID 内のオブジェクトを作成および操作できます。

コマンド

Azure CLI デプロイ スクリプトを使用すると、az ad コマンド グループ内のコマンドを使用して、アプリケーション、サービス プリンシパル、グループ、ユーザーを操作できます。 az rest コマンドを使用して Microsoft Graph API を直接呼び出すこともできます。

Azure PowerShell デプロイ スクリプトを使用する場合、Invoke-RestMethod コマンドレットを使用して、Microsoft Graph API を直接呼び出すことができます。

アクセス許可

デプロイ スクリプトが使用する ID が Microsoft Graph API を操作できるよう許可する必要があり、実行する操作用の適切な権限を付与する必要があります。 ユーザー割り当てマネージド ID を事前に作成し、Microsoft Graph のアプリ ロールを割り当てるなどして、Bicep ファイルの外部で ID を許可する必要があります。 詳細については、こちらのクイックスタートの例を参照してください。

デプロイ スクリプト リソースのクリーンアップ

障害により削除された場合を除き、2 つの自動で作成されるサポート リソースが deploymentScript リソースよりも長く保持されることはありません。 cleanupPreference プロパティはサポート リソースのライフ サイクルを制御します。 retentionInterval プロパティは deploymentScript リソースのライフ サイクルを制御します。 これらのプロパティを使用する方法を次に示します。

  • cleanupPreference: スクリプトの実行が終了状態になった時に、2 つのサポート リソースをクリーンアップする方法を指定します。 サポートされる値は次のとおりです。

    • Always: スクリプトの実行が終了状態になった後で、2 つのサポート リソースを削除します。 既存のストレージ アカウントを使用する場合、スクリプト サービスはサービスが作成したファイル共有を削除します。 サポート リソースがクリーンアップされた後も deploymentScripts リソースがまだ存在する場合があるため、リソースが削除されるまで、スクリプト サービスはスクリプトの実行結果 (stdout など)、出力、戻り値を保持します。

    • OnSuccess: スクリプトの実行が成功した場合にのみ、2 つのサポート リソースを削除します。 既存のストレージ アカウントを使用する場合、スクリプトの実行が成功した場合にのみ、スクリプト サービスはファイル共有を削除します。

      スクリプトの実行が成功しなかった場合、スクリプト サービスは retentionInterval 値の有効期限が切れるのを待機してからサポート リソースのクリーンアップを行い、その後デプロイ スクリプト リソースをクリーンアップします。

    • OnExpiration: retentionInterval 設定の有効期限が切れている場合にのみ、2 つのサポート リソースを削除します。 既存のストレージ アカウントを使用する場合、スクリプト サービスはファイル共有を削除しますが、ストレージ アカウントは保持します。

    コンテナー インスタンスとストレージ アカウントは cleanupPreference 値に従って削除されます。 ただし、スクリプトが失敗し、cleanupPreferenceAlways に設定されていない場合、コンテナーはデプロイ プロセスによって自動的に 1 時間またはコンテナーがクリーンアップされるまで実行されたままになります。 この時間を使用して、スクリプトのトラブルシューティングを行うことができます。

    デプロイが成功した後もコンテナーを実行したままにする場合は、スクリプトにスリープ ステップを追加します。 たとえば、スクリプトの最後に Start-Sleep を追加します。 スリープ ステップを追加しないと、コンテナーは終了状態に設定され、まだ削除していない場合でもアクセスできなくなります。

  • retentionInterval: 有効期限切れや削除になるまで deploymentScript リソースを保持する期間を指定します。

Note

スクリプト サービスが生成するストレージ アカウントやコンテナー インスタンスは、他の目的に使用しないことをお勧めします。 この 2 つのリソースは、スクリプトのライフ サイクルに応じて削除される場合があります。

次のステップ

この記事では、デプロイ スクリプト リソースを作成する方法について学習しました。 詳細については、以下を参照してください。