演習 - サブスクリプションスコープのリソースをデプロイする

完了

重要

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

プロジェクト Teddybear は本格的に始動しており、研究開発チームは、あなたから新しい Azure サブスクリプションへのアクセス権が付与されるのを待っています。 あなたはサブスクリプションを既に作成しましたが、チームにアクセス権を付与する前に、チームのポリシーに準拠した仮想マシンのみがデプロイされるようにする必要があります。 チームからは、F または G シリーズの仮想マシンをデプロイしたくないと言われています。

この演習では、チームのポリシーに基づいてサブスクリプションを構成する Bicep テンプレートを作成します。

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

  • サブスクリプション スコープにデプロイする Bicep テンプレートを作成します。
  • Azure Policy の定義と割り当てを追加します。
  • テンプレートをデプロイし、結果を確認します。

この演習では、サブスクリプション スコープのリソースをデプロイするためのアクセス許可が必要です。 現在の Azure アカウントでこれらの要件を満たすことができない場合は、無料試用版を入手し、新しい Azure サブスクリプションとテナントを作成することができます。 または、この演習のデプロイ手順をスキップできます。

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

サブスクリプションスコープのテンプレートを作成する

  1. Visual Studio Code を開きます。

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

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

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

  4. main.bicep ファイルに次の内容を追加します。 すぐにテンプレートをデプロイします。 コピーと貼り付けを行うのではなく、手動で入力することをお勧めします。これにより、Bicep ファイルの記述にツールがどのように役立つかを確認できます。

    targetScope = 'subscription'
    

    このコード行は、テンプレートがサブスクリプション スコープにデプロイされることを Bicep に伝えるものです。

ポリシー定義を追加する

  1. 先ほど追加した行の下に、次の変数定義を追加します。

    var policyDefinitionName = 'DenyFandGSeriesVMs'
    
  2. ファイルの末尾に、次の Azure Policy 定義を追加します。

    resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
      name: policyDefinitionName
      properties: {
        policyType: 'Custom'
        mode: 'All'
        parameters: {}
        policyRule: {
          if: {
            allOf: [
              {
                field: 'type'
                equals: 'Microsoft.Compute/virtualMachines'
              }
              {
                anyOf: [
                  {
                    field: 'Microsoft.Compute/virtualMachines/sku.name'
                    like: 'Standard_F*'
                  }
                  {
                    field: 'Microsoft.Compute/virtualMachines/sku.name'
                    like: 'Standard_G*'
                  }
                ]
              }
            ]
          }
          then: {
            effect: 'deny'
          }
        }
      }
    }
    

    このポリシー定義は、次のようなリソースにのみ適用されることに注意してください。

    • リソースの種類は Microsoft.Compute/virtualMachines である。
    • sku.name プロパティは、Standard_FまたはStandard_G で始まる。

    これらの条件に一致するリソースを作成しようとすると、Azure によってリソースの作成は拒否されます。

    警告

    ポリシー定義に "拒否" のポリシー効果を使用する場合、特にサブスクリプションや管理グループなどの広いスコープでは注意が必要です。 定義が正しく作成されていないと、予期せぬ影響が生じて障害につながる可能性があります。 "監査" ポリシー効果を使用することから始めて、必ず、ある程度の期間、正常に機能することを確認してから "拒否" 効果に切り替えることをお勧めします。

    ポリシー定義はサブスクリプションのスコープで作成しています。 つまり、この定義がデプロイされると、サブスクリプション内のすべてのリソース グループで使用できるようになります。

ポリシーを割り当てる

ポリシー定義は、適用されるまで何の効果もありません。 この手順では、ポリシー定義をサブスクリプションに適用する、2 つ目のサブスクリプションスコープのリソースをデプロイします。

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

    var policyAssignmentName = 'DenyFandGSeriesVMs'
    
  2. ファイルの末尾にあるポリシー定義リソースの下に、次のポリシー割り当てを追加します。

    resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
      name: policyAssignmentName
      properties: {
        policyDefinitionId: policyDefinition.id
      }
    }
    

    サブスクリプション全体に適用するようにポリシー割り当てを明示的に構成していないことに注目してください。 これは Bicep により認識されます。なぜなら、テンプレートがサブスクリプション スコープにデプロイされるからです。

  3. 変更をファイルに保存します。

テンプレートを確認する

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

targetScope = 'subscription'

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.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
    

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 列目をコピーします。 aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e のようになります。

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

    Set-AzContext -SubscriptionId {Your subscription ID}
    

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

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

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

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile

使い慣れた az deployment group create コマンドではなく、az deployment sub create コマンドを使用してサブスクリプションスコープのデプロイを作成していることに注目してください。

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

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile

使い慣れた New-AzResourceGroupDeployment コマンドレットではなく、New-AzSubscriptionDeployment コマンドレットを使用してサブスクリプションスコープのデプロイを作成していることに注目してください。

また、デプロイの名前と場所を明示的に指定していることにも注目してください。 この情報を使用して、デプロイのメタデータが Azure によって格納されます。

ヒント

デプロイ名には、今日の日付が含まれています。 そのため、別のデプロイと同じ名前を誤って使用する可能性が低くなります。

デプロイの完了には 1、2 分かかる可能性があります。その後、デプロイが成功したことがわかります。

Note

AuthorizationFailed というコードでエラー メッセージが表示された場合は、サブスクリプション スコープのリソースをデプロイするためのアクセス許可がない可能性があります。 Azure 管理者に依頼して、アクセス許可を付与してもらいます。 または、現在の Azure アカウントでこれらの要件を満たすことができない場合は、無料試用版を入手し、新しい Azure サブスクリプションとテナントを作成することができます。

デプロイを検証する

Azure portal では、サブスクリプションスコープのデプロイを確認できます。 これは、デプロイが正常に終了したことを確認し、結果を調べるのに役立ちます。

  1. Azure ポータルにアクセスします。

  2. 左側のペインで [サブスクリプション] を選択します。

  3. サブスクリプションを選択します。

  4. [検索] ボックスに「デプロイ」と入力し、[デプロイ] メニュー項目を選択します。

    Azure portal の [検索] ボックスと [デプロイ] メニュー項目のスクリーンショット。

  5. [デプロイ名] 列で、"sub-scope" で始まるデプロイを選択すると、どのリソースがデプロイされたかがわかります。

    デプロイ一覧が表示された Azure portal インターフェイスのスクリーンショット。

  6. [デプロイの詳細] を選択して展開します。 この場合、2 つの Azure Policy リソースが一覧表示されます。

    Azure portal の選択したデプロイの概要ペインのスクリーンショット。

リソースのクリーンアップ

サブスクリプションスコープのリソースが正常にデプロイされました。 次のコマンドを実行することで、作成したポリシー リソースを削除することができます。

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId

次の演習ユニットでは、同じポリシー リソースを再デプロイします。 再作成されますが、その後に再びクリーンアップすることができます。