ARM テンプレートでデプロイ スクリプトの開発環境を構成する

デプロイ スクリプト イメージを使用して ARM テンプレートのデプロイ スクリプトを開発およびテストするための開発環境を作成する方法を学習します。 Azure コンテナー インスタンスを作成することも、Docker を使用することもできます。 この記事では、両方のオプションについて説明します。

前提条件

Azure PowerShell コンテナー

Azure PowerShell デプロイ スクリプトがない場合は、次の内容を使用して hello.ps1 ファイルを作成できます。

param([string] $name)
$output = 'Hello {0}' -f $name
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output

Azure CLI コンテナー

Azure CLI コンテナー イメージの場合は、次の内容を使用して hello.sh ファイルを作成できます。

FIRSTNAME=$1
LASTNAME=$2
OUTPUT="{\"name\":{\"displayName\":\"$FIRSTNAME $LASTNAME\",\"firstName\":\"$FIRSTNAME\",\"lastName\":\"$LASTNAME\"}}"
echo -n "Hello "
echo $OUTPUT | jq -r '.name.displayName'

Note

Azure CLI デプロイ スクリプトを実行すると、AZ_SCRIPTS_OUTPUT_PATH という環境変数にスクリプト出力ファイルの場所が格納されます。 環境変数は、開発環境のコンテナーでは使用できません。 Azure CLI 出力の操作の詳細については、「CLI スクリプトからの出力を操作する」を参照してください。

Azure PowerShell コンテナー インスタンスを使用する

ご自身のコンピューターでスクリプトを作成するには、ストレージ アカウントを作成し、そのストレージ アカウントをコンテナー インスタンスにマウントする必要があります。 これにより、スクリプトをストレージ アカウントにアップロードし、コンテナー インスタンスでスクリプトを実行できるようになります。

Note

スクリプトをテストするために作成するストレージ アカウントは、スクリプトを実行するためにデプロイ スクリプト サービスで使用されるストレージ アカウントと同じではありません。 デプロイ スクリプト サービスは、実行のたびに、ファイル共有として一意の名前を作成します。

Azure PowerShell コンテナー インスタンスを作成する

次の Azure Resource Manager テンプレート (ARM テンプレート) は、コンテナー インスタンスとファイル共有を作成し、ファイル共有をコンテナー イメージにマウントします。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specify a project name that is used for generating resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the resource location."
      }
    },
    "containerImage": {
      "type": "string",
      "defaultValue": "mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7",
      "metadata": {
        "description": "Specify the container image."
      }
    },
    "mountPath": {
      "type": "string",
      "defaultValue": "/mnt/azscripts/azscriptinput",
      "metadata": {
        "description": "Specify the mount path."
      }
    }
  },
  "variables": {
    "storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
    "fileShareName": "[format('{0}share', parameters('projectName'))]",
    "containerGroupName": "[format('{0}cg', parameters('projectName'))]",
    "containerName": "[format('{0}container', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
      "apiVersion": "2023-01-01",
      "name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2023-05-01",
      "name": "[variables('containerGroupName')]",
      "location": "[parameters('location')]",
      "properties": {
        "containers": [
          {
            "name": "[variables('containerName')]",
            "properties": {
              "image": "[parameters('containerImage')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGB": "[json('1.5')]"
                }
              },
              "ports": [
                {
                  "protocol": "TCP",
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "[parameters('mountPath')]"
                }
              ],
              "command": [
                "/bin/sh",
                "-c",
                "pwsh -c 'Start-Sleep -Seconds 1800'"
              ]
            }
          }
        ],
        "osType": "Linux",
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
              "readOnly": false,
              "shareName": "[variables('fileShareName')]",
              "storageAccountName": "[variables('storageAccountName')]",
              "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').keys[0].value]"
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    }
  ]
}

マウント パスの既定値は /mnt/azscripts/azscriptinput です。 これは、ファイル共有にマウントされるコンテナー インスタンス内のパスです。

テンプレートに指定されている既定のコンテナー イメージは mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7 です。 サポートされているすべての Azure PowerShell バージョンの一覧を参照してください。

このテンプレートでは、コンテナー インスタンスが 1,800 秒後に中断されます。 コンテナー インスタンスが終了状態になり、セッションが終了するまでの時間は 30 分間です。

テンプレートをデプロイするには、次の手順に従います。

$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName

デプロイ スクリプトをアップロードする

デプロイ スクリプトをストレージ アカウントにアップロードします。 PowerShell スクリプトの例を次に示します。

$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"

$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"

$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force

また、Azure portal または Azure CLI を使用してファイルをアップロードすることもできます。

デプロイ スクリプトをテストする

  1. Azure portal で、コンテナー インスタンスとストレージ アカウントをデプロイしたリソース グループを開きます。

  2. コンテナー グループを開きます。 既定のコンテナー グループ名は、プロジェクト名に cg が追加されたものです。 コンテナー インスタンスは実行状態になっています。

  3. リソース メニューで [コンテナー] を選択します。 コンテナー インスタンス名は、プロジェクト名に container が追加されたものです。

    Screenshot of the deployment script connect container instance option in the Azure portal.

  4. [接続] を選択し、次に [接続] を選択します。 コンテナー インスタンスに接続できない場合は、コンテナー グループを再起動して、もう一度試してみてください。

  5. コンソール ペインで、次のコマンドを実行します。

    cd /mnt/azscripts/azscriptinput
    ls
    pwsh ./hello.ps1 "John Dole"
    

    出力は Hello John Dole です。

    Screenshot of the deployment script connect container instance test output displayed in the console.

Azure CLI コンテナー インスタンスを使用する

