ARM テンプレートでデプロイ スクリプトを使用する

Azure Resource Manager (ARM) テンプレートでデプロイ スクリプトを使用する方法を説明します。 deploymentScripts リソースを使用すると、ARM デプロイでスクリプトを実行して、実行結果を確認できます。

ヒント

ARM テンプレートと同じ機能を備え、構文も使いやすいため、Bicep をお勧めします。 詳細については、「デプロイ スクリプト」を参照してください。

これらのスクリプトは、次のようなカスタム手順を実行するために使用できます。

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

デプロイ スクリプトの利点は次のとおりです。

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

デプロイ スクリプト リソースは、Azure Container Instance が使用可能なリージョンでのみ使用できます。 「Azure リージョンの Azure Container Instances のリソースの可用性」を参照してください。 現在、デプロイ スクリプトにはパブリック ネットワークのみが使用されています。

重要

デプロイ スクリプト サービスでは、スクリプトの実行とトラブルシューティングのために、ストレージ アカウントとコンテナー インスタンスという 2 つのサポート リソースが必要になります。です。 既存のストレージ アカウントを指定できます。指定しない場合は、スクリプト サービスによってストレージ アカウントが作成されます。 自動で作成される 2 つのサポート リソースは通常、デプロイ スクリプトの実行が終了状態になったときに、スクリプト サービスによって削除されます。 サポート リソースは、削除されるまで請求の対象になります。 価格情報については、「Container Instances の価格」と「Azure Storage の料金」を参照してください。 詳細については、「デプロイ スクリプト リソースのクリーンアップ」を参照してください。

Note

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

トレーニング リソース

デプロイ スクリプトについてステップバイステップ ガイダンスを通じて学習する場合は、「デプロイ スクリプトを使用して ARM テンプレートを拡張する」を参照してください。

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

