Azure DevOps/GitHubとAzure Automationを連携する

2024/12/09に公開

Azure DevOpsアドベントカレンダーの9日目に参加させて頂きました!

Azure Automationとソース管理を連携する方法を試したので、Azure DevOps(Git)とGitHubそれぞれとの連携方法について記載します。
Automation-ソース管理の認証の際に意外とハマってしまったので備忘がてら残しておきます。

公式docsはこちら
https://learn.microsoft.com/ja-jp/azure/automation/source-control-integration

Azure上でなにかしらの自動化をするためのスクリプトをRunbookとして発行

Azure AutomationとGitHubリポジトリやAzure DevOpsリポジトリを連携することで、リポジトリで管理されている自動化スクリプトをRunbookとして発行することができます。
さらに、適切に設定をすることでリポジトリでスクリプトに変更があった場合にも自動的にRunbookに同期されます。
これにより、運用タスクの自動化などに使用するスクリプトもリポジトリでバージョン管理することができます。

概要としてはこんな感じです。

ここでは、リポジトリでStart-AzureVM.ps1という仮想マシンを開始するためのPowerShellスクリプトをリポジトリで管理しています。
Automationアカウント側でソース管理に対する認証を行ってソース管理を追加することにより、Azure DevOps(TFVC or Git)やGitHubリポジトリと連携することができます。
このAutomationアカウントはマネージドIDを介して、Automationアカウントで操作する対象のAzureリソースに対する権限を持っています。
リポジトリと連携することによって、リポジトリに存在するスクリプト(ここではStart-AzureVM.ps1)がAutomation側にRunbookとして発行されます。
これにより、Automationがアクセス権限を持っているAzureリソースに対して、ソース管理から発行されたRunbookで操作をすることができるようになっています。

前提条件(Azure DevOps/GitHub共通)

連携をするために必要な前提条件(Azure DevOps/GitHub共通)は下記の通りです。

  1. Azure Automationアカウントが作成されていること
  2. 連携対象のGitHub/Azure DevOpsのリポジトリと同期対象のスクリプトが存在すること
  3. Autoamtionアカウントに、Automationから操作するAzureリソースに対するマネージドIDが構成されていること
  4. Automationアカウントに操作対象のAzureリソースへの共同作成者権限を付与する

1は当然っちゃ当然ですね。

2. 連携対象のGitHub/Azure DevOpsのリポジトリと同期対象のスクリプトが存在すること

今回は以下のようなAzureVMを開始するスクリプトを用意しました。

param (
    [string] $ResourceGroupName = "<YourResourceGroupName>",
    [string] $VMName = "<YourVirtualMachineName>"
)

# Step 1: Authenticate with Azure
Write-Output "Authenticating with Azure..."
Connect-AzAccount -Identity

# Step 2: Start the VM
Write-Output "Starting VM: $VMName in Resource Group: $ResourceGroupName"
Start-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -NoWait

# Completion message
Write-Output "VM start request submitted successfully."

これをリポジトリに保存します。こんな感じでアプリケーションのソースと混在しないようにautomation連携用のスクリプト専用のフォルダを切っておくとよいかなと思います。

3.Autoamtionアカウントに、Automationから操作するAzureリソースに対するマネージドIDが構成されていること

マネージドIDの構成はAutomationアカウント作成時に「システム割り当て」「ユーザー割り当て」のいずれかが選択できます。

システム割り当てのマネージドID

「システム割り当て」は、Azureリソースに関連付けられたマネージドIDをAzureによって自動的に作成・管理する方法です。
このIDは特定のリソース(ここではAutomationアカウント)にのみ関連付けられ、リソースのライフサイクルに応じて作成され、削除されます。
例えば、今回の場合だと、Automationアカウント自体にAzureリソースに対するアクセス権限を割り当てることになります。
これにより、Automationアカウントはユーザーの代わりAzureリソースに対する操作を行うことができます。

ユーザー割り当てのマネージドID

「ユーザー割り当て」は、事前に作成されたマネージドIDをAutomationアカウントに割り当てる方法です。
このIDは複数のリソースやサービス間で共有可能で、リソースのライフサイクルに依存しません。
複数のリソースやAutomationアカウントで共通のマネージドIDを使用したい場合はこちらの方法を使うことになります。複数のリソースに対するマスターキーのようなものですね。

システム割り当てにしろ、ユーザー割り当てにしろ、マネージドIDを使用することでシークレットをつかわずに認証することができ、さらにサービスプリンシパルを使う時のようなシークレットの有効期限切れも気にせずに済みます。

今回は特に複数のAutomationアカウントに対して権限を与えるわけではないので、システム割り当ての場合で紹介します。

4.Automationアカウントに操作対象のAzureリソースへの共同作成者権限を付与する:システム割り当てのマネージドIDの場合

権限を付与する方法は、portalからGUIで付与する方法とAzure CLIで付与する方法があります。

portalからの操作:Automationの設定から操作対象のAzureリソースに対する権限を与える方法(プレビュー)

作成したAutomationアカウントの左メニューで「ID」を選択して「Azureロールの割り当て」を押下

「ロール割り当ての追加」を押下

