Auth0のCI/CD環境をGitHub Actionsで構築してみた

2020.05.26

Auth0は様々なアプリやAPIに対応可能な統合認証基盤サービスです。Auth0公式が提供しているAuth0 Deploy CLIを使用することで、テナントの設定をソースコードで管理できます。また、既存のCI/CDパイプラインと統合して、Auth0テナントのCI/CD環境を構築することも可能です。

今回はAuth0のCI/CD環境をGitHub Actionsで構築してみます。

Auth0 Deploy CLIをインストール

Auth0のExtentionsでAuth0 Deploy CLIを探してインストールします。

Auth0 Deploy CLI Extention

Auth0 Deploy CLI Extention

連携が完了するとApplicationsにauth0-deploy-cli-extensionが作成されます。

Auth0 Applications

アプリケーションの「Domain」「Client ID」「Client Secret」は後で使うのでメモしておきます。

Auth0 Application Settings

npmで個人のPC環境にAuth0 Deploy CLIをインストールします。

npm i -g auth0-deploy-cli

テナント設定をエクスポート

プロジェクトのディレクトリにAuth0 Deploy CLIの設定ファイルを作成します。ドメインや認証情報には先ほど取得した情報を入力します。

config.json

{
  "AUTH0_DOMAIN": "auth0-deploy-cli-extension domain",
  "AUTH0_CLIENT_SECRET": "auth0-deploy-cli-extension client ID",
  "AUTH0_CLIENT_ID": "auth0-deploy-cli-extension client secret",
  "AUTH0_ALLOW_DELETE": true
}

認証情報はセキュリティの都合上、リポジトリで管理したくないので.gitignoreconfig.jsonを追加します。

次のコマンドでAuth0のテナント設定をエクスポートします。

a0deploy export -c config.json -f yaml -o

デプロイ用のスクリプトを実装

npmでプロジェクトにパッケージをインストールします。

npm init
npm i --save-dev auth0-deploy-cli

デプロイ用のスクリプトを実装します。

deploy.js

const deploy = require("auth0-deploy-cli").deploy;

const config = {
  AUTH0_DOMAIN: process.env.AUTH0_DOMAIN,
  AUTH0_CLIENT_SECRET: process.env.AUTH0_CLIENT_SECRET,
  AUTH0_CLIENT_ID: process.env.AUTH0_CLIENT_ID,
  AUTH0_ALLOW_DELETE: true,
  AUTH0_API_MAX_RETRIES: 10,
};

deploy({
  input_file: "tenant.yaml",
  config: config,
  env: process.env,
})
  .then(() => console.log("yey deploy was successful"))
  .catch((err) => console.log(`Oh no, something went wrong. Error: ${err}`));

package.jsonにデプロイ用のスクリプトを追加します。

package.json

"scripts": {
  "deploy": "node scripts/deploy.js"
},

次のコマンドでデプロイできるようになりました。

# 環境変数をセット
export AUTH0_DOMAIN='ドメイン'
export AUTH0_CLIENT_SECRET='シークレットキー'
export AUTH0_CLIENT_ID='クライアントID'

# デプロイ
npm run deploy

GitHub ActionsでCI/CDを構築

ここからはGitHub ActionsでCI/CDを構築します。

シークレット変数を設定

Auth0の認証情報をプロジェクトのシークレット変数に登録します。

GitHubシークレット変数

ワークフローを作成

GitHubプロジェクトのActionsから新規ワークフローを作成します。

GitHub Actionsワークフロー作成

Auth0のデプロイは次のようなワークフローになります。

.github/workflows/auth0.yml

name: Auth0

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]

jobs:
  deploy:
    runs-on: ubuntu-latest

    env:
      AUTH0_DOMAIN: ${{secrets.AUTH0_DOMAIN}}
      AUTH0_CLIENT_SECRET: ${{secrets.AUTH0_CLIENT_SECRET}}
      AUTH0_CLIENT_ID: ${{secrets.AUTH0_CLIENT_ID}}

    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js
        uses: actions/setup-node@v1
        with:
          node-version: "12.x"
      - run: npm ci
      - run: npm run deploy

テストを追加する場合はjobs.deployの前にテストのジョブを追加します。

動作確認

試しにテナント設定を変更してmasterブランチにプッシュしてみます。

tenant.yaml

~~~~~~~~~~~~~~~~~~~~~~~~~~~
tenant:
  enabled_locales:
    - ja
~~~~~~~~~~~~~~~~~~~~~~~~~~~

GitHub Actionsのワークフローが実行されます。

GitHub Actionsワークフロー実行

Auth0のテナント設定が反映されました。

Auth0テナント設定

テナント設定で環境変数を利用

テナントの設定ファイル「tenant.yaml」で環境変数を使う場合は、##KEY##のように記載します。

tenant.yaml

~~~~~~~~~~~~~~~~~~~~~~~~~~~
clients:
  - name: My App
    allowed_clients: []
    allowed_logout_urls:
      - "##ALLOWED_ORIGIN_URL##"
    app_type: spa
    callbacks:
      - "##ALLOWED_ORIGIN_URL##"
    client_aliases: []
    cross_origin_auth: false
    custom_login_page_on: true
    grant_types:
      - authorization_code
      - implicit
      - refresh_token
    is_first_party: true
    is_token_endpoint_ip_header_trusted: false
    jwt_configuration:
      alg: RS256
      lifetime_in_seconds: 36000
      secret_encoded: false
    native_social_login:
      apple:
        enabled: false
      facebook:
        enabled: false
    oidc_conformant: true
    refresh_token:
      rotation_type: non-rotating
      expiration_type: non-expiring
    sso_disabled: false
    token_endpoint_auth_method: none
    web_origins:
      - "##ALLOWED_ORIGIN_URL##"
~~~~~~~~~~~~~~~~~~~~~~~~~~~

まとめ

実際に認証基盤を運用する場合、開発環境や検証環境も用意することが多いと思います。今回はGitHub ActionsでCI/CD環境を構築してデプロイを自動化することで、効率よく本番環境へリリースできるようになりました。WEBの管理画面から手動で各環境を管理すると煩雑になるので、YAMLでテナントの設定を管理できるのはとても便利です。

参考資料