😀

Azure Policy でリソースグループ内のリソースに自動で同じタグを付与する

に公開

背景と目的

Azure で作成するリソースをテナント、サブスクリプション、リソースグループをグルーピングする単位として組織やチーム、プロジェクトや本番開発環境ごとに割り当てて使用されているケースがほとんどでは無いかと思います。タグは、テナント、サブスクリプション、リソースグループをまたがって何かしらをグルーピングしたい時に使用するものですが、マイクロソフトのタグ関連のドキュメンのサンプルにも CostCenter というキーワードが出てくるように、このリソースはどこどこ組織やどこどこチームのコストとして集計したい場合が多いように感じます。もちろん、高度に自動化した組織やチームであれば、タグで自動化処理のグルーピング単位を管理して使っていたりと別の用途も考えられます。

今回はリソースグループ単位でチームを分けているケースにおいて、基本的にはリソースグループに付けられている CostCenter タグと同一の値をリソースグループ内のリソースに付与するものの、ある特定のリソースだけ別のチームにコストを負担してもらうため CostCenter タグに違う値を設定する、というのを試してみます。

前提条件

コマンドの実施環境は、Azure Cloud Shell + Azure CLI です。

bash
$ az version
{
  "azure-cli": "2.33.0",
  "azure-cli-core": "2.33.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {
    "ai-examples": "0.2.5",
    "ssh": "1.0.0"
  }
}

検証用のリソースグループを作成

bash
# 環境変数をセットします
region=japaneast
prefix=mnrtagtest

# リソースグループをタグ付きで作成します
az group create \
  --name ${prefix}-rg \
  --location $region \
  --tags CostCenter=MyTeam

リソースグループのタグを自動でリソースに付与する Azure Policy を作成

bash
# CostCenter タグを自動追加する設定を作成します
az policy assignment create \
  --name ${prefix}-rg-tag-costcenter \
  --scope $(az group show \
    --name ${prefix}-rg \
    --query id \
    --output tsv) \
  --policy $(az policy definition list \
    --query "[?displayName=='Append a tag and its value from the resource group'].name" \
    --output tsv) \
  --params '{"tagName": {"value": "CostCenter"}}'

リソースを作成してタグが自動追加されているか確認

bash
# 仮想ネットワークをタグなしで作成します
az network vnet create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet

# リソースグループ内のタグを確認します
az resource list \
  --resource-group ${prefix}-rg \
  --query "[].{Name:name, CostCenter:tags.CostCenter}" \
  --output table 

Name             CostCenter
---------------  ------------
mnrtagtest-vnet  MyTeam

リソースを作成してタグに任意の値が設定されているか確認

bash
# 仮想ネットワークをタグ付きで作成します
az network vnet create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet-otherteam \
  --tags CostCenter=OtherTeam

# リソースグループ内のタグを確認します
az resource list \
  --resource-group ${prefix}-rg \
  --query "[].{Name:name, CostCenter:tags.CostCenter}" \
  --output table 

Name                       CostCenter
-------------------------  ------------
mnrtagtest-vnet            MyTeam
mnrtagtest-vnet-otherteam  OtherTeam

参考

bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg

下記は、参考サイトです。

https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/tag-resources?tabs=json#azure-cli

https://docs.microsoft.com/ja-jp/azure/governance/policy/tutorials/govern-tags

Discussion