はじめに
コスト分析のためにリソースグループにタグを設定していたのですが、リソースグループにタグを設定しても、コスト分析では利用できないことに気づきました。
リソースグループのタグがリソースに継承されない事は認識していたのですが、コスト分析でも利用できないと思っていませんでした…。
そのため、リソースグループ内のリソースにもタグを設定するための方法を考えました。
Azure Policyを使う方法が正攻法だとは思ったのですは、以前にPowerShellでリソースグループに設定されたタグをリソースに反映させた記憶があるので、それを再現してみることにしました。
リソースの用意
テスト用に、下図の様にリソースグループとリソースを用意しました。
PowerShellスクリプトの作成
まずは、対象リソースグループをdemo1に限定にして処理を確定し、複数リソースグループ対応は後に回したいと思います。
おおまかな方針
次の流れで処理をしようと考えました。
Get-AzResourceGroup
でリソースグループのタグ情報を取得するGet-AzResource
でリソースグループ内のリソースを取得するNew-AzTag
またはUpdate-AzTag
でリソースが所属しているリソースグループに設定されているタグをリソース自身に付与する
リソースグループのタグ情報を取得する
リソースグループの情報をタグ取得すること自体は簡単だったのですが、後々この部分で一番ハマりました。
docsですと、タグ一覧の表示にはGet-AzTag
を使うようにかかれています。
上記のサンプルを元に、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。
担当記事一覧