デプロイ スクリプトの API バージョン 2020-10-01 以降では、デプロイ スクリプトの実行に 2 つのプリンシパルが関係します。

  • デプロイ プリンシパル (テンプレートのデプロイに使用されるプリンシパル): デプロイ スクリプト リソースの実行に必要な基になるリソース (ストレージ アカウントと 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 Instance のリソース プロバイダーが登録されていない場合は、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 オペレーター ロール (組み込みロール) が必要です。

サンプル テンプレート

次の JSON は例です。 詳細については、最新のテンプレート スキーマを参照してください。

{
  "type": "Microsoft.Resources/deploymentScripts",
  "apiVersion": "2020-10-01",
  "name": "runPowerShellInline",
  "location": "[resourceGroup().location]",
  "tags": {
    "tagName1": "tagValue1",
    "tagName2": "tagValue2"
  },
  "kind": "AzurePowerShell", // or "AzureCLI"
  "identity": {
    "type": "userAssigned",
    "userAssignedIdentities": {
      "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myID": {}
    }
  },
  "properties": {
    "forceUpdateTag": "1",
    "containerSettings": {
      "containerGroupName": "mycustomaci"
    },
    "storageAccountSettings": {
      "storageAccountName": "myStorageAccount",
      "storageAccountKey": "myKey"
    },
    "azPowerShellVersion": "9.7",  // or "azCliVersion": "2.47.0",
    "arguments": "-name \\\"John Dole\\\"",
    "environmentVariables": [
      {
        "name": "UserName",
        "value": "jdole"
      },
      {
        "name": "Password",
        "secureValue": "jDolePassword"
      }
    ],
    "scriptContent": "
      param([string] $name)
      $output = 'Hello {0}. The username is {1}, the password is {2}.' -f $name,${Env:UserName},${Env:Password}
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
    ", // or "primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",
    "supportingScriptUris":[],
    "timeout": "PT30M",
    "cleanupPreference": "OnSuccess",
    "retentionInterval": "P1D"
  }
}

Note

この例は、デモンストレーション用です。 1 つのテンプレートでプロパティ scriptContentprimaryScriptUri の両方を指定することはできません。

Note

scriptContent には、複数の行を含むスクリプトが表示されます。 Azure portal および Azure DevOps パイプラインで複数行のデプロイ スクリプトを解析することはできません。 セミコロン、\r\n、または \n を使用して PowerShell コマンドを 1 行にチェーンするか、外部のスクリプト ファイルで primaryScriptUri プロパティを使用することができます。 利用可能な無料の JSON 文字列エスケープ/エスケープ解除ツールが多数あります。 たとえば、「https://www.freeformatter.com/json-escape.html」のように入力します。

プロパティ値の詳細:

  • identity: デプロイ スクリプト API バージョン2020-10-01 以降では、スクリプトで Azure 固有のアクションを実行する必要がない限り、ユーザー割り当てマネージド ID は省略可能です。 API バージョン 2019-10-01-preview では、デプロイ スクリプト サービスでスクリプトを実行するために使用されるため、マネージド ID が必要です。 ID プロパティを指定すると、スクリプト サービスはユーザー スクリプトを呼び出す前に Connect-AzAccount -Identity を呼び出します。 現時点では、ユーザー割り当てマネージド ID のみがサポートされています。 別の ID を使ってログインするには、スクリプト内で Connect-AzAccount を呼び出します。

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

  • kind: スクリプトの種類を指定します。 現在、Azure PowerShell および Azure CLI のスクリプトがサポートされています。 値は、AzurePowerShellAzureCLI です。

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

  • containerSettings:Azure Container Instance をカスタマイズするための設定を指定します。 デプロイ スクリプトには、新しい Azure Container Instance が必要です。 既存の Azure Container Instance は指定できません。 ただし、containerGroupName を使用して、コンテナー グループ名をカスタマイズできます。 指定しない場合、グループ名は自動的に生成されます。

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

  • azPowerShellVersion/azCliVersion:使用するモジュールのバージョンを指定します。 サポートされている Azure PowerShell バージョンの一覧を参照してください。 バージョンによって、使用するコンテナー イメージが決まります。

    • 9 以上の Az バージョンでは、Ubuntu 22.04 が使用されます。
    • 6 以上、9 未満の Az バージョンでは、Ubuntu 20.04 が使用されます。
    • 6 未満の Az バージョンでは、Ubuntu 18.04 が使用されます。

    重要

    Ubuntu 18.04 のサポート終了日が近づいており、2023 年 5 月 31 日以降はセキュリティ アップデートが提供されなくなるため、最新バージョンへのアップグレードが推奨されています。

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

    重要

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

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

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

    引数にエスケープ文字が含まれている場合は JsonEscaper を使用して、文字をダブル エスケープします。 元のエスケープされた文字列をそのツールに貼り付け、 [エスケープ] を選択します。 ツールにより、ダブル エスケープされた文字列が出力されます。 たとえば、前のサンプル テンプレートの引数は -name \"John Dole\" です。 エスケープされた文字列は -name \\\"John Dole\\\" です。

    オブジェクト型の ARM テンプレート パラメーターを引数として渡すには、string () 関数を使用してオブジェクトを文字列に変換してから、replace () 関数を使用してすべての \"\\\" に置き換えます。 例:

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

    詳細については、サンプル テンプレートを参照してください。

  • environmentVariables:スクリプトに渡す環境変数を指定します。 詳細については、「デプロイ スクリプトを開発する」を参照してください。

  • scriptContent:スクリプトの内容を指定します。 外部スクリプトを実行するには、代わりに primaryScriptUri を使用します。 例については、「インライン スクリプトを使用する」および「外部スクリプトを使用する」を参照してください。

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

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

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

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

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

その他のサンプル

  • サンプル 1: キー コンテナーを作成し、デプロイ スクリプトを使用してキー コンテナーに証明書を割り当てます。
  • サンプル 2: サブスクリプション レベルでリソース グループを作成し、リソース グループにキー コンテナーを作成した後、デプロイ スクリプトを使用して、キー コンテナーに証明書を割り当てます。
  • サンプル 3: ユーザー割り当てマネージド ID を作成し、リソース グループ レベルで ID に共同作成者ロールを割り当てて、キー コンテナーを作成した後、デプロイ スクリプトを使用してキー コンテナーに証明書を割り当てます。
  • サンプル 4: この一覧のサンプル 1 と同じシナリオです。 デプロイ スクリプトを実行するために新しいリソース グループが作成されます。 このテンプレートは、サブスクリプション レベルのテンプレートです。
  • サンプル 5: サンプル 4 と同じシナリオです。 このテンプレートは、リソース グループ レベルのテンプレートです。
  • サンプル 6: ユーザー割り当てマネージド ID を手動で作成し、Microsoft Graph API を使用して Microsoft Entra アプリケーションを作成するためのアクセス許可を割り当てます。ARM テンプレートで、デプロイ スクリプトを使用して Microsoft Entra アプリケーションとサービス プリンシパルを作成し、オブジェクト ID とクライアント ID を出力します。

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

次のテンプレートには、Microsoft.Resources/deploymentScripts の種類で定義されたリソースが 1 つあります。 強調表示されている部分は、インライン スクリプトです。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string",
      "defaultValue": "\\\"John Dole\\\""
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "runPowerShellInlineWithOutput",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "scriptContent": "
          param([string] $name)
          $output = \"Hello {0}\" -f $name
          Write-Output $output
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $output
        ",
        "arguments": "[concat('-name', ' ', parameters('name'))]",
        "timeout": "PT1H",
        "cleanupPreference": "OnSuccess",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "result": {
      "value": "[reference('runPowerShellInlineWithOutput').outputs.text]",
      "type": "string"
    }
  }
}

