Azure API Management インスタンスを GitHub Actions で生成する

先日、以下のエントリを書いた。

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 with api-version 2017-03-01
https://github.com/Azure/azure-quickstart-templates/tree/master/101-api-management-create-with-msi

その他の注意事項は前回のエントリと同じで、説明目的のため以下のようにファイル名を変更している。

種類このエントリでのファイル名QUICKSTART
テンプレートinstance.jsonazuredeploy.json
テンプレートパラメータparameter.jsonazuredeploy.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 moduleazure/login@v1Azure CLIでのログイン
Run Az CLI scriptN/Aリソースグループの作成
Create API Management Instance with ARM action jswhiteducksoftware/azure-arm-action-js@v1ARMテンプレートとテンプレートパラメータに基づいてリソースを作成

3) テスト

ここまで出来れば、あとはCommitしてテストするだけ。【Start commit】をクリックしてコメントを記載し、【Commit changes】をクリックする。するとワークフローが開始する。

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

4) 注意点

Azure DevOpsとの大きな違いは以下のあたり。基本的に、Single source of truthとしてGitHubを使う前提でフローを設計する必要がある。

  • ARMテンプレートのデプロイというアクションには、デプロイメントモードにValidation Onlyは存在しないため、ARMテンプレートの検証はできない
  • Azure DevOpsとは異なり、承認フローの設定はできない(Pull Request時の承認を使う工夫で回避できる場合がある)
  • パラメータのオーバーライドの仕組みはない

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中