
この記事はFIXER Advent Calendar 2021(https://adventar.org/calendars/6837)12日目の記事です
マネージドIDというものを使うと、サービスプリンシパルを用意せずにAzureリソースからAzureリソースの操作を実施することができます。
Runbookを用いてプライベートDNSゾーンの操作を自動化を実施することを想定してその手順を用意してみました。
料金的にもリーズナブルで、すべてAzureポータル上の作業で完結するので、一度やってみましょう。
操作対象のリソース(プライベートDNSゾーン)の用意
AzureポータルからDNSゾーンを作成します。
DNSゾーンの名前は private.example.com
、リソースグループ名は blog
で作成してみました。

このままVNETに接続しなければ宝の持ち腐れですが、今回は説明用ということで。
Runbookの用意
AzureポータルからAutomationアカウントを作成します。
名前は blogaccount
とか、任意で大丈夫です。
作成時に詳細設定でマネージドIDの設定ができるので、デフォルトの通り「システム割り当て」をオンにしておいてください。
(Automationアカウントの作成後、アカウント設定 - IDから、システム割り当てマネージド IDを「オン」にしても大丈夫です)

Automationアカウントが作成されたら、Automationアカウントのポータル画面から プロセス オートメーション - Runbookを開き、+Runbookを作成を選択します。
Runbookの種類にPowerShellを選び、ランタイムバージョンは5.1を選んで作成します。
Runbook名は Add-PrivateDnsRecord
にしましょうか。

PowerShellのコードを記載する画面になりますが、一旦そっと閉じます。
マネージドIDが プライベートDNSゾーンを操作できるようにする
AzureポータルからプライベートDNSゾーンの「アクセス制御(IAM)」を開きます。
上の「+追加」を押して、「ロールの割り当ての追加」をクリックします。

ロールの一覧が出るので、「プライベート DNS ゾーンの共同作成者」を選択して次へを押します。
メンバーの選択画面になるので、アクセスの割当先を「マネージド ID」にして、「+メンバーを選択する」をクリックします。
すると、マネージドIDの選択画面が表示されるので、マネージドIDのプルダウンから「Automation アカウント」を選択し、先ほど作成したAutomationアカウントの名前(記事通りであれば blogaccount
)を選択して「選択」をクリックします。
「レビューと割り当て」をクリックすると、ロールの割り当てが完了し、Automationアカウント(のRunbook等)からプライベートDNSゾーンがマネージドIDで操作できるようになりました。

プライベートDNSゾーンを操作するPowerShellを実装する
再びAutomationアカウントのポータル画面に戻り、 プロセス オートメーション - Runbookを開き、 作成した空のRunbook(Add-PrivateDnsRecord
)を開きます。
「編集」をクリックして、下記のPowerShellを記載し保存、公開してください。
Add-AzAccount -identity
New-AzPrivateDnsRecordSet -Name db -RecordType A -ZoneName private.example.com `
-ResourceGroupName blog -Ttl 3600 `
-PrivateDnsRecords (New-AzPrivateDnsRecordConfig -IPv4Address "10.2.0.4")
1行目の Add-AzAccount -identity
により、マネージドIDを利用してAzureにログインした状態になります。
サービスプリンシパルの場合はクレデンシャル情報を作って Connect-AzAccount
を使用するので面倒ですが、マネージドIDはシークレットの概念が無いのでシンプルですね。
2行目の New-AzPrivateDnsRecordSet
で、プライベートDNSゾーンにレコードを追加します。
Runbookを実行してみる
公開されたRunbookは「開始」ができるようになります。
(保存だけではダメです、公開しましょう)

開始を押してみましょう。ジョブの画面が表示されます。
「全てのログ」のところを開いておくと、処理完了後に自動的に情報が出るようです。
エラーなどが出ていなければ成功してしそうなので、プライベートDNSゾーンの画面に行ってみましょう。
Aレコードが追加されていたら成功です!

まとめ
マネージドIDを使用して、権限面で安全にAzureリソースの操作ができることが分かりました。
TerraformやRunbookのWebhookを活用すれば、高度な自動化処理も実現できますね。
運用負荷軽減の自動化、頑張っていきましょう!