Bicep ファイルでデプロイ スクリプトの開発環境を構成する
デプロイ スクリプト イメージを使用してデプロイ スクリプトを開発およびテストするための開発環境を作成する方法について説明します。 Azure コンテナー インスタンスを作成することも、Docker を使用することもできます。 この記事では、両方のオプションについて説明します。
前提条件
Azure PowerShell コンテナー
Azure PowerShell デプロイ スクリプトがない場合は、次の内容を使用して hello.ps1 ファイルを作成できます。
param([string] $name)
$output = 'Hello {0}' -f $name
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
param([string] $name, [string] $subscription)
$output = 'Hello {0}' -f $name
#Write-Output $output
Connect-AzAccount -UseDeviceAuthentication
Set-AzContext -subscription $subscription
$kv = Get-AzKeyVault
#Write-Output $kv
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['greeting'] = $output
$DeploymentScriptOutputs['kv'] = $kv.resourceId
Write-Output $DeploymentScriptOutputs
Azure PowerShell デプロイ スクリプト内では、変数 $DeploymentScriptOutputs
を使用して出力値を格納します。 Azure PowerShell 出力の操作について詳しくは、「出力を操作する」を参照してください。
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 PowerShell コンテナー インスタンスを作成する
次の Bicep ファイルにより、コンテナー インスタンスとファイル共有が作成され、そのファイル共有がコンテナー イメージにマウントされます。
@description('Specify a project name that is used for generating resource names.')
param projectName string
@description('Specify the resource location.')
param location string = resourceGroup().location
@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7'
@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'
var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: storageAccountName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
properties: {
accessTier: 'Hot'
}
}
resource fileShare 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01' = {
name: '${storageAccountName}/default/${fileShareName}'
dependsOn: [
storageAccount
]
}
resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
name: containerGroupName
location: location
properties: {
containers: [
{
name: containerName
properties: {
image: containerImage
resources: {
requests: {
cpu: 1
memoryInGB: json('1.5')
}
}
ports: [
{
protocol: 'TCP'
port: 80
}
]
volumeMounts: [
{
name: 'filesharevolume'
mountPath: mountPath
}
]
command: [
'/bin/sh'
'-c'
'pwsh -c \'Start-Sleep -Seconds 1800\''
]
}
}
]
osType: 'Linux'
volumes: [
{
name: 'filesharevolume'
azureFile: {
readOnly: false
shareName: fileShareName
storageAccountName: storageAccountName
storageAccountKey: storageAccount.listKeys().keys[0].value
}
}
]
}
}
マウント パスの既定値は /mnt/azscripts/azscriptinput
です。 これは、ファイル共有にマウントされるコンテナー インスタンス内のパスです。
Bicep ファイル内に指定された既定のコンテナー イメージは mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7 です。 サポートされているすべての Azure PowerShell バージョンの一覧を参照してください。
この Bicep ファイルでは、コンテナー インスタンスが 1,800 秒後に中断されます。 コンテナー インスタンスが終了状態になり、セッションが終了するまでの時間は 30 分間です。
次のスクリプトを使用して、この Bicep ファイルをデプロイします。
$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 Bicep 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 が追加されたものです。 コンテナー インスタンスは実行状態になっています。
リソース メニューで [コンテナー] を選択します。 コンテナー インスタンス名は、プロジェクト名に container が追加されたものです。
[接続] を選択し、次に [接続] を選択します。 コンテナー インスタンスに接続できない場合は、コンテナー グループを再起動して、もう一度試してみてください。
コンソール ペインで、次のコマンドを実行します。
cd /mnt/azscripts/azscriptinput ls pwsh ./hello.ps1 "John Dole"
出力は Hello John Dole です。
Azure CLI コンテナー インスタンスを使用する
ご自身のコンピューター上で Azure CLI スクリプトを作成するには、ストレージ アカウントを作成し、そのストレージ アカウントをコンテナー インスタンスにマウントします。 これにより、スクリプトをストレージ アカウントにアップロードし、コンテナー インスタンスでスクリプトを実行できるようになります。 スクリプトをテストするために作成するストレージ アカウントは、スクリプトを実行するためにデプロイ スクリプト サービスで使用されるストレージ アカウントと同じではありません。 デプロイ スクリプト サービスでは、実行のたびに、ファイル共有として一意の名前が作成されます。
Azure CLI コンテナー インスタンスを作成する
次の Bicep ファイルにより、コンテナー インスタンスとファイル共有が作成され、そのファイル共有がコンテナー イメージにマウントされます。
@description('Specify a project name that is used for generating resource names.')
param projectName string
@description('Specify the resource location.')
param location string = resourceGroup().location
@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azure-cli:2.9.1'
@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'
var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
properties: {
accessTier: 'Hot'
}
}
resource fileshare 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-04-01' = {
name: '${storageAccountName}/default/${fileShareName}'
dependsOn: [
storageAccount
]
}
resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
name: containerGroupName
location: location
properties: {
containers: [
{
name: containerName
properties: {
image: containerImage
resources: {
requests: {
cpu: 1
memoryInGB: json('1.5')
}
}
ports: [
{
protocol: 'TCP'
port: 80
}
]
volumeMounts: [
{
name: 'filesharevolume'
mountPath: mountPath
}
]
command: [
'/bin/bash'
'-c'
'echo hello; sleep 1800'
]
}
}
]
osType: 'Linux'
volumes: [
{
name: 'filesharevolume'
azureFile: {
readOnly: false
shareName: fileShareName
storageAccountName: storageAccountName
storageAccountKey: storageAccount.listKeys().keys[0].value
}
}
]
}
}
マウント パスの既定値は /mnt/azscripts/azscriptinput
です。 これは、ファイル共有にマウントされるコンテナー インスタンス内のパスです。
Bicep ファイル内に指定された既定のコンテナー イメージは mcr.microsoft.com/azure-cli:2.9.1 です。 サポートされている Azure CLI バージョンの一覧を参照してください。 デプロイ スクリプトでは、Microsoft Container Registry (MCR) から入手可能な CLI イメージが使用されます。 デプロイ スクリプトの CLI イメージの認定には、1 か月ほどかかります。 30 日以内にリリースされた CLI バージョンは使用しないでください。 イメージのリリース日を確認するには、「Azure CLI リリース ノート」を参照してください。 サポートされていないバージョンを使用している場合、エラー メッセージにサポートされているバージョンが一覧表示されます。
この Bicep ファイルでは、コンテナー インスタンスが 1,800 秒後に中断されます。 コンテナー インスタンスが終了状態になり、セッションが終了するまでの時間は 30 分間です。
Bicep ファイルをデプロイするには:
$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 Bicep 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 が追加されたものです。 コンテナー インスタンスは実行状態になっています。
リソース メニューで [コンテナー] を選択します。 コンテナー インスタンス名は、プロジェクト名に container が追加されたものです。
[接続] を選択し、次に [接続] を選択します。 コンテナー インスタンスに接続できない場合は、コンテナー グループを再起動して、もう一度試してみてください。
コンソール ペインで、次のコマンドを実行します。
cd /mnt/azscripts/azscriptinput ls ./hello.sh John Dole
出力は Hello John Dole です。
Docker を使用する
デプロイ スクリプト開発環境として、事前構成済みの Docker コンテナー イメージを使用できます。 Docker をインストールするには、「Docker を取得する」を参照してください。 また、デプロイ スクリプトが含まれているディレクトリを Docker コンテナーにマウントするようにファイル共有を構成する必要もあります。
デプロイ スクリプトのコンテナー イメージをローカル コンピューターにプルします。
docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az10.0
この例では、PowerShell バージョン 4.3.0 を使用しています。
MCR から CLI イメージをプルするには、次のコマンドを使用します。
docker pull mcr.microsoft.com/azure-cli:2.52.0
この例では、CLI バージョン 2.52.0 を使います。 デプロイ スクリプトでは、既定の CLI コンテナー イメージが使われます。
Docker イメージをローカルで実行します。
docker run -v <host drive letter>:/<host directory name>:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az10.0
<host driver letter> および <host directory name> を、共有ドライブ上の既存のフォルダーに置き換えます。 このフォルダーは、コンテナー内の /data フォルダーにマップされます。 D:\docker をマップする例を次に示します。
docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az10.0
-it は、コンテナー イメージを維持したままにすることを意味します。
CLI の例:
docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.52.0
次のスクリーンショットは、共有ドライブに helloworld.ps1 ファイルがある場合に、PowerShell スクリプトを実行する方法を示しています。
テストが正常に完了したスクリプトは、Bicep ファイル内のデプロイ スクリプトとして使用できます。
次のステップ
この記事では、スクリプト開発環境を作成する方法について説明しました。 詳細については、以下を参照してください。