演習 - ARM テンプレートにデプロイ スクリプトを追加する

完了

重要

この演習を行うには、独自の Azure サブスクリプションが必要です。また、料金が発生することがあります。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

チームのアプリケーションのデプロイ プロセスの一環として、ストレージ アカウントを作成し、アプリケーションが読み取るファイルを BLOB ストレージにステージングする必要があります。 この時点まで、新しい環境が設定されるたびにファイルを手動でコピーしています。 環境の作成プロセスの一環として、このステップを自動化するために、デプロイ スクリプトを使うことにしました。

この演習では、既存の Azure Resource Manager (ARM) テンプレートを使用して、新しいデプロイ スクリプトを追加します。

このプロセスでは、次のことを行います。

  • 開始テンプレートを作成する。
  • ユーザー割り当てマネージド ID やロールの割り当てを含めた、デプロイ スクリプトの前提条件を追加する。
  • デプロイ スクリプトを追加する。
  • テンプレートをデプロイし、結果を確認する。

この演習では、Azure Resource Manager Tools for Visual Studio Code を使用します。 この拡張機能を Visual Studio Code にインストールしてください。

この演習では、Visual Studio Code 用の Bicep 拡張機能を使用します。 この拡張機能を Visual Studio Code にインストールしてください。

出発点となるテンプレートを作成する

チームが使用している既存のテンプレートを使用して開始します。 このテンプレートでは、ストレージ アカウントが作成され、BLOB サービスが設定され、HTTPS が要求され、構成ファイル用の BLOB コンテナーが作成されます。

  1. Visual Studio Code を開きます。

  2. azuredeploy.json という名前の新しいファイルを作成します。

  3. Visual Studio Code によって ARM テンプレート ツールが読み込まれるように、空のファイルを保存します。

    [ファイル]>[名前を付けて保存] を選択するか、Windows で Ctrl+S (macOS では ⌘+S) を選択できます。 ファイルを保存した場所を忘れないようにしてください。 たとえば、保存場所として、scripts フォルダーを作成することをお勧めします。

  4. 次の開始テンプレートを azuredeploy.json にコピーします。

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.1",
        "apiProfile": "",
        "parameters": {},
        "variables": {
            "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
            "storageBlobContainerName": "config"
        },
        "functions": [],
        "resources": [
            {
                "name": "[variables('storageAccountName')]",
                "type": "Microsoft.Storage/storageAccounts",
                "apiVersion": "2023-01-01",
                "tags": {
                    "displayName": "[variables('storageAccountName')]"
                },
                "location": "[resourceGroup().location]",
                "kind": "StorageV2",
                "sku": {
                    "name": "Standard_LRS",
                    "tier": "Standard"
                },
                "properties": {
                    "allowBlobPublicAccess": true,
                    "encryption": {
                        "services": {
                            "blob": {
                                "enabled": true
                            }
                        },
                        "keySource": "Microsoft.Storage"
                    },
                    "supportsHttpsTrafficOnly": true
                }
            },
            {
                "type": "Microsoft.Storage/storageAccounts/blobServices",
                "apiVersion": "2019-04-01",
                "name": "[concat(variables('storageAccountName'), '/default')]",
                "dependsOn": [
                    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
                ]
            },
            {
                "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
                "apiVersion": "2019-04-01",
                "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
                "dependsOn": [
                    "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
                    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
                ],
                "properties": {
                    "publicAccess": "Blob"
                }
            }
        ]
    }
    
  5. テンプレートを保存します。

  1. Visual Studio Code を開きます。

  2. main.bicep という名前の新しいファイルを作成します。

  3. Visual Studio Code によって Bicep ツールが読み込まれるように、空のファイルを保存します。

    [ファイル]>[名前を付けて保存] を選択するか、Windows で Ctrl+S (macOS では ⌘+S) を選択できます。 ファイルを保存した場所を忘れないようにしてください。 たとえば、保存場所として、scripts フォルダーを作成することをお勧めします。

  4. 次の開始テンプレートを main.bicep にコピーします。

    var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
    var storageBlobContainerName = 'config'
    
    resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
      name: storageAccountName
      tags: {
        displayName: storageAccountName
      }
      location: resourceGroup().location
      kind: 'StorageV2'
      sku: {
        name: 'Standard_LRS'
        tier: 'Standard'
      }
      properties: {
        allowBlobPublicAccess: true
        encryption: {
          services: {
            blob: {
              enabled: true
            }
          }
          keySource: 'Microsoft.Storage'
        }
        supportsHttpsTrafficOnly: true
      }
    
      resource blobService 'blobServices' existing = {
        name: 'default'
      }
    }
    
    resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
      parent: storageAccount::blobService
      name: storageBlobContainerName
      properties: {
        publicAccess: 'Blob'
      }
    }
    
  5. テンプレートを保存します。

