演習 - ARM テンプレートに条件付きロジックを追加する

完了

前の演習では、Linux 仮想マシンを使用しました。 ここでは、少し変えて、ストレージ アカウントの管理に注目します。

たとえば、次の 3 つの環境にデプロイする必要があるとします: "開発"、"ステージング"、"運用"。

  • "開発" 環境は、アプリケーションに必要なすべてのものが揃う最初の場所です。 この環境には、Web サーバー、ロード バランサー、データベースが含まれる場合があります。
  • "ステージング" 環境では、アプリケーションの新機能がエンド ユーザーにリリースされる前に最終的なテストが行われます。
  • "運用" 環境は、エンド ユーザーがアプリケーションにアクセスする場所です。

"開発" から "運用" に移行するには、追加のインフラストラクチャが必要になります。 たとえば、"運用" では、前の環境には必要なかった追加のストレージ アカウントが必要です。

ここでは、条件を使用して、いつストレージ アカウントをプロビジョニングするかを制御します。 そうすることで、同じ ARM テンプレートを使用して各インフラストラクチャ環境をサポートできるようになります。

ARM テンプレートを作成する

ここでは、ストレージ アカウント リソースを定義する Azure Resource Manager (ARM) テンプレートを作成します。

そのテンプレートでは、次の 2 つのパラメーターも定義します。

  • environment: 現在の環境の名前。
  • storageAccountName: ストレージ アカウントの名前。

environment は、3 つの値 (devstagingproduction) のいずれかにすることができます。 environmentproduction と等しいときにのみ、条件によってストレージ アカウントがプロビジョニングされます。

  1. Visual Studio Code で、azuredeploy.json が格納されているディレクトリに、condition.json という名前のファイルを作成します。

  2. 次の内容を 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 に設定します。

environmentproduction と等しい場合にのみ条件によってストレージ アカウントがプロビジョニングされるため、テンプレートによってストレージ アカウントはプロビジョニングされないと想定されます。 つまり、デプロイにはリソースが含まれないものと予想されます。

  1. ストレージ アカウントの名前を保持する PowerShell 変数を作成します。

    $STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
    

    ストレージ アカウント名は一意である必要があります。 Get-Random の部分により、ストレージ アカウント名がランダムな一連の数字で終了することが保証されます。

  2. 次の 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 つの値 (devstagingproduction) のいずれかにすることができます。 environmentproduction と等しいときにのみ、条件によってストレージ アカウントがプロビジョニングされます。

  1. Visual Studio Code で、azuredeploy.json が格納されているディレクトリに、condition.json という名前のファイルを作成します。

  2. 次の内容を 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 に設定します。

environmentproduction と等しい場合にのみ条件によってストレージ アカウントがプロビジョニングされるため、テンプレートによってストレージ アカウントはプロビジョニングされないと想定されます。 つまり、デプロイにはリソースが含まれないものと予想されます。

  1. ストレージ アカウントの名前を保持する Bash 変数を作成します。

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    ストレージ アカウント名は一意である必要があります。 $RANDOM の部分により、ストレージ アカウント名がランダムな一連の数字で終了することが保証されます。

  2. 次の 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 つの単位としてプロビジョニングおよび処理できるように、独自のリソース グループによって管理される場合があります。