OpenID Connect を使ってGitHub Actions からAzure にログインする
今回はGitHub 社が提供しているGitHub Actions でAzure リソースの操作などを行う準備として、OpenID Connect を使ってGitHub Actions からAzure アカウントにログインする方法について説明します。

実行環境
記事内のAzure CLI コマンドはAzure CloudShell で実行とします。
Azure CLl | 2.50.0 |
|---|
前提条件
- GitHub のアカウントおよびAzure のアカウントを持っていること。
- GitHub Actions 用のリポジトリを作成していること。
GitHub Actions からAzure を操作するには
GitHub Actions からAzure のリソースを作成したりAzure CLI 操作を行うためには、GitHub Actions でAzure のログインを行う必要があります。GitHub Actions のタスクでAzure のログインを行う方法は2つあります。
- OpenID Connect でAzure にログインする。
- サービスプリンシパルのシークレットでAzure にログインする。
今回はサービスプリンシパルのフェデレーション資格情報を利用した方法でログインを行っていきます。
リソースグループの作成
初めにサービスプリンシパルを割り当てるリソースグループを作成します。
# リソースグループを作成する
az group create -n azlogin-rg -l japaneastサービスプリンシパルの作成
リソースグループ作成後、GitHub Actions からAzure へログインするために必要なサービスプリンシパルを作成します。スコープについては先程作成したリソースグループID を変数に格納して利用します。
# リソースグループのIDとアプリケーション名を変数に格納する
resourceGroupId=$(az group show -n azlogin-rg --query "id" -o tsv)
servicePrincipalName="GitHubActionsLoginTest"
サービスプリンシパルを作成する
az ad sp create-for-rbac --name $servicePrincipalName --role contributor --scopes $resourceGroupId --sdk-authサービスプリンシパル作成後、JSON形式でサービスプリンシパルの情報が出力されます。こちらはGitHub Actions の資格情報として利用するため控えておきます。
{ "clientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "clientSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "subscriptionId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "activeDirectoryEndpointUrl": "https://login.microsoftonline.com", "resourceManagerEndpointUrl": "https://management.azure.com/", "activeDirectoryGraphResourceId": "https://graph.windows.net/", "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/", "galleryEndpointUrl": "https://gallery.azure.com/", "managementEndpointUrl": "https://management.core.windows.net/"}今回は動作確認のためロールをContributor としておりますが、Contributor はリソースの作成、削除など強い権限を持っているため、業務などで利用する際は環境に合わせたロールを付与してください。
フェデレーション資格情報の作成
サービスプリンシパル作成後、OpenID Connect 用のフェデレーション資格情報を作成します。今回は以下のGitHub の情報を利用するため、利用する際はrepo とenvironment の値を各自の環境に合わせた値に修正してください。
名前 | azure-login |
|---|---|
GitHub 組織名 | kdkwakaba |
リポジトリ名 | azurelogintest |
環境名 | Production |
# サービスプリンシパルのアプリケーションIDを変数に格納するapplicationId=$(az ad sp list --display-name "GitHubActionsLoginTest" --query "[].appId" -o tsv)
資格情報のJSONファイルを作成
cat <<EOF > credential.json{ "name": "azure-login", "issuer": "https://token.actions.githubusercontent.com", "subject": "repo:kdkwakaba/azlogintest:environment:Production", "description": "This credential is azure login test.", "audiences": [ "api://AzureADTokenExchange" ]}EOF
フェデレーション資格情報を作成する
az ad app federated-credential create --id $applicationId --parameters credential.json実行に成功するとJSON 形式で結果が出力されます。
{ "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#applications('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')/federatedIdentityCredentials/$entity", "audiences": [ "api://AzureADTokenExchange" ], "description": "This credential is azure login test.", "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "issuer": "https://token.actions.githubusercontent.com", "name": "azure-login", "subject": "repo:kdkwakaba/azlogintest:environment:Production"}資格情報をGitHub のシークレット に登録
GitHub Actions からAzure にログインするためには資格情報が必要となりますが、資格情報を平分でメタデータファイルに記載するのはセキュリティ上推奨されません。そのため、今回は資格情報をGitHub のSecret に登録し、Secret をメタデータファイルで使用する方法とします。
GitHub Actions を利用するリポジトリの設定画面から、「Settings > Secrets and variables > Actions」を選択し、「New repository secret」から以下のシークレットを作成します。
AZURE_CLIENT_ID | アプリケーション (クライアント) ID (JSON で控えたclientId の値) |
|---|---|
AZURE_TENANT_ID | ディレクトリ (テナント) ID (JSON で控えたtenantId の値) |
AZURE_SUBSCRIPTION_ID | サブスクリプション ID ()JSON で控えたsubscriptionId の値 |
GitHub Actions からAzure にログイン
GitHub Actions 用の資格情報が作成できたら、GitHub Actions のAction ファイルからAzure にログインします。今回はAzure にログイン後、リソースグループを表示させるジョブを実行させます。ディレクトリを作成していない場合は「.github/workflows」のディレクトリを作成し、拡張子「.yml」のメタデータファイルを作成します。
name: OpenID Connect Login Test
on: push: branches: - main
permissions: id-token: write contents: read
jobs: build-and-deploy: runs-on: ubuntu-latest # フェデレーション資格情報で環境を指定した場合、環境名と一致させる必要がある environment: name: Production steps: - name: "Az CLI login" uses: azure/login@v1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: "Run Azure CLI commands" run: | az group list -o tableファイルをmain ブランチにpush したらGitHub Actions が実行されるため、Login のタスクで「Login successful.」が表示されること、Azure CLI コマンド実行タスクでリソースグループが表示されることを確認します。

リソースのクリーンアップ
動作確認後、作成したリソースを削除します。サービスプリンシパルのID はフェデレーション資格で取得したアプリケーションID を利用します。
# リソースグループを削除するaz group delete -n azlogin-rg
サービスプリンシパルを削除する
az ad sp delete --id $applicationIdまとめ
- GitHub Actions からAzure にログインする場合、OpenID Connect のログインとサービスプリンシパルのログインがある。
- 資格情報はサービスプリンシパル作成、フェデレーション資格情報作成の順で作成する。
- 資格情報作成後、GitHub のシークレットとして設定する。
- フェデレーション資格情報で環境を指定した場合、GitHub Actions のメタデータファイルで環境名を指定する必要がある。