Note

インライン デプロイ スクリプトは二重引用符で囲まれているため、デプロイ スクリプト内の文字列は、円記号 (\) を使用してエスケープするか、単一引用符で囲む必要があります。 前の JSON サンプルに示されているように、文字列の置換を使用することを検討することもできます。

このスクリプトは、1 つのパラメーターを受け取り、パラメーター値を出力します。 DeploymentScriptOutputs は、出力を格納するために使用されます。 出力セクションのvalueの線は、格納されている値にアクセスする方法を示しています。 Write-Output はデバッグ目的で使用されます。 出力ファイルにアクセスする方法については、「デプロイ スクリプトの監視とトラブルシューティング」を参照してください。 プロパティの説明については、「サンプル テンプレート」を参照してください。

スクリプトを実行するには、 [試してみる] を選択して Cloud Shell を開き、次のコードをシェル ウィンドウに貼り付けます。

$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 -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.json"

Write-Host "Press [ENTER] to continue ..."

出力は次のようになります。

Resource Manager テンプレート デプロイ スクリプトの

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

インライン スクリプトに加えて、外部スクリプト ファイルを使用することもできます。 ps1 ファイル拡張子を持つプライマリ PowerShell スクリプトのみがサポートされています。 CLI スクリプトの場合、スクリプトが有効な bash スクリプトである限り、プライマリ スクリプトには任意の拡張子を設定できます (または拡張子なしにできます)。 外部スクリプト ファイルを使用するには、scriptContentprimaryScriptUri に置き換えます。 次に例を示します。

"primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",

詳細については、テンプレートの例を参照してください。

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

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

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

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

"scriptContent": "
    ...
    ./Create-Cert.ps1
    ...
"

"supportingScriptUris": [
  "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/create-cert.ps1"
],

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

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

PowerShell スクリプトからの出力を操作する

次のテンプレートでは、2 つの deploymentScripts リソース間で値を渡す方法が示されています。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string",
      "defaultValue": "John Dole"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "scriptInTemplate1",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "timeout": "PT1H",
        "arguments": "[concat('-name', ' ', concat('\\\"', parameters('name'), '\\\"'))]",
        "scriptContent": "
          param([string] $name)
          $output = 'Hello {0}' -f $name
          Write-Output $output
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $output
        ",
        "cleanupPreference": "Always",
        "retentionInterval": "P1D"
      }
    },
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "scriptInTemplate2",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "dependsOn": [
        "scriptInTemplate1"
      ],
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "timeout": "PT1H",
        "arguments": "[concat('-textToEcho', ' ', concat('\\\"', reference('scriptInTemplate1').outputs.text, '\\\"'))]",
        "scriptContent": "
          param([string] $textToEcho)
          Write-Output $textToEcho
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $textToEcho
        ",
        "cleanupPreference": "Always",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "result": {
      "value": "[reference('scriptInTemplate2').outputs.text]",
      "type": "string"
    }
  }
}

最初のリソースでは、 $DeploymentScriptOutputs という名前の変数を定義し、それを使用して出力値を格納します。 テンプレート内の別のリソースから出力値にアクセスするには、次のように指定します。

reference('<ResourceName>').outputs.text

CLI スクリプトからの出力を操作する

Azure PowerShell デプロイ スクリプトとは対照的に、CLI/bash では、スクリプト出力を格納するための共通変数は公開されません。 代わりに、AZ_SCRIPTS_OUTPUT_PATH という名前の環境変数を使用して、スクリプト出力ファイルの場所を示します。 ARM テンプレート内でデプロイ スクリプトを実行すると、この Bash シェルによってこの環境変数が自動的に構成されます。 その定義済みの値は、/mnt/azscripts/azscriptoutput/scriptoutputs.json として設定されます。 その出力は、有効な JSON 文字列オブジェクト構造に準拠する必要があります。 そのファイルの内容は、キーと値のペアとして書式設定する必要があります。 たとえば、文字列の配列は、{ "MyResult": [ "foo", "bar"] } として保存する必要があります。 [ "foo", "bar" ] など、配列の結果のみを格納することは無効と見なされます。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "identity": {
      "type": "string"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "runBashWithOutputs",
      "location": "[resourceGroup().location]",
      "kind": "AzureCLI",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "[parameters('identity')]": {
          }
        }
      },
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "AzCliVersion": "2.40.0",
        "timeout": "PT30M",
        "arguments": "'foo' 'bar'",
        "environmentVariables": [
          {
            "name": "UserName",
            "value": "jdole"
          },
          {
            "name": "Password",
            "secureValue": "jDolePassword"
          }
        ],
        "scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo \"arg2 is: $2\"; echo \"Username is: $UserName\"; echo \"password is: $Password\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
        "cleanupPreference": "OnExpiration",
        "retentionInterval": "P1D"

