リソースグループに設定しているタグ情報をリソースグループ内のリソースに反映する:PowerShell編-2-

はじめに

この記事は、以下の記事の続きとなります。

blog.jbs.co.jp

殆ど基本は出来ているのですが、現時点では特定のリソースグループに対してのみの実行となり使い勝手が悪いので、そこを改善したいと思います。

スクリプトを改修して複数リソースグループに対応させる

前回のスクリプトを振り返る

前回、ここまでは出来ています。

# サブスクリプション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やMS認定資格取得の推進役もやっています。資格としてはAzure Solutions Architect Expertを所持。好きなサービスはPower Automate / Logic Apps。好きなアーティストはZABADAK。

担当記事一覧