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

はじめに

コスト分析のためにリソースグループにタグを設定していたのですが、リソースグループにタグを設定しても、コスト分析では利用できないことに気づきました。

リソースグループのタグがリソースに継承されない事は認識していたのですが、コスト分析でも利用できないと思っていませんでした…。

そのため、リソースグループ内のリソースにもタグを設定するための方法を考えました。

Azure Policyを使う方法が正攻法だとは思ったのですは、以前にPowerShellでリソースグループに設定されたタグをリソースに反映させた記憶があるので、それを再現してみることにしました。

リソースの用意

テスト用に、下図の様にリソースグループとリソースを用意しました。

PowerShellスクリプトの作成

まずは、対象リソースグループをdemo1に限定にして処理を確定し、複数リソースグループ対応は後に回したいと思います。

おおまかな方針

次の流れで処理をしようと考えました。

  1. Get-AzResourceGroupでリソースグループのタグ情報を取得する
  2. Get-AzResourceでリソースグループ内のリソースを取得する
  3. New-AzTagまたはUpdate-AzTagでリソースが所属しているリソースグループに設定されているタグをリソース自身に付与する

リソースグループのタグ情報を取得する

リソースグループの情報をタグ取得すること自体は簡単だったのですが、後々この部分で一番ハマりました。

docsですと、タグ一覧の表示にはGet-AzTagを使うようにかかれています。

docs.microsoft.com

上記のサンプルを元に、demo1のタグ情報を取得してみます。

$resourceGroup = Get-AzResourceGroup -Name demo1
Get-AzTag -ResourceId $resourceGroup.ResourceId

もちろん、このコマンドでも、タグ情報の取得は可能です。

Id         : /subscriptions/*****/resourceGroups/demo1/providers/Microsoft.Resources/tags/default
Name       : default
Type       : Microsoft.Resources/tags
Properties : 
             Name  Value 
             ====  ======
             tagA  ValueA
             tag1  value1

ところが、この結果を変数に格納して、New-AzTagに渡しても型が違うといわれてしまいます。

そこで、もう一つの方法として、Get-AzResourceGroupを使います。

$resourceGroup = Get-AzResourceGroup -Name demo1

変数に格納した後で、$resourceGroup.Tagsと入れると、同様にタグ情報を得ることが出来ます。

Name                           Value                                                                                                          
----                           -----                                                                                                          
tagA                           ValueA                                                                                                         
tag1                           value1 

リソースグループ内のリソースを取得する

続いて、リソースグループ内のリソースをすべて取得します。

Get-AzResource -ResourceGroupName demo1

結果を確認してみます。

PS > Get-AzResource -ResourceGroupName demo1 | FT Name,ResourceType

Name        ResourceType                     
----        ------------                     
vnet1       Microsoft.Network/virtualNetworks
fnkstorage1 Microsoft.Storage/storageAccounts

想定通り、仮想ネットワークとストレージアカウントが見つかりました。

後の処理のため、結果は変数に格納するようにしておきます。

$resources = Get-AzResource -ResourceGroupName demo1

リソースが所属しているリソースグループに設定されているタグをリソース自身に付与する

タグの設定はNew-AzTagコマンドを使います。

ただ、今回は、複数のリソースがある想定なので、`foreachを使います。

foreach($resource in $resources){
New-AzTag -ResourceId $resource.Id -Tag $resourceGroup.Tags
}

この時、-Tagパラメーターに$resourceGroup.Tagsを使います。(Get-AzTagの結果を渡そうとしたのですがうまくいきませんでした。)

スクリプト全体像

サインイン周りの処理も追加して、このようになりました。

# サブスクリプション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
}

実行後、Azureポータルで確認すると、リソースグループと同じタグが設定されていました。

ストレージアカウント

仮想ネットワーク

おわりに

まずは一つのリソースグループでタグをリソースに反映させることに成功しました。

次の記事では、このスクリプトを元に、複数のリソースグループに対してまとめて同じ処理を行うようにしたいと思います。

執筆担当者プロフィール
舟越 匠

舟越 匠(日本ビジネスシステムズ株式会社)

人材開発部に所属。社内向けの技術研修をメインにしつつ、JBS Tech BlogやMS認定資格取得の推進役もやっています。資格としてはAzure Solutions Architect Expertを所持。好きなサービスはPower Automate / Logic Apps。好きなアーティストはZABADAK。

担当記事一覧