演習 - サブスクリプションスコープのリソースをデプロイする
重要
この演習を行うには、独自の Azure サブスクリプションが必要です。また、料金が発生することがあります。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
プロジェクト Teddybear は本格的に始動しており、研究開発チームは、あなたから新しい Azure サブスクリプションへのアクセス権が付与されるのを待っています。 あなたはサブスクリプションを既に作成しましたが、チームにアクセス権を付与する前に、チームのポリシーに準拠した仮想マシンのみがデプロイされるようにする必要があります。 チームからは、F または G シリーズの仮想マシンをデプロイしたくないと言われています。
この演習では、チームのポリシーに基づいてサブスクリプションを構成する Bicep テンプレートを作成します。
このプロセスでは、次のことを行います。
- サブスクリプション スコープにデプロイする Bicep テンプレートを作成します。
- Azure Policy の定義と割り当てを追加します。
- テンプレートをデプロイし、結果を確認します。
この演習では、サブスクリプション スコープのリソースをデプロイするためのアクセス許可が必要です。 現在の Azure アカウントでこれらの要件を満たすことができない場合は、無料試用版を入手し、新しい Azure サブスクリプションとテナントを作成することができます。 または、この演習のデプロイ手順をスキップできます。
この演習では、Visual Studio Code 用の Bicep 拡張機能を使用します。 この拡張機能を Visual Studio Code にインストールしてください。
サブスクリプションスコープのテンプレートを作成する
Visual Studio Code を開きます。
main.bicep という名前の新しいファイルを作成します。
Visual Studio Code によって Bicep ツールが読み込まれるように、空のファイルを保存します。
[ファイル]>[名前を付けて保存] を選択するか、Windows で Ctrl+S (macOS では ⌘+S) を選択できます。 ファイルを保存した場所を忘れないようにしてください。 たとえば、保存場所として、scripts フォルダーを作成することをお勧めします。
main.bicep ファイルに次の内容を追加します。 すぐにテンプレートをデプロイします。 コピーと貼り付けを行うのではなく、手動で入力することをお勧めします。これにより、Bicep ファイルの記述にツールがどのように役立つかを確認できます。
targetScope = 'subscription'
このコード行は、テンプレートがサブスクリプション スコープにデプロイされることを Bicep に伝えるものです。
ポリシー定義を追加する
先ほど追加した行の下に、次の変数定義を追加します。
var policyDefinitionName = 'DenyFandGSeriesVMs'
ファイルの末尾に、次の 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 つ目のサブスクリプションスコープのリソースをデプロイします。
policyDefinitionName
の変数定義の下に、次の変数定義を追加します。var policyAssignmentName = 'DenyFandGSeriesVMs'
ファイルの末尾にあるポリシー定義リソースの下に、次のポリシー割り当てを追加します。
resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = { name: policyAssignmentName properties: { policyDefinitionId: policyDefinition.id } }
サブスクリプション全体に適用するようにポリシー割り当てを明示的に構成していないことに注目してください。 これは Bicep により認識されます。なぜなら、テンプレートがサブスクリプション スコープにデプロイされるからです。
変更をファイルに保存します。
テンプレートを確認する
テンプレートは次のようになります。
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 ツールがインストールされていることを確認します。
[ターミナル] メニューで、[新しいターミナル] を選択します。 通常、ターミナル ウィンドウは画面の下半分に表示されます。
ターミナル ウィンドウの右側に表示されるシェルが Bash の場合、正しいシェルが開いているので、次のセクションに進むことができます。
Bash 以外のシェルが表示された場合は、シェルのドロップダウン矢印を選択した後、[Azure Cloud Shell (Bash)] を選択します。
ターミナル シェルの一覧で、Bash を選択します。
ターミナルで、テンプレートを保存したディレクトリに移動します。 たとえば、それをテンプレート フォルダーに保存した場合、次のコマンドを使用します。
cd templates
Bicep をインストールする
次のコマンドを実行して、最新バージョンの Bicep がインストールされていることを確認します。
az bicep install && az bicep upgrade
Azure CLI を使用して Azure にサインインする
Visual Studio Code ターミナルで、次のコマンドを実行して Azure にサインインします。
az login
開いたブラウザーで、Azure アカウントにサインインします。
Visual Studio Code ターミナルには、このアカウントに関連付けられているサブスクリプションの一覧が表示されます。
この一覧で、この演習に使用するサブスクリプションを見つけます。
サインイン以降に一覧を見失った場合は、次のスニペットを使用してサブスクリプションを再び一覧表示することができます。
az account list --output table
このセッションで実行するすべての Azure CLI コマンドに対して、既定のサブスクリプションを設定します。
az account set --subscription "Your Subscription Name or ID"
このテンプレートを Azure にデプロイするには、Visual Studio Code ターミナルから Azure アカウントにサインインします。 Azure PowerShell がインストールされていることを確認します。
[ターミナル] メニューで、[新しいターミナル] を選択します。 通常、ターミナル ウィンドウは画面の下半分に表示されます。
ターミナル ウィンドウの右側に表示されるシェルが powershell または pwsh の場合、正しいシェルが開いているので、次のセクションに進むことができます。
Powershell または pwsh 以外のシェルが表示された場合は、シェルのドロップダウン矢印を選択し、[PowerShell] を選びます。
ターミナル シェルの一覧で、Powershell または pwsh を選択します。
ターミナルで、テンプレートを保存したディレクトリに移動します。 たとえば、それをテンプレート フォルダーに保存した場合、次のコマンドを使用します。
Set-Location -Path templates
Bicep CLI のインストール
Azure PowerShell で Bicep を使用するには、Bicep CLI をインストールします。
Azure PowerShell を使用して Azure にサインインする
Visual Studio Code ターミナルで、次のコマンドを実行して Azure にサインインします。
Connect-AzAccount
開いたブラウザーで、Azure アカウントにサインインします。
次のコマンドを実行して、この演習で使用するサブスクリプションの ID を取得します。
Get-AzSubscription
サブスクリプション ID は 2 番目の列です。 2 列目をコピーします。 aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e のようになります。
このセッションで実行するすべての 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 では、サブスクリプションスコープのデプロイを確認できます。 これは、デプロイが正常に終了したことを確認し、結果を調べるのに役立ちます。
Azure ポータルにアクセスします。
左側のペインで [サブスクリプション] を選択します。
サブスクリプションを選択します。
[検索] ボックスに「デプロイ」と入力し、[デプロイ] メニュー項目を選択します。
[デプロイ名] 列で、"sub-scope" で始まるデプロイを選択すると、どのリソースがデプロイされたかがわかります。
[デプロイの詳細] を選択して展開します。 この場合、2 つの Azure Policy リソースが一覧表示されます。
リソースのクリーンアップ
サブスクリプションスコープのリソースが正常にデプロイされました。 次のコマンドを実行することで、作成したポリシー リソースを削除することができます。
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
次の演習ユニットでは、同じポリシー リソースを再デプロイします。 再作成されますが、その後に再びクリーンアップすることができます。