ユーザー割り当てマネージド ID を追加する

次に、ユーザー割り当てマネージド ID を作成する必要があります。 コードとしてのインフラストラクチャのアプローチにより、テンプレートで ID を作成できます。

  1. azuredeploy.jsonvariables セクションを、次を含むように編集します。

    "userAssignedIdentityName": "configDeployer",
    
  2. azuredeploy.jsonresources セクションを、次を含むように編集します。

    {
        "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
        "apiVersion": "2018-11-30",
        "name": "[variables('userAssignedIdentityName')]",
        "location": "[resourceGroup().location]"
    }
    
  3. テンプレートを保存します。

  1. main.bicepの変数の定義に、次を追加します。

    var userAssignedIdentityName = 'configDeployer'
    
  2. リソース定義で、次を追加します。

    resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
      name: userAssignedIdentityName
      location: resourceGroup().location
    }
    
  3. テンプレートを保存します。

マネージド ID の共同作成者ロールを設定する

マネージド ID を定義したら、これにリソース グループに対する権限を持つロールを割り当てることができます。 これに、"共同作成者ロール" を割り当てます。 ロールは、ロールの定義 ID (GUID) で指定します。 "共同作成者" ロールは Azure に組み込まれているので、ロールの定義 ID はドキュメントに記載されています。

ロールの割り当てには、GUID 名も必要です。 guid 関数を使用すると、リソース グループとロール名に固有の GUID を作成できます。

  1. azuredeploy.jsonvariables セクションを、次を含むように編集します。

    "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
    "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
    
  2. azuredeploy.jsonresources セクションを、次を含むように編集します。

    {
        "type": "Microsoft.Authorization/roleAssignments",
        "apiVersion": "2020-04-01-preview",
        "name": "[variables('roleAssignmentName')]",
        "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
        "properties": {
            "roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
            "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
            "scope": "[resourceGroup().id]",
            "principalType": "ServicePrincipal"
        }
    }
    
  3. テンプレートを保存します。

  1. main.bicepの変数の定義に、次を追加します。

    var roleAssignmentName = guid(resourceGroup().id, 'contributor')
    var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
    
  2. リソース定義で、次を追加します。

    resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
      name: roleAssignmentName
      properties: {
        roleDefinitionId: contributorRoleDefinitionId
        principalId: userAssignedIdentity.properties.principalId
        principalType: 'ServicePrincipal'
      }
    }
    
  3. テンプレートを保存します。

デプロイ スクリプトを作成する

これで、デプロイ スクリプトのすべての前提条件が作成されました。 最初は、デプロイ スクリプトで必要とされる共通の値を使用します。 2 つの依存関係 (ロールの割り当てと BLOB ストレージ コンテナー) があります。 スクリプトを実行する前に、これらの両方が存在している必要があります。

  1. azuredeploy.jsonvariables セクションを、次を含むように編集します。

    "deploymentScriptName": "CopyConfigScript"
    
  2. azuredeploy.jsonresources セクションを、次を含むように編集します。

    {
        "type": "Microsoft.Resources/deploymentScripts",
        "apiVersion": "2020-10-01",
        "name": "[variables('deploymentScriptName')]",
        "location": "[resourceGroup().location]",
        "kind": "AzurePowerShell",
        "dependsOn": [
            "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
            "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
        ],
        "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
            }
        }
    }
    
  3. properties セクションをリソースに追加して、スクリプトとその他の必要な値を定義します。

    "properties": {
        "azPowerShellVersion": "3.0",
        "scriptContent": "
            Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
            $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
            $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context
            $DeploymentScriptOutputs = @{}
            $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
            $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
        ",
        "retentionInterval": "P1D"
    }
    
  4. テンプレートを保存します。

  1. main.bicepの変数の定義に、次を追加します。

    var deploymentScriptName = 'CopyConfigScript'
    
  2. リソース定義で、次を追加します。

    resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: deploymentScriptName
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '${userAssignedIdentity.id}': {}
        }
      }
      dependsOn: [
        roleAssignment
        blobContainer
      ]
    }
    
  3. properties セクションをリソースに追加して、スクリプトとその他の必要な値を定義します。

    properties: {
      azPowerShellVersion: '3.0'
      scriptContent: '''
        Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
        $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
        $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context
        $DeploymentScriptOutputs = @{}
        $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
        $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
      '''
      retentionInterval: 'P1D'
    }
    
  4. テンプレートを保存します。