前のサンプルでは、jq が使用されています。 これには、コンテナー イメージが付属しています。 「開発環境の設定」を参照してください。

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

スクリプト実行とトラブルシューティングには、ストレージ アカウントとコンテナー インスタンスが必要です。 既存のストレージ アカウントを指定するオプションがあります。指定しない場合は、コンテナー インスタンスと共にストレージ アカウントがスクリプト サービスによって自動的に作成されます。 既存のストレージ アカウントを使用するための要件は次のとおりです。

  • サポートされるストレージ アカウントの種類:

    SKU サポートされている種類
    Premium_LRS FileStorage
    Premium_ZRS FileStorage
    Standard_GRS Storage、StorageV2
    Standard_GZRS StorageV2
    Standard_LRS Storage、StorageV2
    Standard_RAGRS Storage、StorageV2
    Standard_RAGZRS StorageV2
    Standard_ZRS StorageV2

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

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

  • デプロイ プリンシパルには、ストレージ アカウントを管理するためのアクセス許可が必要です。これには、ファイル共有の読み取り、作成、削除が含まれます。

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

"storageAccountSettings": {
  "storageAccountName": "myStorageAccount",
  "storageAccountKey": "myKey"
},
  • storageAccountName: ストレージ アカウントの名前を指定します。

  • storageAccountKey : ストレージ アカウント キーのいずれかを指定します。 listKeys() 関数を使用して、キーを取得することができます。 次に例を示します。

    "storageAccountSettings": {
        "storageAccountName": "[variables('storageAccountName')]",
        "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value]"
    }
    

完全な Microsoft.Resources/deploymentScripts 定義のサンプルについては、「サンプル テンプレート」を参照してください。

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

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

終了しないエラーを処理する

デプロイ スクリプトで $ErrorActionPreference 変数を使用することで、終了しないエラーに PowerShell が対応する方法を制御できます。 この変数がデプロイ スクリプトに設定されていない場合、スクリプト サービスでは既定値 Continue が使用されます。

$ErrorActionPreference の設定に関係なく、デプロイ スクリプトでエラーが発生すると、スクリプト サービスによってリソースのプロビジョニングの状態が失敗に設定されます。

環境変数を使用する

デプロイ スクリプトでは、これらの環境変数を使用します。

環境変数 既定値 システムで予約済み
AZ_SCRIPTS_AZURE_ENVIRONMENT AzureCloud N
AZ_SCRIPTS_CLEANUP_PREFERENCE OnExpiration N
AZ_SCRIPTS_OUTPUT_PATH <AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY>/<AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME> Y
AZ_SCRIPTS_PATH_INPUT_DIRECTORY /mnt/azscripts/azscriptinput Y
AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY /mnt/azscripts/azscriptoutput Y
AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME Azure PowerShell: userscript.ps1; Azure CLI: userscript.sh Y
AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME primaryscripturi.config Y
AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME supportingscripturi.config Y
AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME scriptoutputs.json Y
AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME executionresult.json Y
AZ_SCRIPTS_USER_ASSIGNED_IDENTITY /subscriptions/ N

AZ_SCRIPTS_OUTPUT_PATH の使用に関する詳細については、「CLI スクリプトからの出力を操作する」を参照してください。

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

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

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

デプロイ スクリプトの監視とトラブルシューティング

スクリプト サービスは、ストレージ アカウント (既存のストレージ アカウントが指定されていない場合) と、スクリプト実行用のコンテナー インスタンスを作成します。 これらのリソースがスクリプト サービスによって自動的に作成される場合、両方のリソースには、リソース名に azscripts サフィックスが付けられます。

Resource Manager テンプレート デプロイ スクリプトのリソース名のスクリーンショット。

ユーザー スクリプト、実行結果、stdout ファイルは、ストレージ アカウントのファイル共有に格納されます。 azscripts という名前のフォルダーがあります。 このフォルダーには、azscriptinputazscriptoutput という、入力用と出力ファイル用の 2 つのフォルダーがあります。

出力フォルダーには、executionresult.json とスクリプトの出力ファイルが含まれています。 executionresult.json で、スクリプト実行のエラー メッセージを確認できます。 出力ファイルは、スクリプトが正常に実行された場合にのみ作成されます。 入力フォルダーには、システム用 PowerShell スクリプト ファイルとユーザー用デプロイ スクリプト ファイルが含まれています。 ユーザー用デプロイ スクリプトを変更したものに置き換え、Azure コンテナー インスタンスからデプロイ スクリプトを再実行することができます。

Azure ポータルの使用

デプロイ スクリプト リソースをデプロイすると、Azure portal のリソース グループの下にそのリソースが一覧表示されます。 次のスクリーンショットは、デプロイ スクリプト リソースの [概要] ページです。

Resource Manager テンプレート デプロイ スクリプトのポータルでの [概要] のスクリーンショット。

概要ページには、リソースの重要な情報が表示されます。たとえば、 [プロビジョニングの状態][ストレージ アカウント][コンテナー インスタンス][ログ] などです。

左側のメニューから、デプロイ スクリプトの内容、スクリプトに渡される引数、および出力を表示できます。 デプロイ スクリプトを含む、デプロイ スクリプトのテンプレートをエクスポートすることもできます。

PowerShell の使用

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

Get-AzDeploymentScript の出力は次のようになります。

Name                : runPowerShellInlineWithOutput
Id                  : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0618rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput
ResourceGroupName   : myds0618rg
Location            : centralus
SubscriptionId      : 01234567-89AB-CDEF-0123-456789ABCDEF
ProvisioningState   : Succeeded
Identity            : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/mydentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami
ScriptKind          : AzurePowerShell
AzPowerShellVersion : 9.7
StartTime           : 5/11/2023 7:46:45 PM
EndTime             : 5/11/2023 7:49:45 PM
ExpirationDate      : 5/12/2023 7:49:45 PM
CleanupPreference   : OnSuccess
StorageAccountId    : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0618rg/providers/Microsoft.Storage/storageAccounts/ftnlvo6rlrvo2azscripts
ContainerInstanceId : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0618rg/providers/Microsoft.ContainerInstance/containerGroups/ftnlvo6rlrvo2azscripts
Outputs             :
                      Key                 Value
                      ==================  ==================
                      text                Hello John Dole

RetentionInterval   : P1D
Timeout             : PT1H

Azure CLI の使用

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

list コマンドの出力は次のようになります。

[
  {
    "arguments": "'foo' 'bar'",
    "azCliVersion": "2.40.0",
    "cleanupPreference": "OnExpiration",
    "containerSettings": {
      "containerGroupName": null
    },
    "environmentVariables": null,
    "forceUpdateTag": "20231101T163748Z",
    "id": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runBashWithOutputs",
    "identity": {
      "tenantId": "01234567-89AB-CDEF-0123-456789ABCDEF",
      "type": "userAssigned",
      "userAssignedIdentities": {
        "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/myidentity/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
          "clientId": "01234567-89AB-CDEF-0123-456789ABCDEF",
          "principalId": "01234567-89AB-CDEF-0123-456789ABCDEF"
        }
      }
    },
    "kind": "AzureCLI",
    "location": "centralus",
    "name": "runBashWithOutputs",
    "outputs": {
      "Result": [
        {
          "id": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/mytest/providers/Microsoft.KeyVault/vaults/mykv1027",
          "resourceGroup": "mytest"
        }
      ]
    },
    "primaryScriptUri": null,
    "provisioningState": "Succeeded",
    "resourceGroup": "mytest",
    "retentionInterval": "1 day, 0:00:00",
    "scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
    "status": {
      "containerInstanceId": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/mytest/providers/Microsoft.ContainerInstance/containerGroups/eg6n7wvuyxn7iazscripts",
      "endTime": "2023-11-01T16:39:12.080950+00:00",
      "error": null,
      "expirationTime": "2023-11-02T16:39:12.080950+00:00",
      "startTime": "2023-11-01T16:37:53.139700+00:00",
      "storageAccountId": null
    },
    "storageAccountSettings": {
      "storageAccountKey": null,
      "storageAccountName": "dsfruro267qwb4i"
    },
    "supportingScriptUris": null,
    "systemData": {
      "createdAt": "2023-10-31T19:06:57.060909+00:00",
      "createdBy": "someone@contoso.com",
      "createdByType": "User",
      "lastModifiedAt": "2023-11-01T16:37:51.859570+00:00",
      "lastModifiedBy": "someone@contoso.com",
      "lastModifiedByType": "User"
    },
    "tags": null,
    "timeout": "0:30:00",
    "type": "Microsoft.Resources/deploymentScripts"
  }
]

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 login
armclient get /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/myrg/providers/microsoft.resources/deploymentScripts/myDeployementScript?api-version=2020-10-01

次のように出力されます。

