(2021/12/21 ARMテンプレートのURLを更新)
先日、以下のエントリを書いた。
Azure API Management インスタンスを Azure DevOps で生成する
https://logico-jp.io/2020/05/18/create-azure-api-management-instances-with-azure-devops/
さすがにAzure DevOpsだけというのもなんかあれなので、同じARMテンプレート、テンプレートパラメータを使いつつも、今回はGitHub ActionsでAPI Managementインスタンスを作成してみる。利用しているARMテンプレートは以下のQuickStart Templateにあるものを利用している。
Azure Quickstart Templates
https://azure.microsoft.com/resources/templates/
https://github.com/Azure/azure-quickstart-templates
Azure API Management instance having an MSI Identity
https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.apimanagement/api-management-create-with-msi
その他の注意事項は前回のエントリと同じで、説明目的のため以下のようにファイル名を変更している。
種類 | このエントリでのファイル名 | QUICKSTART |
---|---|---|
テンプレート | instance.json | azuredeploy.json |
テンプレートパラメータ | parameter.json | azuredeploy.parameters.json |
1) シークレットの作成
今回利用するActionは以下のもの。
Azure Resource Manager (ARM) Template Deployment JS
https://github.com/marketplace/actions/azure-resource-manager-arm-template-deployment-js
このActionには以下のActionが依存関係として必要。
Azure Login
https://github.com/Azure/login
Checkout
https://github.com/actions/checkout
Azure Loginでログインするために、Service Principalを作成する。以下のコマンドでCloud Shellあたりで作成する。
az ad sp create-for-rbac --name <名前> \
--role contributor
--scopes /subscriptions/{subscription ID} --sdk-auth
コマンドを実行すると、以下のような結果が現れる。これをシークレットとして保存するため、出力結果をコピーしておく。
{
"clientId": "5bd0........d12d",
"clientSecret": "265f........5e40",
"subscriptionId": "subscription ID",
"tenantId": "tenant ID",
"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/"
}
リポジトリのSettingsタブを選択し、現れる画面左側のメニューからSecretsを選択し、New secretをクリック。

シークレットとして、先ほど取得したJSONを貼り付ける。シークレット名は今回はAZURE_CREDENTIALSとしておく。【Add secret】をクリックしてシークレットを保存する。シークレットは後から編集できない(上書きのみ可能)。

2) ワークフローの作成
続いて、ワークフロー用のYAMLファイルを作成するために、GitHubリポジトリのActionsタブをクリック。

starter workflowとして、Simple Workflowを選択。

YAMLファイルの名前を指定する。今回はcreate-api-management-instance.ymlとしておく。作成したものはリポジトリの.github/workflowsに格納される。

トリガー
Simple Workflowでは、masterブランチに対するPushもしくはPull Requestをトリガーにしてワークフローがスタートするように設定されている。
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
今回はそのまま使うが、必要に応じてブランチやPull Requestの種類(openedやsynchronized)、スケジュールなどをトリガーにすることもできる。詳細は以下のドキュメントを参照。
イベントでワークフローをトリガーする
https://help.github.com/ja/actions/configuring-and-managing-workflows/configuring-a-workflow#triggering-a-workflow-with-events
Triggering a workflow with events
https://help.github.com/en/actions/configuring-and-managing-workflows/configuring-a-workflow#triggering-a-workflow-with-events
環境変数
指定する値を1カ所で定義できるよう、環境変数を作成しておく。もちろん、job内をスコープとした環境変数でもかまわないが、今回はYAML全体をスコープとした環境変数を使っている。定義した環境変数は以下の通り。利用する際には、 ${{ env.環境変数名 }} と記載する(例:${{ env.ResourceGroup }})。
env:
ResourceGroup: APIM-Southeast-Asia
Location: southeastasia
DeploymentName: APIM-SEA
環境変数については以下のドキュメントを参照。
環境変数の利用
https://help.github.com/ja/actions/configuring-and-managing-workflows/using-environment-variables
Using environment variables
https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables
ジョブの指定
jobs以下は以下のように書き換えた。
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Login via Az module
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Run Az CLI script
run: |
az group create -l ${{ env.Location }} -n ${{ env.ResourceGroup }}
- name: Create API Management Instance with ARM action js
uses: whiteducksoftware/azure-arm-action-js@v1
with:
resourceGroupName: ${{ env.ResourceGroup }}
templateLocation: instance.json
deploymentName: ${{ env.DeploymentName }}
deploymentMode: Complete
parameters: parameter.json
設定内容は以下の通り。
名前 (NAME) | 利用するアクション (uses) | 実施内容 |
---|---|---|
Login via Az module | azure/login@v1 | Azure CLIでのログイン |
Run Az CLI script | N/A | リソースグループの作成 |
Create API Management Instance with ARM action js | whiteducksoftware/azure-arm-action-js@v1 | ARMテンプレートとテンプレートパラメータに基づいてリソースを作成 |
3) テスト
ここまで出来れば、あとはCommitしてテストするだけ。【Start commit】をクリックしてコメントを記載し、【Commit changes】をクリックする。するとワークフローが開始する。

状況はActionsの中で確認できる。

4) 注意点
Azure DevOpsとの大きな違いは以下のあたり。基本的に、Single source of truthとしてGitHubを使う前提でフローを設計する必要がある。
- ARMテンプレートのデプロイというアクションには、デプロイメントモードにValidation Onlyは存在しないため、ARMテンプレートの検証はできない
- Azure DevOpsとは異なり、承認フローの設定はできない(Pull Request時の承認を使う工夫で回避できる場合がある)
- パラメータのオーバーライドの仕組みはない