ご自身のコンピューターでスクリプトを作成するには、ストレージ アカウントを作成し、そのストレージ アカウントをコンテナー インスタンスにマウントします。 これにより、スクリプトをストレージ アカウントにアップロードし、コンテナー インスタンスでスクリプトを実行できるようになります。

Note

スクリプトをテストするために作成するストレージ アカウントは、スクリプトを実行するためにデプロイ スクリプト サービスで使用されるストレージ アカウントと同じではありません。 デプロイ スクリプト サービスでは、実行のたびに、ファイル共有として一意の名前が作成されます。

Azure CLI コンテナー インスタンスを作成する

次の ARM テンプレートにより、コンテナー インスタンスとファイル共有が作成され、ファイル共有がコンテナー イメージにマウントされます。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specify a project name that is used for generating resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the resource location."
      }
    },
    "containerImage": {
      "type": "string",
      "defaultValue": "mcr.microsoft.com/azure-cli:2.9.1",
      "metadata": {
        "description": "Specify the container image."
      }
    },
    "mountPath": {
      "type": "string",
      "defaultValue": "/mnt/azscripts/azscriptinput",
      "metadata": {
        "description": "Specify the mount path."
      }
    }
  },
  "variables": {
    "storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
    "fileShareName": "[format('{0}share', parameters('projectName'))]",
    "containerGroupName": "[format('{0}cg', parameters('projectName'))]",
    "containerName": "[format('{0}container', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2023-05-01",
      "name": "[variables('containerGroupName')]",
      "location": "[parameters('location')]",
      "properties": {
        "containers": [
          {
            "name": "[variables('containerName')]",
            "properties": {
              "image": "[parameters('containerImage')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGB": "[json('1.5')]"
                }
              },
              "ports": [
                {
                  "protocol": "TCP",
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "[parameters('mountPath')]"
                }
              ],
              "command": [
                "/bin/bash",
                "-c",
                "echo hello; sleep 1800"
              ]
            }
          }
        ],
        "osType": "Linux",
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
              "readOnly": false,
              "shareName": "[variables('fileShareName')]",
              "storageAccountName": "[variables('storageAccountName')]",
              "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').keys[0].value]"
            }
          }
        ]
      },
      "dependsOn": [
        "storageAccount"
      ]
    }
  ]
}

マウント パスの既定値は /mnt/azscripts/azscriptinput です。 これは、ファイル共有にマウントされるコンテナー インスタンス内のパスです。

テンプレートに指定されている既定のコンテナー イメージは mcr.microsoft.com/azure-cli:2.9.1 です。 サポートされている Azure CLI バージョンの一覧を参照してください。

重要

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

このテンプレートでは、コンテナー インスタンスが 1,800 秒後に中断されます。 コンテナー インスタンスが終了状態になり、セッションが終了するまでの時間は 30 分間です。

テンプレートをデプロイするには、次の手順に従います。

$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName

デプロイ スクリプトをアップロードする

デプロイ スクリプトをストレージ アカウントにアップロードします。 PowerShell の例を次に示します。

$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"

$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"

$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force

また、Azure portal または Azure CLI を使用してファイルをアップロードすることもできます。

デプロイ スクリプトをテストする

  1. Azure portal で、コンテナー インスタンスとストレージ アカウントをデプロイしたリソース グループを開きます。

  2. コンテナー グループを開きます。 既定のコンテナー グループ名は、プロジェクト名に cg が追加されたものです。 コンテナー インスタンスは実行状態になっています。

  3. リソース メニューで [コンテナー] を選択します。 コンテナー インスタンス名は、プロジェクト名に container が追加されたものです。

    Screenshot of the deployment script connect container instance option in the Azure portal.

  4. [接続] を選択し、次に [接続] を選択します。 コンテナー インスタンスに接続できない場合は、コンテナー グループを再起動して、もう一度試してみてください。

  5. コンソール ペインで、次のコマンドを実行します。

    cd /mnt/azscripts/azscriptinput
    ls
    ./hello.sh John Dole
    

    出力は Hello John Dole です。

    Screenshot of the deployment script container instance test output displayed in the console.

Docker を使用する

デプロイ スクリプト開発環境として、事前構成済みの Docker コンテナー イメージを使用できます。 Docker をインストールするには、「Docker を取得する」を参照してください。 また、デプロイ スクリプトが含まれているディレクトリを Docker コンテナーにマウントするようにファイル共有を構成する必要もあります。

  1. デプロイ スクリプトのコンテナー イメージをローカル コンピューターにプルします。

    docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    この例では、PowerShell バージョン 4.3.0 を使用しています。

    MCR から CLI イメージをプルするには、次のコマンドを使用します。

    docker pull mcr.microsoft.com/azure-cli:2.0.80
    

    この例では、CLI バージョン 2.0.80 を使用します。 デプロイ スクリプトでは、こちらにある既定の CLI コンテナー イメージが使用されます。

  2. Docker イメージをローカルで実行します。

    docker run -v <host drive letter>:/<host directory name>:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    <host driver letter> および <host directory name> を、共有ドライブ上の既存のフォルダーに置き換えます。 このフォルダーは、コンテナー内の /data フォルダーにマップされます。 D:\docker をマップする例を次に示します。

    docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    -it は、コンテナー イメージを維持したままにすることを意味します。

    CLI の例:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
    
  3. 次のスクリーンショットは、共有ドライブに helloworld.ps1 ファイルがある場合に、PowerShell スクリプトを実行する方法を示しています。

    Screenshot of the Resource Manager template deployment script using Docker command.

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

次のステップ

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