テンプレートの出力を追加する

これで、Azure Blob Storage にファイルをアップロードするデプロイ スクリプトが完成したので、後の自動化でそのファイルの場所を参照することが必要になる場合があります。 (おそらく、ファイルが想定されている場所にあることを検証するテストを実行することになるでしょう。)

ARM テンプレートの resources セクションの後に、デプロイ スクリプトによって報告されたファイルの URI を参照する出力を追加します。

"outputs": {
    "fileUri": {
        "type": "string",
        "value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
    }
}

ファイルの下部の、リソースの定義の後に、デプロイ スクリプトによって報告されたファイルの URI を参照する出力を追加します。

output fileUri string = deploymentScript.properties.outputs.Uri

テンプレートを確認する

テンプレートは次のようになります。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.1",
    "apiProfile": "",
    "parameters": {},
    "variables": {
        "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
        "storageBlobContainerName": "config",
        "userAssignedIdentityName": "configDeployer",
        "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
        "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "deploymentScriptName": "CopyConfigScript"
    },
    "functions": [],
    "resources": [
        {
            "name": "[variables('storageAccountName')]",
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2023-01-01",
            "tags": {
                "displayName": "[variables('storageAccountName')]"
            },
            "location": "[resourceGroup().location]",
            "kind": "StorageV2",
            "sku": {
                "name": "Standard_LRS",
                "tier": "Standard"
            },
            "properties": {
                "allowBlobPublicAccess": true,
                "encryption": {
                    "services": {
                        "blob": {
                            "enabled": true
                        }
                    },
                    "keySource": "Microsoft.Storage"
                },
                "supportsHttpsTrafficOnly": true
            }
        },
        {
            "type": "Microsoft.Storage/storageAccounts/blobServices",
            "apiVersion": "2019-04-01",
            "name": "[concat(variables('storageAccountName'), '/default')]",
            "dependsOn": [
                "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
            ]
        },
        {
            "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
            "apiVersion": "2019-04-01",
            "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
            "dependsOn": [
                "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
                "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
            ],
            "properties": {
                "publicAccess": "Blob"
            }
        },
        {
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
            "apiVersion": "2018-11-30",
            "name": "[variables('userAssignedIdentityName')]",
            "location": "[resourceGroup().location]"
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2020-04-01-preview",
            "name": "[variables('roleAssignmentName')]",
            "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
            "properties": {
                "roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
                "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
                "scope": "[resourceGroup().id]",
                "principalType": "ServicePrincipal"
            }
        },
        {
            "type": "Microsoft.Resources/deploymentScripts",
            "apiVersion": "2020-10-01",
            "name": "[variables('deploymentScriptName')]",
            "location": "[resourceGroup().location]",
            "kind": "AzurePowerShell",
            "dependsOn": [
                "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
                "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
            ],
            "identity": {
                "type": "UserAssigned",
                "userAssignedIdentities": {
                    "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
                }
            },
            "properties": {
                "azPowerShellVersion": "3.0",
                "scriptContent": "
                    Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
                    $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
                    $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context
                    $DeploymentScriptOutputs = @{}
                    $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
                    $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
                ",
                "retentionInterval": "P1D"
            }
        }
    ],
    "outputs": {
        "fileUri": {
            "type": "string",
            "value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
        }
    }
}
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
var storageBlobContainerName = 'config'
var userAssignedIdentityName = 'configDeployer'
var roleAssignmentName = guid(resourceGroup().id, 'contributor')
var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
var deploymentScriptName = 'CopyConfigScript'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  tags: {
    displayName: storageAccountName
  }
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
    tier: 'Standard'
  }
  properties: {
    allowBlobPublicAccess: true
    encryption: {
      services: {
        blob: {
          enabled: true
        }
      }
      keySource: 'Microsoft.Storage'
    }
    supportsHttpsTrafficOnly: true
  }

  resource blobService 'blobServices' existing = {
    name: 'default'
  }
}

resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
  parent: storageAccount::blobService
  name: storageBlobContainerName
  properties: {
    publicAccess: 'Blob'
  }
}

resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
  name: userAssignedIdentityName
  location: resourceGroup().location
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
  name: roleAssignmentName
  properties: {
    roleDefinitionId: contributorRoleDefinitionId
    principalId: userAssignedIdentity.properties.principalId
    principalType: 'ServicePrincipal'
  }
}

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: deploymentScriptName
  location: resourceGroup().location
  kind: 'AzurePowerShell'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentity.id}': {}
    }
  }
  properties: {
    azPowerShellVersion: '3.0'
    scriptContent: '''
      Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
      $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
      $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
      $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
    '''
    retentionInterval: 'P1D'
  }
  dependsOn: [
    roleAssignment
    blobContainer
  ]
}

output fileUri string = deploymentScript.properties.outputs.Uri

そうではない場合は、例をコピーするか、例に合わせてテンプレートを調整してください。

テンプレートのデプロイ

このテンプレートを Azure にデプロイするには、Visual Studio Code ターミナルから Azure アカウントにサインインする必要があります。 Azure CLI ツールがインストールされていることを確認します。

  1. [ターミナル] メニューで、[新しいターミナル] を選択します。 通常、ターミナル ウィンドウは画面の下半分に表示されます。

  2. ターミナル ウィンドウの右側に表示されるシェルが Bash の場合、正しいシェルが開いているので、次のセクションに進むことができます。

    Bash オプションが表示されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  3. Bash 以外のシェルが表示された場合は、シェルのドロップダウン矢印を選択した後、[Azure Cloud Shell (Bash)] を選択します。

    ターミナル シェルのドロップダウンが表示され、[Git Bash (既定値)] が選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  4. ターミナル シェルの一覧で、Bash を選択します。

    Bash ターミナルが選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  5. ターミナルで、テンプレートを保存したディレクトリに移動します。 たとえば、それをテンプレート フォルダーに保存した場合、次のコマンドを使用します。

    cd templates
    

Azure CLI を使用して Azure にサインインする

  1. Visual Studio Code ターミナルで、次のコマンドを実行して Azure にサインインします。

    az login
    
  2. 開いたブラウザーで、Azure アカウントにサインインします。

    Visual Studio Code ターミナルには、このアカウントに関連付けられているサブスクリプションの一覧が表示されます。

  3. この一覧で、この演習に使用するサブスクリプションを見つけます。

    サインイン以降に一覧を見失った場合は、次のスニペットを使用してサブスクリプションを再び一覧表示することができます。

    az account list --output table
    
  4. このセッションで実行するすべての Azure CLI コマンドに対して、既定のサブスクリプションを設定します。

    az account set --subscription "Your Subscription Name or ID"
    

このテンプレートを Azure にデプロイするには、Visual Studio Code ターミナルから Azure アカウントにサインインする必要があります。 Azure CLI ツールがインストールされていることを確認します。

  1. [ターミナル] メニューで、[新しいターミナル] を選択します。 通常、ターミナル ウィンドウは画面の下半分に表示されます。

  2. ターミナル ウィンドウの右側に表示されるシェルが Bash の場合、正しいシェルが開いているので、次のセクションに進むことができます。

    Bash オプションが表示されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  3. Bash 以外のシェルが表示された場合は、シェルのドロップダウン矢印を選択した後、[Azure Cloud Shell (Bash)] を選択します。

    ターミナル シェルのドロップダウンが表示され、[Git Bash (既定値)] が選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  4. ターミナル シェルの一覧で、Bash を選択します。

    Bash ターミナルが選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  5. ターミナルで、テンプレートを保存したディレクトリに移動します。 たとえば、それをテンプレート フォルダーに保存した場合、次のコマンドを使用します。

    cd templates
    

Bicep をインストールする

次のコマンドを実行して、最新バージョンの Bicep がインストールされていることを確認します。

