Azure Automation実行アカウントをマネージドIDに移行する

Azure Automation実行アカウントが2023/9/30に廃止され、マネージドIDへの移行が必要になります。
これまで実行アカウントの証明書期限切れチェックが必要だったのでマネージドIDへの移行は嬉しいものの、既存Runbookに影響を及ぼす場合があります。
[公式手順](https://learn.microsoft.com/ja-jp/azure/automation/migrate-run-as-accounts-managed-identity?tabs=sa-managed-identity)でやり方は書いてあるものの、エラーになったり細かい手順を残したかったのでまとめます。

# 変更するRunbook
* かなり前に使っていたVM自動起動/停止のRunbookが実行アカウントを利用していたので、これをマネージドIDに変更することにします。

```powershell
Param(
    [string]$Action,
    [string]$VMName,
    [string]$ResourceGroupName
)

$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationID $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint

if ($Action -eq "stop")
{
    Write-Output "Stopping VM"
    Stop-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
}
elseif ($Action -eq "start")
{
    Write-Output "Starting VM"
    Start-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName
}
else
{
    throw "Please specify start or stop for the parameter"
}
```

# マネージドID設定
* Automationアカウントの左メニューから[ID]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/21286d0b-1545-e8ff-e295-ff09ab652e38.png)

* システム割り当てIDもしくはユーザー割り当てIDを有効にします。システム割り当てとユーザー割り当ての違いは [AzureユーザーマネージドIDを使ったVM→Blobへのアップロード](https://qiita.com/shingo_kawahara/items/0c2afba18c2a72d10db8) に以前まとめてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/9ac15e1e-7a55-2bc9-6d91-352851a2ad4e.png)

# RBAC設定
* 今回VMの起動/停止を対象とするので該当VMに権限設定を入れていきます。該当VMの左メニューから[アクセス制御(IAM)]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/3606b4ef-b921-8b8a-d8b5-e2b1fd6ecc9c.png)

* [ロールの割り当ての追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/bdb717e9-d2ee-7c16-37db-80302a21d91f.png)

* 必要最小権限のロールを選択します。今回は[仮想マシン共同作成者]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a9ec147f-801c-9e20-60b1-ae773f2a957e.png)

* [マネージドID]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/616e0e56-36f9-e4b5-444c-75e612db98b3.png)

* 先ほど設定したAutomationが出てくるはずなので選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4cc98840-8d28-cfee-0888-ce33cb62154f.png)

# Runbookエクスポート/インポート
* 公式手順でもいきなりRunbookを修正するのではなく一度コピーしてからやってね。と記載があります。Runbookのコピー機能はないので一度エクスポートしてからインポートして新たなRunbookを作成します。
* 対象のRunnbookを選択し[エクスポート]を選択します。PowerShellスクリプトがローカルにダウンロードされたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/60d93b60-b156-a4ac-3d3e-4639ed24f111.png)

* Automation左メニューの[Runbook]から[Runbookのインポート]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6f77ff9b-f244-02a0-593c-625775f5cd39.png)

* 先ほどダウンロードしたPowerShellスクリプトを選択し、ランタイムバージョン等を現行に合わせてインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ce7571bc-8f15-6185-bfe6-be51f035ddc5.png)

# Runbook修正
* 先ほどインポートした新しいRunbookを修正します。

```powershell
Param(
    [string]$Action,
    [string]$VMName,
    [string]$ResourceGroupName
)

# $Conn = Get-AutomationConnection -Name AzureRunAsConnection
# Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationID $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint

try
{
    "Logging in to Azure..."
    Connect-AzAccount -Identity
}
catch {
    Write-Error -Message $_.Exception
    throw $_.Exception
}

if ($Action -eq "stop")
{
    Write-Output "Stopping VM"
    Stop-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
}
elseif ($Action -eq "start")
{
    Write-Output "Starting VM"
    Start-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName
}
else
{
    throw "Please specify start or stop for the parameter"
}
```

# テスト
* 修正したRunbookを実際に動かしてみます。私の環境では以下のエラーが出ました。

```
The term 'Connect-AzAccount' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
```

* Connect-AzAccountコマンドがないよっていうエラーですね。私の環境ではずっとAutomationモジュールの更新をしていなかったので出たエラーです。

# AZモジュール更新(必要なら)
* Automationアカウントの左メニューから[モジュール]を選択し、[Azモジュールの更新]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/5225f1e7-b05d-4460-a5fe-3a9390f4edd9.png)

* 以下の状態で更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/66415e6c-cdc0-8df4-fb1c-cca87adb6211.png)

* ここで注意しないといけないのが、モジュールの更新をすると、このAutomationアカウントに登録されているRunbook全体で古いコマンドが使えなくなるということです。私の環境ではStop-AzureRmVMコマンドを使っていましたが、Stop-AzVMコマンドに変更しました。

# 運用Runbookに適用
* テストしてみて問題なければ運用Runbookにも同じ変更を適用して完了です。

# 変更対象
* 全てのRunbookが対象というわけではなく、あくまでも実行アカウントに依存したコマンドを使ったRunbookのみが変更対象となります。今回の例だとこの部分です。

```
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationID $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
```

以上です。