デプロイ スクリプト イメージを使用して 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'
注
Azure CLI デプロイ スクリプトを実行すると、AZ_SCRIPTS_OUTPUT_PATH
という環境変数にスクリプト出力ファイルの場所が格納されます。 環境変数は、開発環境のコンテナーでは使用できません。 Azure CLI 出力の操作の詳細については、「 CLI スクリプトからの出力の操作」を参照してください。
Azure PowerShell コンテナー インスタンスを使用する
ご自身のコンピューターでスクリプトを作成するには、ストレージ アカウントを作成し、そのストレージ アカウントをコンテナー インスタンスにマウントする必要があります。 これにより、スクリプトをストレージ アカウントにアップロードし、コンテナー インスタンスでスクリプトを実行できるようになります。
注
スクリプトをテストするために作成するストレージ アカウントは、スクリプトを実行するためにデプロイ スクリプト サービスで使用されるストレージ アカウントと同じではありません。 デプロイ スクリプト サービスは、実行のたびに、ファイル共有として一意の名前を作成します。
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 を使用してファイルをアップロードすることもできます。
デプロイ スクリプトをテストする
Azure portal で、コンテナー インスタンスとストレージ アカウントをデプロイしたリソース グループを開きます。
コンテナー グループを開きます。 既定のコンテナー グループ名は、cg が付加されたプロジェクト名 です。 コンテナー インスタンスが 実行中 の状態です。
リソース メニューで、[コンテナー] を選択 します。 コンテナー インスタンス名は、コンテナーが追加されたプロジェクト名 です。
[ 接続] を選択し、[ 接続] を選択します。 コンテナー インスタンスに接続できない場合は、コンテナー グループを再起動して、もう一度試してみてください。
コンソール ペインで、次のコマンドを実行します。
cd /mnt/azscripts/azscriptinput ls pwsh ./hello.ps1 "John Dole"
出力は Hello John Dole です。
Azure CLI コンテナー インスタンスを使用する
ご自身のコンピューターでスクリプトを作成するには、ストレージ アカウントを作成し、そのストレージ アカウントをコンテナー インスタンスにマウントします。 これにより、スクリプトをストレージ アカウントにアップロードし、コンテナー インスタンスでスクリプトを実行できるようになります。
注
スクリプトをテストするために作成するストレージ アカウントは、スクリプトを実行するためにデプロイ スクリプト サービスで使用されるストレージ アカウントと同じではありません。 デプロイ スクリプト サービスでは、実行のたびに、ファイル共有として一意の名前が作成されます。
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 を使用してファイルをアップロードすることもできます。
デプロイ スクリプトをテストする
Azure portal で、コンテナー インスタンスとストレージ アカウントをデプロイしたリソース グループを開きます。
コンテナー グループを開きます。 既定のコンテナー グループ名は、cg が付加されたプロジェクト名 です。 コンテナー インスタンスは 、実行中 の状態で表示されます。
リソース メニューで、[コンテナー] を選択 します。 コンテナー インスタンス名は、コンテナーが追加されたプロジェクト名 です。
[ 接続] を選択し、[ 接続] を選択します。 コンテナー インスタンスに接続できない場合は、コンテナー グループを再起動して、もう一度試してみてください。
コンソール ペインで、次のコマンドを実行します。
cd /mnt/azscripts/azscriptinput ls ./hello.sh John Dole
出力は Hello John Dole です。
Docker を使用する
デプロイ スクリプト開発環境として、事前構成済みの Docker コンテナー イメージを使用できます。 Docker をインストールするには、Docker の取得に関する記事を参照してください。 また、デプロイ スクリプトが含まれているディレクトリを Docker コンテナーにマウントするようにファイル共有を構成する必要もあります。
デプロイ スクリプトのコンテナー イメージをローカル コンピューターにプルします。
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 コンテナー イメージが使用されます。
Docker イメージをローカルで実行します。
docker run -v <host drive letter>:/<host directory name>:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
<ホスト ドライバー文字>および <host ディレクトリ名>共有ドライブ上の既存のフォルダーに置き換えます。 このフォルダーは、コンテナー内の /data フォルダーにマップされます。 たとえば、 D:\docker をマップするには、次のようにします。
docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
-これは、 コンテナー イメージを有効に保つことを意味します。
CLI の例:
docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
次のスクリーンショットは、共有ドライブに helloworld.ps1 ファイルがある場合に、PowerShell スクリプトを実行する方法を示しています。
テストが正常に完了したスクリプトは、テンプレート内のデプロイ スクリプトとして使用できます。
次のステップ
この記事では、デプロイ スクリプトの使用方法について学習しました。 デプロイ スクリプトのチュートリアルを詳しく見るには、次を確認してください。