{
  "kind": "AzurePowerShell",
  "identity": {
    "type": "userAssigned",
    "tenantId": "01234567-89AB-CDEF-0123-456789ABCDEF",
    "userAssignedIdentities": {
      "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myidentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
        "principalId": "01234567-89AB-CDEF-0123-456789ABCDEF",
        "clientId": "01234567-89AB-CDEF-0123-456789ABCDEF"
      }
    }
  },
  "location": "centralus",
  "systemData": {
    "createdBy": "someone@contoso.com",
    "createdByType": "User",
    "createdAt": "2023-05-11T02:59:04.7501955Z",
    "lastModifiedBy": "someone@contoso.com",
    "lastModifiedByType": "User",
    "lastModifiedAt": "2023-05-11T02:59:04.7501955Z"
  },
  "properties": {
    "provisioningState": "Succeeded",
    "forceUpdateTag": "20220625T025902Z",
    "azPowerShellVersion": "9.7",
    "scriptContent": "\r\n          param([string] $name)\r\n          $output = \"Hello {0}\" -f $name\r\n          Write-Output $output\r\n          $DeploymentScriptOutputs = @{}\r\n          $DeploymentScriptOutputs['text'] = $output\r\n        ",
    "arguments": "-name \\\"John Dole\\\"",
    "retentionInterval": "P1D",
    "timeout": "PT1H",
    "containerSettings": {},
    "status": {
      "containerInstanceId": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.ContainerInstance/containerGroups/64lxews2qfa5uazscripts",
      "storageAccountId": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.Storage/storageAccounts/64lxews2qfa5uazscripts",
      "startTime": "2023-05-11T02:59:07.5951401Z",
      "endTime": "2023-05-11T03:00:16.7969234Z",
      "expirationTime": "2023-05-12T03:00:16.7969234Z"
    },
    "outputs": {
      "text": "Hello John Dole"
    },
    "cleanupPreference": "OnSuccess"
  },
  "id": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput",
  "type": "Microsoft.Resources/deploymentScripts",
  "name": "runPowerShellInlineWithOutput"
}

次の REST API では、ログが返されます。

/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>/logs?api-version=2020-10-01

デプロイ スクリプト リソースが削除される前にのみ機能します。

ポータルで deploymentScripts リソースを表示するには、 [非表示の型の表示] を選択します。

Resource Manager テンプレート デプロイ スクリプトのポータルでの [非表示の型の表示] オプションのスクリーンショット。

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

削除が失敗した場合を除き、2 つの自動で作成されるサポート リソースが deploymentScript リソースよりも長く保持されることはありません。 サポート リソースのライフ サイクルは cleanupPreference プロパティによって管理され、deploymentScript リソースのライフ サイクルは retentionInterval プロパティによって管理されます。

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

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

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

      スクリプトの実行が正常に完了しない場合、スクリプト サービスは retentionInterval が経過するまで待ってから、サポート リソース、デプロイ スクリプト リソースの順にクリーンアップします。

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

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

  • retentionInterval: deploymentScript リソースを保持する期間を指定します。この時間が経過すると、期限が切れて削除されます。

Note

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

CanNotDelete ロックを使用してデプロイ スクリプトがリソース グループにデプロイされている場合、自動的に作成されたストレージ アカウントとコンテナー インスタンスを削除することはできません。 この問題を解決するには、ロックなしでデプロイ スクリプトを別のリソース グループにデプロイします。 「サンプル テンプレート」のサンプル 4 とサンプル 5 を参照してください。

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

デプロイ スクリプトの実行はべき等操作です。 deploymentScripts リソースのどのプロパティ (インライン スクリプトを含む) も変更されていない場合は、テンプレートを再デプロイしてもスクリプトは実行されません。 デプロイ スクリプト サービスは、テンプレート内のリソース名と同じリソース グループ内の既存のリソースを比較します。 同じデプロイ スクリプトを複数回実行する場合は、次の 2 つのオプションがあります。

  • deploymentScripts リソースの名前を変更します。 たとえば、utcNow テンプレート関数をリソース名として使用するか、リソース名の一部として使用します。 リソース名を変更すると、新しい deploymentScripts リソースが作成されます。 これは、スクリプトの実行履歴を保持するのに適しています。

    Note

    utcNow 関数は、パラメーターの既定値でのみ使用できます。

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

Note

べき等であるデプロイ スクリプトを記述します。 それにより、誤って再び実行されることがあっても、システム変更が引き起こされません。 たとえば、デプロイ スクリプトを使用して Azure リソースを作成する場合は、スクリプトが成功するか、リソースが再度作成されないよう、作成する前にリソースが存在しないことを確認してください。

開発環境の設定

デプロイ スクリプトの開発環境として、事前構成済みのコンテナー イメージを使用できます。 詳細については、「Configure development environment for deployment scripts in templates」(テンプレートでデプロイ スクリプトの開発環境を構成する) を参照してください。

テストが正常に完了したスクリプトは、テンプレート内のデプロイ スクリプトとして使用できます。

デプロイ スクリプトのエラー コード

エラー コード 説明
DeploymentScriptInvalidOperation テンプレートのデプロイ スクリプト リソース定義に、無効なプロパティ名が含まれています。
DeploymentScriptResourceConflict 終了していない状態で、かつ実行が 1 時間を超えていないデプロイ スクリプト リソースは削除できません。 または、リソース識別子は同じ (サブスクリプション、リソース グループ名、リソース名は同じ) だが、スクリプト本文のコンテンツが異なる同じデプロイ スクリプトを同時に再実行することはできません。
DeploymentScriptOperationFailed 内部でデプロイ スクリプトの操作が失敗しました。 Microsoft サポートにお問い合わせください
DeploymentScriptStorageAccountAccessKeyNotSpecified 既存のストレージ アカウントにアクセス キーが指定されていません。
DeploymentScriptContainerGroupContainsInvalidContainers デプロイ スクリプト サービスによって作成されたコンテナー グループが外部で変更され、無効なコンテナーが追加されました。
DeploymentScriptContainerGroupInNonterminalState 2 つ以上のデプロイ スクリプト リソースによって、同じリソース グループ内で同じ Azure コンテナー インスタンス名が使用されており、そのうちの 1 つでまだ実行が完了していません。
DeploymentScriptStorageAccountInvalidKind BlobBlobStorage または BlobStorage 型の既存のストレージ アカウントはファイル共有をサポートしていないため、使用できません。
DeploymentScriptStorageAccountInvalidKindAndSku 既存のストレージ アカウントではファイル共有はサポートされていません。 サポートされているストレージ アカウントの種類の一覧については、「既存のストレージ アカウントを使用する」を参照してください。
DeploymentScriptStorageAccountNotFound ストレージ アカウントが存在しないか、外部のプロセスまたはツールによって削除されています。
DeploymentScriptStorageAccountWithServiceEndpointEnabled 指定されたストレージ アカウントには、サービス エンドポイントがあります。 サービス エンドポイントを持つストレージ アカウントはサポートされていません。
DeploymentScriptStorageAccountInvalidAccessKey 既存のストレージ アカウントに無効なアクセス キーが指定されています。
DeploymentScriptStorageAccountInvalidAccessKeyFormat ストレージ アカウント キーの形式が無効です。 「ストレージ アカウント アクセス キーを管理する」をご覧ください。
DeploymentScriptExceededMaxAllowedTime デプロイ スクリプトの実行時間が、デプロイ スクリプトのリソース定義で指定されているタイムアウト値を超えました。
DeploymentScriptInvalidOutputs デプロイ スクリプトの出力が有効な JSON オブジェクトではありません。
DeploymentScriptContainerInstancesServiceLoginFailure ユーザー割り当てマネージド ID によって、1 分間隔で 10 回ログインが試行されましたが、サインインできませんでした。
DeploymentScriptContainerGroupNotFound デプロイ スクリプト サービスによって作成されたコンテナー グループは、外部ツールまたはプロセスによって削除されました。
DeploymentScriptDownloadFailure サポート スクリプトをダウンロードできませんでした。 「サポート スクリプトを使用する」を参照してください。
DeploymentScriptError ユーザー スクリプトがエラーをスローしました。
DeploymentScriptBootstrapScriptExecutionFailed ブートストラップ スクリプトがエラーをスローしました。 ブートストラップ スクリプトは、デプロイ スクリプトの実行を調整するシステム スクリプトです。
DeploymentScriptExecutionFailed デプロイ スクリプトの実行中に不明なエラーが発生しました。
DeploymentScriptContainerInstancesServiceUnavailable Azure Container Instances (ACI) を作成するときに、ACI がサービス利用不可エラーをスローしました。
DeploymentScriptContainerGroupInNonterminalState Azure Container Instances (ACI) を作成するときに、別のデプロイ スクリプトが同じスコープ (同じサブスクリプション、リソース グループ名、リソース名) で同じ ACI 名を使用しています。
DeploymentScriptContainerGroupNameInvalid 指定された Azure Container Instances (ACI) 名は、ACI の要件を満たしていません。 「Azure Container Instances における、トラブルシューティングに関する一般的問題」を参照してください。

デプロイ スクリプト内で 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 のアプリ ロールを割り当てるなどして、テンプレートのデプロイの外部で ID を承認する必要があります。 詳細については、こちらのクイックスタートの例を参照してください。

プライベート仮想ネットワークへのアクセス