「スコープ」でそのAutomationアカウントがアクセスする範囲を(サブスクリプション/リソースグループ/Key Vault/ストレージ/SQLが選択可能)選択します。
今回の場合は操作対象のAzureリソースがいるリソースグループに対して共同作成者の権限を付与するので、「リソースグループ」を選択して、リソースグループで対象のリソースグループを選択して「役割」は「共同作成者」を選択します。
設定が完了したら保存ボタンを押下して完了です。

portalからの操作:操作対象のAzureリソースの設定からAutomationに対して権限を与える方法

Automationアカウントを作成したら、AutomationアカウントからAzureリソースへの操作ができるように権限を付与してあげます。
Azureポータルからこの操作を行う場合、Automationアカウントから作成する対象のAzureリソース(今回の場合リソースが存在するリソースグループに対して付与)に移動し、「アクセス制御(IAM)」に移動し、「追加」>「ロールの割り当てを追加」を押下

「特権管理者ロール」を選択して、「共同作成者」を選択し「次へ」を押下

「アクセスの割り当て先」で「マネージドID」を選択して、「マネージドID」で「Automationアカウント」を選択すると、作成したAutomationアカウントが表示されるので、権限を付与したいAutomationアカウントを選択

Azure CLIから付与する場合

以下のコマンドを実行します。
<YourAutoamtionPrincipalId>の箇所には、作成したAutomationアカウントのIDに記載されているオブジェクト(プリンシパルID)を設定します。
<YourSubscriptionId>には使用するサブスクリプションのIDを、
<YourTargetResouceGroupName>にはAutomationで操作する対象のAzureリソースがいるリソースグループの名前を設定します。

az role assignment create \
    --assignee <YourAutoamtionPrincipalId> \
    --role "Contributor" \
    --scope "/subscriptions/<YourSubscriptionId>/resourceGroups/<YourTargetResouceGroupName>"

Automationからソース管理を追加して連携する

Automationとリポジトリを連携するためには、Automationの左メニューのアカウント設定>ソース管理から追加します。

Azure DevOps(Git)の場合

「ソース管理の概要」画面の「ソース管理の種類」で「Azure DevOps(Git)」を選択します。
「認証」ボタンを押下

こういうAzure DevOpsへの認証画面が出るのでAcceptを押下

認証に成功すると、Auzre DevOpsのリポジトリが表示されるので連携したいリポジトリを選択。

リポジトリを選択すると、そのリポジトリのブランチが選べるようになるので「ブランチ」で連携対象のブランチを選択して、「フォルダーのパス」でスクリプトがいるフォルダのパスを指定。
「自動同期」をオンにしたら、指定したフォルダのパスの配下にいるスクリプトファイルが変更されたらAutomationのRunbookにも同期されます。

Runbookの発行をオンにすると、Automationアカウントにスクリプトファイルを同期した後にスクリプトファイルの単位でRunbookとして発行されます。

設定が完了したら、「保存」を押下すると同期されて、Runbookに発行されます。

GitHubの場合

「ソース管理の概要」画面の「ソース管理の種類」でGitHubを選択します。
「認証」ボタンを押下

すると、別ウィンドウが開いてGitHubへの認証を求められるので、この画面でGitHubにログインします。

GitHubへの認証が完了すると、どのOrganizationに対するアクセス許可を与えるかが表示されます。

連携したいリポジトリがいるOrganizationに対して「grant」を押下してアクセス許可を与えてあげてください。
ここでgrantを押下して明示的にリポジトリが存在するOrganizationに対する権限を与えてあげないと、Publicリポジトリであってもここのソース管理の連携の設定でリポジトリを指定する箇所に対象のリポジトリが表れてくれません。
(よく見ないでそのまま「Authorize Authetification」押してしまって認証しないように注意。。。)

※grantが表示されるのは自分がOwnerであるOrganizationです。自分がOwnerでないOrganizationに対して連携したい場合は「Request」ボタンが表示され、Ownerにリクエストを送ることになります。
「やばい、Organizationに許可与えるの忘れた~」とか「Organization作ったばっかりだからかなんか出てこないな?」とかの事象が起きたら、automationアカウントのソース管理の設定画面で「最新の情報に更新」を押下してもう一度試してみてください。
(これ最初にOrganizationへの許可するのをスルーしてしまって、Public reposなのに出てこねーぞ!って焦った・・・)

GitHubへの認証とOrganizationへのアクセス許可が完了したらあとはAzure DevOpsの場合と同じ。
連携対象のリポジトリとブランチ、その中のスクリプトがいるフォルダのパスを指定してあげて、自動同期の設定をすれば完了。

注意事項

すでに発行されたRunbookの種類を変えるような変更をしない

リポジトリにいるスクリプトファイルがAutomationにRunbookとして発行される際には、同期したスクリプトの内容から自動でRunbookの種類が設定されます。

リポジトリにいるスクリプトの種類をすでに発行されているRunbookの種類から変えるような変更(例えば単純なPowerShellスクリプトからPowerShellワークフローに変えるなど)をリポジトリ側でしてしまうと、同期が失敗してしまいます。
スクリプトの種類を変えるときは、別でスクリプトを作るか、既存の同期されたRunbookを削除してRunbookの種類がコンフリクトしないようにしてください。

同期の方向性

Automationとソース管理の同期は、ソース管理→Automationの一方向のみです。

Discussion