Azure AutomationのPowerShell RunbookをマネージドIDに対応させる

はじめに

Azure関連の研修をする際に、管理用途でAzure Automation上でPowerShellを実行させて使っていました。

しばらく使ってなかったのですが、また利用する機会があるのでメンテナンスしようとしたところ、ID周りが変更になっていたのでまずそちらに対応させることにしました。

AutomationアカウントでマネージドIDを使うようにする

久しぶりにAutomateアカウントを確認したら、実行アカウントの証明書が期限切れになってしまっていました。

この状態になると証明書の更新が必要で、権限足りずに更新できなかったり、といったことが過去にありました。ひとまず更新しようと実行アカウントの確認に進んだのですが…

実行アカウントではなくマネージドID使ってね、という案内が出ていました。以前はこの表示がなかったので調べてみたところ、2021年10月の更新でマネージドIDが使えるようになったようです。

Azure Automation でのソース管理の統合で、実行アカウントではなく、マネージド ID を使用できるようになりました。 詳細については、ソース管理の統合の前提条件に関する記事を参照してください。

Azure Automation の新着情報 | Microsoft Docs

実行アカウントの場合、作成時にAzureAD側の権限が必要で別途社内的に申請が必要だったりしたので、マネージドIDで出来るのは楽ですね。

今回はお勧めに従い、マネージドIDを使うことにします。

既存のオートメーションアカウントを修正してもよかったのですが、Azure実行アカウントが不完全のまま修正できなかった(権限不足)こともあり、一度Automationアカウントを新しく作りました。

新しいAutomationアカウントでは、実行アカウントが設定されていない状態です。

既定でシステム割り当て済みマネージドIDが有効になっています。*1

RunbookでマネージドIDを使うようにする

実行アカウントの利用を前提で作成していたRunbookも修正が必要になりました。

以前は下記のようなコードを書いていました。Automationアカウントの認証がらみの部分だけ抜き出します。

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave –Scope Process

$connection = Get-AutomationConnection -Name AzureRunAsConnection

while(!($connectionResult) -And ($logonAttempt -le 10))
{
    $LogonAttempt++
    # Logging in to Azure...
    $connectionResult =    Connect-AzAccount `
                               -ServicePrincipal `
                               -Tenant $connection.TenantID `
                               -ApplicationId $connection.ApplicationID `
                               -CertificateThumbprint $connection.CertificateThumbprint

    Start-Sleep -Seconds 30
}

このままだと利用できないので、認証に関連する部分を下記の情報で書き換えます。

Azure Automation アカウントのシステム割り当てマネージド ID を使用する | Microsoft Docs

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

対象リソースにAutomationアカウントのマネージドIDの権限を設定する

実行アカウントを使わなくなったので、Runbookで制御したいリソースには、改めてマネージドIDを設定する必要があります。

対象のリソースやリソースグループでロールの割り当てを行います。この時にマネージドIDを選択します。

そうすると、マネージドIDが有効になったAutomationアカウントが出てくるので、適切なものを選びます。

動作テストを行う

今回は複数のリソースグループに対して権限を付与したかったので、サブスクリプション単位で権限を付けました。

そうすると失敗が怖いので、一度、Get系のコマンドで動作確認をしました。少し手を加えて、Automationアカウントが所属しているサブスクリプション以外のものを指定できるようにしています。

# マネージドIDでのテスト用

### 変数

$SubscriptionID = "--------------------"

#### システム割り当てマネージド ID を使用してアクセスを認証する

# https://docs.microsoft.com/ja-jp/azure/automation/enable-managed-identity-for-automation#authenticate-access-with-system-assigned-managed-identity

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionId $SubscriptionID -DefaultProfile $AzureContext

#### スクリプト実行

Get-AzResourceGroup | FT

無事、出力されました。

*1:ちなみに、以前に作成していたAutomationアカウントではここがオフになっていました。おそらくここをオンにすれば同様に利用できると思います

投稿者プロフィール
舟越 匠

舟越 匠

人材戦略部に所属。社内向けの技術研修をメインにしつつ、JBS Tech BlogやMS認定資格取得の推進役もやっています。資格としてはAzure Solutions Architect Expertを所持。Power AutomateやLogic Appsで楽をするのが好きです。

執筆記事一覧