Microsoft.Resources/deploymentScripts バージョン 2023-08-01 では、いくつかの追加の構成を使って、プライベート ネットワーク内で配置スクリプトを実行できます。

  • ユーザー割り当てマネージド ID を作成して、それを identity プロパティに指定します。 ID を割り当てるには、Identity を参照してください。

  • true に設定されている allowSharedKeyAccess を使用してストレージアカウントを作成し、既存のストレージ アカウントを使用するようにデプロイ スクリプトを指定します。 既存のストレージ アカウントを指定するには、「既存のストレージ アカウントを使用する」を参照してください。 ストレージ アカウントでは、追加の構成が必要です。

    1. Azure portal でストレージ アカウントを開きます。

    2. 左側のメニューの [アクセス制御 (IAM)] を選択し、[ロールの割り当て] タブを選択します。

    3. ユーザー割り当てマネージド ID に Storage File Data Privileged Contributor ロールを追加します。

    4. 左側のメニューの [セキュリティとネットワーク] で、[ネットワーク] を選択し、[ファイアウォールと仮想ネットワーク] を選択します。

    5. [選択した仮想ネットワークと IP アドレスから有効] を選択します。

      プライベート ネットワークにアクセスするためのストレージ アカウントの構成のスクリーンショット。

    6. [仮想ネットワーク] で、サブネットを追加します。 スクリーンショットでは、サブネットは dspvnVnet という名前です。

    7. [例外][Allow Azure services on the trusted services list to access this storage account]\(信頼されたサービスの一覧の Azure サービスにこのストレージアカウントへのアクセスを許可する\) を選択します。

次の ARM テンプレートは、配置スクリプトを実行するための環境を構成する方法を示しています。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {
      "type": "string",
      "maxLength": 10
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "userAssignedIdentityName": {
      "type": "string",
      "defaultValue": "[format('{0}Identity', parameters('prefix'))]"
    },
    "storageAccountName": {
      "type": "string",
      "defaultValue": "[format('{0}stg{1}', parameters('prefix'), uniqueString(resourceGroup().id))]"
    },
    "vnetName": {
      "type": "string",
      "defaultValue": "[format('{0}Vnet', parameters('prefix'))]"
    },
    "subnetName": {
      "type": "string",
      "defaultValue": "[format('{0}Subnet', parameters('prefix'))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2023-09-01",
      "name": "[parameters('vnetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "10.0.0.0/16"
          ]
        },
        "enableDdosProtection": false,
        "subnets": [
          {
            "name": "[parameters('subnetName')]",
            "properties": {
              "addressPrefix": "10.0.0.0/24",
              "serviceEndpoints": [
                {
                  "service": "Microsoft.Storage"
                }
              ],
              "delegations": [
                {
                  "name": "Microsoft.ContainerInstance.containerGroups",
                  "properties": {
                    "serviceName": "Microsoft.ContainerInstance/containerGroups"
                  }
                }
              ]
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "networkAcls": {
          "bypass": "AzureServices",
          "virtualNetworkRules": [
            {
              "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]",
              "action": "Allow",
              "state": "Succeeded"
            }
          ],
          "defaultAction": "Deny"
        },
        "allowSharedKeyAccess": true
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]"
      ]
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-07-31-preview",
      "name": "[parameters('userAssignedIdentityName')]",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Storage/storageAccounts/{0}', parameters('storageAccountName'))]",
      "name": "[guid(tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd'), resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), '2023-07-31-preview').principalId]",
        "roleDefinitionId": "[tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName'))]"
      ]
    }
  ]
}

次の ARM テンプレートを使って、配置をテストできます。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    },
    "storageAccountName": {
      "type": "string"
    },
    "vnetName": {
      "type": "string"
    },
    "subnetName": {
      "type": "string"
    },
    "userAssignedIdentityName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2023-08-01",
      "name": "[format('{0}DS', parameters('prefix'))]",
      "location": "[parameters('location')]",
      "identity": {
        "type": "userAssigned",
        "userAssignedIdentities": {
          "[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')))]": {}
        }
      },
      "kind": "AzureCLI",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azCliVersion": "2.47.0",
        "storageAccountSettings": {
          "storageAccountName": "[parameters('storageAccountName')]"
        },
        "containerSettings": {
          "subnetIds": [
            {
              "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]"
            }
          ]
        },
        "scriptContent": "echo \"Hello world!\"",
        "retentionInterval": "P1D",
        "cleanupPreference": "OnExpiration"
      }
    }
  ]
}

次のステップ

この記事では、デプロイ スクリプトの使用方法について学習しました。 デプロイ スクリプトのチュートリアルを詳しく見るには、次を確認してください。