はじめに
この記事は、以下の記事の続きとなります。
殆ど基本は出来ているのですが、現時点では特定のリソースグループに対してのみの実行となり使い勝手が悪いので、そこを改善したいと思います。
スクリプトを改修して複数リソースグループに対応させる
前回のスクリプトを振り返る
前回、ここまでは出来ています。
# サブスクリプションid $SubscriptionID = "*****-*****" Connect-AzAccount $context = Get-AzSubscription -SubscriptionId $SubscriptionID Set-AzContext $context # 1. Get-AzResourceGroupでリソースグループのタグ情報を取得する $resourceGroup = Get-AzResourceGroup -Name demo1 # 2. Get-AzResourceでリソースグループ内のリソースを取得する $resources = Get-AzResource -ResourceGroupName demo1 # 3. New-AzTagまたはUpdate-AzTagでリソースが所属しているリソースグループに設定されているタグをリソース自身に付与する foreach($resource in $resources){ New-AzTag -ResourceId $resource.Id -Tag $resourceGroup.Tags }
リソースグループがdemo1決め打ちになっているので、ここを改善したいと思います。
複数のリソースグループを読み込む
サブスクリプション内のリソースグループを全て読み込むという手もありますが、全部対象だとそれはそれで使い勝手が悪いので、今回は、「demo」という名前の含まれるリソースグループのみを対象とするようにしたいと思います。
が、「demo」ではなく「test」だったり「hoge」だったりするかもしれないので、リソースグループの冒頭の名前を変数で指定するようにしておきます。
# リソースグループに含まれる共通の名前を定義する $preRG = "demo" # 対象のリソースグループを取得 $RGs = Get-AzResourceGroup -Name $preRG*
念のため確認してみると、demoの含まれたリソースグループだけを取得できています。
PS > $RGs | FT ResourceGroupName ResourceGroupName ----------------- demo1 demo2 demo3
複数のリソースグループに対してタグを取得してリソースに反映する
後は、前回の処理を取得したリソースグループすべてに対して実行するようにします。
前回の処理部分だけを切り出すとこうなります。
# 1. Get-AzResourceGroupでリソースグループのタグ情報を取得する $resourceGroup = Get-AzResourceGroup -Name demo1 # 2. Get-AzResourceでリソースグループ内のリソースを取得する $resources = Get-AzResource -ResourceGroupName demo1 # 3. New-AzTagまたはUpdate-AzTagでリソースが所属しているリソースグループに設定されているタグをリソース自身に付与する foreach($resource in $resources){ New-AzTag -ResourceId $resource.Id -Tag $resourceGroup.Tags }
これをforeachに入れるんですが、1の処理はリソースグループの情報取得なので、今回はすでに出来ている状態です。 なので、1の処理は省いてしまいます。
また、2,3の処理は、最初の繰り返しである$RGを使うように変更します。 結果、このようになります。
foreach($RG in $RGs){ # 2. Get-AzResourceでリソースグループ内のリソースを取得する $resources = Get-AzResource -ResourceGroupName $RG.ResourceGroupName # 3. New-AzTagまたはUpdate-AzTagでリソースが所属しているリソースグループに設定されているタグをリソース自身に付与する foreach($resource in $resources){ New-AzTag -ResourceId $resource.Id -Tag $RG.Tags } }
スクリプト全体像
サインイン周りの処理も追加して、このようになりました。
# サブスクリプションid $SubscriptionID = "*****-*****" Connect-AzAccount $context = Get-AzSubscription -SubscriptionId $SubscriptionID Set-AzContext $context # リソースグループに含まれる共通の名前を定義する $preRG = "demo" # 対象のリソースグループを取得 $RGs = Get-AzResourceGroup -Name $preRG* foreach($RG in $RGs){ # Get-AzResourceでリソースグループ内のリソースを取得する $resources = Get-AzResource -ResourceGroupName $RG.ResourceGroupName # New-AzTagまたはUpdate-AzTagでリソースが所属しているリソースグループに設定されているタグをリソース自身に付与する foreach($resource in $resources){ New-AzTag -ResourceId $resource.Id -Tag $RG.Tags } }
おわりに
これで、複数のリソースグループに対して、リソースグループのタグをリソースに反映できるようになりました。
実用上は十分かなとも思ったのですが、リソースにすでにタグが設定されていた場合にどのような挙動になるのか気になりました。
という事で、次は、リソースにすでにタグが設定されていた場合の挙動について調べたいと思います。
舟越 匠(日本ビジネスシステムズ株式会社)
人材開発部に所属。社内向けの技術研修をしつつ、JBS Tech Blog編集長を兼任。2024年8月からキーマンズネットでPower Automateの連載を開始。好きなサービスはPower AutomateやLogic Apps。好きなアーティストはZABADAKとSound Horizon。
担当記事一覧