az bicep install && az bicep upgrade

Azure CLI を使用して Azure にサインインする

  1. Visual Studio Code ターミナルで、次のコマンドを実行して Azure にサインインします。

    az login
    
  2. 開いたブラウザーで、Azure アカウントにサインインします。

    Visual Studio Code ターミナルには、このアカウントに関連付けられているサブスクリプションの一覧が表示されます。

  3. この一覧で、この演習に使用するサブスクリプションを見つけます。

    サインイン以降に一覧を見失った場合は、次のスニペットを使用してサブスクリプションを再び一覧表示することができます。

    az account list --output table
    
  4. このセッションで実行するすべての Azure CLI コマンドに対して、既定のサブスクリプションを設定します。

    az account set --subscription "Your Subscription Name or ID"
    

このテンプレートを Azure にデプロイするには、Visual Studio Code ターミナルから Azure アカウントにサインインします。 Azure PowerShell をインストールしたことを確認し、サンドボックスをアクティブ化したのと同じアカウントにサインインします。

  1. [ターミナル] メニューで、[新しいターミナル] を選択します。 通常、ターミナル ウィンドウは画面の下半分に表示されます。

  2. ターミナル ウィンドウの右側に表示されるシェルが powershell または pwsh の場合、正しいシェルが開いているので、次のセクションに進むことができます。

    シェルのドロップダウン リストに pwsh オプションが表示されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  3. Powershell または pwsh 以外のシェルが表示された場合は、シェルのドロップダウン矢印を選択し、[PowerShell] を選びます。

    ターミナル シェルのドロップダウン リストが表示され、PowerShell が選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  4. ターミナル シェルの一覧で、Powershell または pwsh を選択します。

    PowerShell ターミナルが選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  5. ターミナルで、テンプレートを保存したディレクトリに移動します。 たとえば、それをテンプレート フォルダーに保存した場合、次のコマンドを使用します。

    Set-Location -Path templates
    

Azure PowerShell を使用して Azure にサインインする

  1. Visual Studio Code ターミナルで、次のコマンドを実行して Azure にサインインします。

    Connect-AzAccount
    
  2. 開いたブラウザーで、Azure アカウントにサインインします。

  3. 次のコマンドを実行して、この演習で使用するサブスクリプションの ID を取得します。

    Get-AzSubscription
    

    サブスクリプション ID は 2 番目の列です。 2 列目をコピーします。 これは、cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0 のようになります。

  4. このセッションで実行するすべての Azure PowerShell コマンドについて既定のサブスクリプションを設定します。

    Set-AzContext -SubscriptionId {Your subscription ID}
    

このテンプレートを Azure にデプロイするには、Visual Studio Code ターミナルから Azure アカウントにサインインします。 Azure PowerShell がインストールされていることを確認します。

  1. [ターミナル] メニューで、[新しいターミナル] を選択します。 通常、ターミナル ウィンドウは画面の下半分に表示されます。

  2. ターミナル ウィンドウの右側に表示されるシェルが powershell または pwsh の場合、正しいシェルが開いているので、次のセクションに進むことができます。

    シェルのドロップダウン リストに pwsh オプションが表示されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  3. Powershell または pwsh 以外のシェルが表示された場合は、シェルのドロップダウン矢印を選択し、[PowerShell] を選びます。

    ターミナル シェルのドロップダウン リストが表示され、PowerShell が選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  4. ターミナル シェルの一覧で、Powershell または pwsh を選択します。

    PowerShell ターミナルが選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  5. ターミナルで、テンプレートを保存したディレクトリに移動します。 たとえば、それをテンプレート フォルダーに保存した場合、次のコマンドを使用します。

    Set-Location -Path templates
    

Bicep CLI のインストール

Azure PowerShell で Bicep を使用するには、Bicep CLI をインストールします。

Azure PowerShell を使用して Azure にサインインする

  1. Visual Studio Code ターミナルで、次のコマンドを実行して Azure にサインインします。

    Connect-AzAccount
    
  2. 開いたブラウザーで、Azure アカウントにサインインします。

  3. 次のコマンドを実行して、この演習で使用するサブスクリプションの ID を取得します。

    Get-AzSubscription
    

    サブスクリプション ID は 2 番目の列です。 2 列目をコピーします。 これは、cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0 のようになります。

  4. このセッションで実行するすべての Azure PowerShell コマンドについて既定のサブスクリプションを設定します。

    Set-AzContext -SubscriptionId {Your subscription ID}
    

