演習 - ARM テンプレートに条件付きロジックを追加する
前の演習では、Linux 仮想マシンを使用しました。 ここでは、少し変えて、ストレージ アカウントの管理に注目します。
たとえば、次の 3 つの環境にデプロイする必要があるとします: "開発"、"ステージング"、"運用"。
- "開発" 環境は、アプリケーションに必要なすべてのものが揃う最初の場所です。 この環境には、Web サーバー、ロード バランサー、データベースが含まれる場合があります。
- "ステージング" 環境では、アプリケーションの新機能がエンド ユーザーにリリースされる前に最終的なテストが行われます。
- "運用" 環境は、エンド ユーザーがアプリケーションにアクセスする場所です。
"開発" から "運用" に移行するには、追加のインフラストラクチャが必要になります。 たとえば、"運用" では、前の環境には必要なかった追加のストレージ アカウントが必要です。
ここでは、条件を使用して、いつストレージ アカウントをプロビジョニングするかを制御します。 そうすることで、同じ ARM テンプレートを使用して各インフラストラクチャ環境をサポートできるようになります。
ARM テンプレートを作成する
ここでは、ストレージ アカウント リソースを定義する Azure Resource Manager (ARM) テンプレートを作成します。
そのテンプレートでは、次の 2 つのパラメーターも定義します。
environment
: 現在の環境の名前。storageAccountName
: ストレージ アカウントの名前。
environment
は、3 つの値 (dev
、staging
、production
) のいずれかにすることができます。 environment
が production
と等しいときにのみ、条件によってストレージ アカウントがプロビジョニングされます。
Visual Studio Code で、azuredeploy.json が格納されているディレクトリに、condition.json という名前のファイルを作成します。
次の内容を condition.json に追加します。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
ここでは、PowerShell と Az モジュールを使用して、condition コンストラクトにより ARM テンプレートをデプロイします。
開発環境をプロビジョニングする
ここでは、ARM テンプレートを "開発" 環境にデプロイします。 これを行うには、environment
テンプレート パラメーターを dev
に設定します。
environment
が production
と等しい場合にのみ条件によってストレージ アカウントがプロビジョニングされるため、テンプレートによってストレージ アカウントはプロビジョニングされないと想定されます。 つまり、デプロイにはリソースが含まれないものと予想されます。
ストレージ アカウントの名前を保持する PowerShell 変数を作成します。
$STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
ストレージ アカウント名は一意である必要があります。
Get-Random
の部分により、ストレージ アカウント名がランダムな一連の数字で終了することが保証されます。次の
New-AzResourceGroupDeployment
コマンドを実行して、テンプレートを "開発" 環境にデプロイします。New-AzResourceGroupDeployment ` -TemplateFile "./condition.json" ` -storageAccountName $STORAGE_ACCT_NAME ` -environment dev
開発環境へのデプロイを検証する
テンプレートでストレージ アカウントはプロビジョニングされないと予想されることを思い出してください。
この事実を確認するには、Get-AzStorageAccount
コマンドを実行して、ストレージ アカウント名が既に使用されているかどうかを調べます。
コマンド Get-AzStorageAccount
を実行します。
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
次のような内容が出力されます。
Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix
これにより、ストレージ アカウントがまだプロビジョニングされていないことがわかります。 運用環境にはまだデプロイしていないため、このことが予想されます。
運用環境をプロビジョニングする
ここでは、"開発" 環境で行ったのと同じようにして、ARM テンプレートを "運用" 環境にデプロイします。
念のため、テンプレートの条件は次のようになります。
"condition": "[equals(parameters('environment'),'production')]"
この条件をトリガーするには、environment
テンプレート パラメーターを production
に設定します。
次の New-AzResourceGroupDeployment
コマンドを実行して、テンプレートを "運用" 環境にデプロイします。
New-AzResourceGroupDeployment `
-TemplateFile "./condition.json" `
-storageAccountName $STORAGE_ACCT_NAME `
-environment production
運用環境へのデプロイを確認する
今度は、テンプレートによりストレージ アカウントがプロビジョニングされていると予想されます。
この事実を確認するには、Get-AzStorageAccount
コマンドを再び実行して、ストレージ アカウント名が使用されていることを検証します。
次の Get-AzStorageAccount
コマンドを実行します。
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
今度は、異なる出力が得られます。 エラー メッセージの代わりに、ストレージ アカウント リソースに関する情報を示すこのテーブル出力が表示されます。
次のような内容が出力されます。
Location Name Type Kind
-------- ---- ---- ----
westus tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2
これらの値は、ストレージ アカウントが期待どおりにプロビジョニングされたことを示しています。
これは基本的な例ですが、条件に基づいてデプロイする方法がわかります。
実際には、"開発"、"ステージング"、"運用" の各環境には、コンピューティング、ネットワーク、ストレージのニーズに対応するための他の Azure リソースが含まれています。 各環境は、1 つの単位としてプロビジョニングおよび処理できるように、独自のリソース グループによって管理される場合があります。
ARM テンプレートを作成する
ここでは、ストレージ アカウント リソースを定義する Azure Resource Manager (ARM) テンプレートを作成します。
そのテンプレートでは、次の 2 つのパラメーターも定義します。
environment
: 現在の環境の名前。storageAccountName
: ストレージ アカウントの名前。
environment
は、3 つの値 (dev
、staging
、production
) のいずれかにすることができます。 environment
が production
と等しいときにのみ、条件によってストレージ アカウントがプロビジョニングされます。
Visual Studio Code で、azuredeploy.json が格納されているディレクトリに、condition.json という名前のファイルを作成します。
次の内容を condition.json に追加します。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
開発環境をプロビジョニングする
ここでは、ARM テンプレートを "開発" 環境にデプロイします。 これを行うには、environment
テンプレート パラメーターを dev
に設定します。
environment
が production
と等しい場合にのみ条件によってストレージ アカウントがプロビジョニングされるため、テンプレートによってストレージ アカウントはプロビジョニングされないと想定されます。 つまり、デプロイにはリソースが含まれないものと予想されます。
ストレージ アカウントの名前を保持する Bash 変数を作成します。
STORAGE_ACCT_NAME=tailwindsa$RANDOM
ストレージ アカウント名は一意である必要があります。
$RANDOM
の部分により、ストレージ アカウント名がランダムな一連の数字で終了することが保証されます。次の
az deployment group create
コマンドを実行して、テンプレートを "開発" 環境にデプロイします。az deployment group create \ --template-file condition.json \ --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
開発環境へのデプロイを検証する
テンプレートでストレージ アカウントはプロビジョニングされないと予想されることを思い出してください。
この事実を確認するには、az storage account check-name
コマンドを実行して、ストレージ アカウント名が既に使用されているかどうかを調べます。
次の az storage account check-name
コマンドを実行します。
az storage account check-name --name $STORAGE_ACCT_NAME
次のように表示されます。
{
"message": null,
"nameAvailable": true,
"reason": null
}
nameAvailable
の値は true
です。これは、ストレージ アカウント名がまだ使用可能であり、プロビジョニングされていないことを意味します。 運用環境にはまだデプロイしていないため、このことが予想されます。
運用環境をプロビジョニングする
ここでは、"開発" 環境で行ったのと同じようにして、ARM テンプレートを "運用" 環境にデプロイします。
念のため、テンプレートの条件は次のようになります。
"condition": "[equals(parameters('environment'),'production')]"
この条件をトリガーするには、environment
テンプレート パラメーターを production
に設定します。
次の az deployment group create
コマンドを実行して、テンプレートを "運用" 環境にデプロイします。
az deployment group create \
--template-file condition.json \
--parameters storageAccountName=$STORAGE_ACCT_NAME environment=production
運用環境へのデプロイを確認する
今度は、テンプレートによりストレージ アカウントがプロビジョニングされていると予想されます。
この事実を確認するには、az storage account check-name
コマンドを再び実行して、ストレージ アカウント名が使用されていることを検証します。
次の az storage account check-name
コマンドを実行します。
az storage account check-name --name $STORAGE_ACCT_NAME
次のような内容が出力されます。
{
"message": "The storage account named tailwindsa32100 is already taken.",
"nameAvailable": false,
"reason": "AlreadyExists"
}
これらの値は、ストレージ アカウントが期待どおりにプロビジョニングされたことを示しています。
これは基本的な例ですが、条件に基づいてデプロイする方法がわかります。
実際には、"開発"、"ステージング"、"運用" の各環境には、コンピューティング、ネットワーク、ストレージのニーズに対応するための他の Azure リソースが含まれています。 各環境は、1 つの単位としてプロビジョニングおよび処理できるように、独自のリソース グループによって管理される場合があります。