タグ付け自動化で管理コスト削減!
2023-12-19
azblob://2023/12/19/eyecatch/2023-12-19-auto-set-tag-000.jpg

今回はAzure Functionsを使用してリソースの作成者名を自動でタグ付けしていこうと思います。

この記事は、Using Event Grid/Azure Functions to automatically assign tag:owner to Azure resourcesを参考にしたものとなります。

それでは早速作成していきましょう。

Azure PortalからAzure Functionsを作成する

まずはPortalからAzure Functionsを作成していきます。

ランタイムスタックをPowerShell Coreとして、そのほかはデフォルトのままで作成します。

Azure Functionsの作成

作成できたら、作成したリソースへ移動し左ブレードのIDからシステム割り当てマネージドIDを有効にします。

マネージドIDを有効にできたらロールの割り当てを行います。

ロールの割り当て

ここまでできたらPortalでのAzure Functionsの設定は完了です。

VSCodeから関数を作成する

Azure FunctionsではPortalやVSCodeから関数を作成することができます。

今回使用するEvent Grid TriggerはPortalからの作成ができないため、VSCodeを使用して作成していきます。

VSCodeでAzure Toolsの拡張機能をインストールしておきます。

拡張機能のAzureからWORKSPACEにあるAzure FunctionsのアイコンをクリックしCreate Function...をクリックします。

関数の作成

保存先のフォルダを選択したら言語はPowerShellを選択し、テンプレートはAzure Event Grid triggerを選択します。

名前は何でもよいですがわかりやすい名前にしておきましょう、私はAutoAssignCreatorにします。

最後にファイルを開く場所を選択すると作成されたファイルが開かれます。

作成されたファイルの編集

まずはrun.ps1の中身を編集していきます。

run.ps1に以下のコードを記述します。

param($eventGridEvent, $TriggerMetadata)

# Managed Identityを使用してログイン
Connect-AzAccount -Identity
 
# リソース作成者の名前を取得
$caller = "{0} ({1})" -f $eventGridEvent.data.claims.name, $eventGridEvent.data.claims."http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
Write-Host "Caller: $caller"
$resourceId = $eventGridEvent.data.resourceUri
Write-Host "ResourceId: $resourceId"
 
# リソース作成者名またはリソースIDがnullの場合実行を中止
if (($null -eq $caller) -or ($null -eq $resourceId)) {
    Write-Error "ResourceId or Caller is null"
}
 
$ignore = @("providers/Microsoft.Resources/deployments", "providers/Microsoft.Resources/tags")
 
# トリガー内容が$ignoreに指定されたケースの場合実行を中止
foreach ($case in $ignore) {
    if ($resourceId -match $case) {
        Write-Error "Skipping event as resourceId contains: $case"
    }
}
 
$tags = (Get-AzTag -ResourceId $resourceId).Properties
 
# リソース作成者名のタグがない場合にタグを追加
if (($null -eq $tags) -or ($null -eq $tags.TagsProperty) -or (!($tags.TagsProperty.ContainsKey('Creator')))) {
    $tag = @{
        'Creator' = $caller
    }
    Update-AzTag -ResourceId $resourceId -Operation Merge -Tag $tag
    Write-Host "Added creator tag with user: $caller"
}
else {
    Write-Host "Tag already exists"
}

次に、requirements.psd1ファイルを編集し実行に必要となるPowerShell モジュールをインストールします。

(既存で記述されているコメントアウト部分は削除した状態で載せてます。あっても無くてもいいです)

@{
    'Az.Accounts'  = '2.*'
    'Az.Resources' = '4.*'
}

ここまでで一通りファイルの編集が終わりました。

最後に作成した関数をAzure Functionsにデプロイし、Azure Portalから設定を加えると完了です。

関数のデプロイ

それでは、作成した関数をAzure Functionsにデプロイしていきます

関数のデプロイ

拡張機能のAzureからWORKSPACEにあるAzure FunctionsのアイコンをクリックしDeploy to Function App...をクリックします。

サブスクリプションの選択タブが出てくるので対象のサブスクリプションを選択し、デプロイ先のリソースを選択します。

最終確認が出てくるのでDeployをクリックするとデプロイが始まります。

デプロイが完了したらPortalからAzure Functionsに移動します。

デプロイ後のAzure Functions

Azure Functionsの概要画面の関数にデプロイした関数があればOKです。

実行前の最終準備

最後にイベントサブスクリプションを作成していきます。

先ほどのAzure Functionsの概要画面の関数からデプロイした関数に移動します。

左ブレードの統合からトリガーのEvent Grid Triggerをクリックすると右側にトリガーの編集タブが出てくるのでEvent Grid サブスクリプションの作成をクリックします。

以下のように設定します。

イベントサブスクリプションの作成

イベントサブスクリプションが作成できたら動作確認をしていきましょう。

動作確認

それでは動作確認のために適当なリソースを作成していきます。

私はリソースグループを作成しました。

タグが追加されるまで数分待つと、画像のように作成したリソースグループのタグに名前が追加されました!

動作確認

これで動作確認は終了です。

まとめ

今回はAzure Functionsを使用してリソースに作成者の名前を自動でタグ付けしてみました。

テスト用の環境などは誰が作ったリソースなのか管理が面倒くさくなってしまいがちなのでなかなか便利なのではないでしょうか。

リソース管理に困っている方は是非参考にしていただければと思います。