次に、この演習の一環として作成するリソースを含めるリソース グループを作成する必要があります。 新しいリソース グループを使用することにより、演習後のクリーンアップがはるかに簡単になります。

Visual Studio Code のターミナルから、このコマンドを実行し、この演習用のリソース グループを作成します。

演習用のリソース グループを作成する

resourceGroupName="learndeploymentscript_exercise_1"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_1'
New-AzResourceGroup -Location eastus -Name $resourceGroupName

Note

リソース グループに別の名前を使用する場合は、必ずスクリプトを更新する必要があります。 このモジュールの後の方で、スクリプト内のリソース グループ名のハードコーディングを回避する方法について説明します。

テンプレートを Azure にデプロイする

次のコードにより、ARM テンプレートが Azure にデプロイされます。 デプロイが成功したことが分かります。

Visual Studio Code ターミナルで Azure CLI コマンドを使用して、テンプレートをデプロイします。

templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today

az deployment group create \
    --resource-group $resourceGroupName \
    --name $deploymentName \
    --template-file $templateFile

次のコードにより、ARM テンプレートが Azure にデプロイされます。 デプロイが成功したことが分かります。

Visual Studio Code ターミナルで Azure CLI コマンドを使用して、テンプレートをデプロイします。

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today

az deployment group create \
    --resource-group $resourceGroupName \
    --name $deploymentName \
    --template-file $templateFile

次のコードにより、テンプレートが Azure にデプロイされます。 デプロイが成功したことが分かります。

ターミナルで、Azure PowerShell コマンドを使用してテンプレートをデプロイします。

$templateFile = 'azuredeploy.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
  -ResourceGroupName $resourceGroupName `
  -Name $deploymentName `
  -TemplateFile $templateFile

次のコードにより、テンプレートが Azure にデプロイされます。 デプロイが成功したことが分かります。

ターミナルで、Azure PowerShell コマンドを使用してテンプレートをデプロイします。

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
  -ResourceGroupName $resourceGroupName `
  -Name $deploymentName `
  -TemplateFile $templateFile

テンプレートの結果を確認する

デプロイが完了すると、デプロイ スクリプトが BLOB ストレージにコピーしたファイルを指す URL が付与されます。

  1. デプロイ スクリプトが正常に動作したことを確認するには、テンプレートのデプロイからの URL 出力を使用して、そのファイルを取得します。

    uri=$(az deployment group show --resource-group $resourceGroupName --name $deploymentName --query 'properties.outputs.fileUri.value' --output tsv)
    curl $uri
    

    コマンドからは次のコードが返されます。

    {
      "environment": "production",
      "hostname": "tailwindtraders.com",
      "Logging": {
        "LogLevel": {
          "Default": "Debug"
        }
      },
      "ApplicationInsights": {
        "InstrumentationKey": ""
      },
      "AllowedHosts": "*",
      "CosmosDb": {
        "Host": "",
        "Key": "",
        "Database": "Products"
      }
    }
    
  2. また、Azure portal から、あるいは次のコマンドを使用して、ログ (およびデプロイに関するその他の詳細) を確認することもできます。

    az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
    
  1. デプロイ スクリプトが正常に動作したことを確認するには、テンプレートのデプロイからの URL 出力を使用して、そのファイルを取得します。

    $fileUri = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName).Outputs.fileUri.Value
    Invoke-RestMethod $fileUri
    

    コマンドからは次のコードが返されます。

    environment         : production
    hostname            : tailwindtraders.com
    Logging             : @{LogLevel=}
    ApplicationInsights : @{InstrumentationKey=}
    AllowedHosts        : *
    CosmosDb            : @{Host=; Key=; Database=Products}
    
  2. また、Azure portal から、あるいは次のコマンド ラインを使用して、ログ (およびデプロイに関するその他の詳細) を確認することもできます。

    Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
    

リソース グループをクリーンアップする

デプロイ スクリプトを使用した ARM テンプレートのデプロイが完了したので、作成したすべてのリソースとロールの割り当てを含むリソース グループを削除できます。

az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName