AWS Amplify Gen2 でカスタムパイプラインを構成してバックエンドスタックを CodeBuild を使ってデプロイさせてみた
いわさです。
先日のアップデートで、Amplify の defineFunction が Node.js 以外もサポートしました。
これによって Python など、Lambda 関数でサポートされる全てのランタイムが使えるようになったのですが、一部の関数はビルド時に Docker を使う場合があり、現在の Amplify ネイティブの CI/CD 環境ではバックエンドのビルドが出来ない場合があります。
ではそのような環境の場合は Amplify Gen2 の採用を諦めるしかないのかというとそうではなく、カスタムパイプラインという機能を使うことでバックエンドスタックのビルド・デプロイのみを Amplify から別のビルド環境に委譲することが出来ます。
今回は先日作成した defineFunction + Python なアプリケーションを、このカスタムパイプラインを使って CoeeBuild でデプロイしてみましたのでどのような様子になるのかを紹介します。
まず、Amplify のフルスタック Git ベース CI/CD 環境を使って失敗させてみる
まずは先日のコードを GitHub リポジトリに格納し、ここから Amplify アプリケーションを作成します。
アプリケーション作成後、最初のビルド・デプロイが始まります...が、やはりエラーとなりました。
カスタムパイプラインを作ってみる
ということでカスタムパイプラインを構成してみましょう。
CodeBuild、CodeCatalyst、GitHub 様々な環境で実行出来ます。要はnpx ampx pipeline-deploy
コマンドが実行できれば基本的にどこでもいけます。
以下の手順に従って構成することが出来ますが、ざっくり言うと以下を行います。
- Amplify の Git トリガーによる自動ビルド機能と、バックエンドビルド部分を無効化して、ビルドトリガー用の Webhook を作成する
- CodeBuild は Git トリガーでビルドを開始し
npx ampx pipeline-deploy
を実行する - CodeBuild はバックエンドのビルドとデプロイが終わったら Webhook を実行する
- Amplify 側のパイプラインが開始され、フロントエンド部分だけビルドとデプロイが行われる
Amplify 側のバックエンドビルドを無効化
まず、デフォルトだと Git トリガーで自動ビルドが走るようになっているのでそれを無効化します。
アプリケーションのブランチ設定からブランチごとに無効化が出来ます。
続いてホスティングの中にビルド設定がありまして、そこにビルドスペック的な amplify.yml という設定箇所があります。場合によってはリポジトリのルートに配置されている場合もあります。
要は Amplify の CI/CD はこのビルドスペックに基づいて実行されています。
ここで amplify.yml を編集し、まずnpx ampx pipeline-deploy
をnpx ampx generate outputs
に変更します。これでバックエンドのビルド・デプロイはされません。
ただし、npx ampx generate outputs
によってフロントエンドが必要とするamplify_outputs.json
は生成してくれるという感じです。
ついでにここで、CodeBuild 完了時に Amplify 側のビルドを開始するための受信 Webhook を作成しておきましょう。ここの「コマンド」値が必要になります。
CodeBuild の設定
続いて CodeBuild プロジェクトを作成します。
まず該当リポジトリ・ブランチによるトリガーを構成します。カスタムパイプラインを使う場合はまず Amplify 以外のパイプラインが先に動くということです。
続いて、Amplify バックエンドリソースのデプロイを行う必要があるので、CodeBuild の Buildspec を定義します。今回はインラインで次のように定義しました。
コマンドは冒頭のドキュメントに従って実装しています。環境変数の設定を忘れないようにしましょう。
Amplify App ID は以下から取得出来ます。
Buildspec.yaml 全体はこんな感じです。
version: 0.2
env:
variables:
BRANCH_NAME: main
AMPLIFY_APP_ID: ddod24rpq5cah
phases:
build:
commands:
- export CI=1
- npm ci
- npx ampx pipeline-deploy --branch $BRANCH_NAME --app-id $AMPLIFY_APP_ID
- curl -X POST -d {} "https://webhooks.amplify.ap-northeast-1.amazonaws.com/prod/webhooks?id=e26080c6-e659-4aa0-891c-691cfff571d2&token=P0XFDTU1752E9iCmDVkLrzxuyXwqxSPFSknltlb38E&operation=startbuild" -H "Content-Type:application/json"
なお、このままだと次のようにUnable to detect CDK bootstrap stack due to permission issues
などのエラーが発生する場合があります。
SSM パラメータへのアクセスなど、CodeBuild サービスロールの権限が不足しているので、ログを見ながら追加のポリシーをアタッチしてやりましょう。
実行する
ここまでで設定は完了です。
ブランチを更新して動作を確認してみましょう。
まずは CodeBuild プロジェクトが動き出しました。この時点では Amplify 側のパイプラインは何も動いていないです。
CodeBuild 側のビルド・デプロイが完了しました。
そうすると、CodeBuild が Webhook にリクエストを送信するので、次に Amplify のパイプラインが動き出します。
ただし、ここではnpx ampx pipeline-deploy
は実行されず、フロントエンドのビルド・デプロイが行われるだけです。
少し待つと Amplify パイプライン側も完了しました。なるほど。
マネジメントコンソールを確認してみると CodeBuild が問題なく Lambda Python 関数をデプロイ出来ていることが確認出来ます。
また、Amplify 側で管理されるバックエンドリソースとしても関数が存在していることが確認出来ました。関数だけでなく認証やデータもです。
カスタムパイプラインにしてもうまく統合されており、管理面でも問題なさそうですね。
さいごに
本日は AWS Amplify Gen2 でカスタムパイプラインを構成してバックエンドスタックを CodeBuild を使ってデプロイさせてみました。
最初の準備だけちょっと手間が発生しますが、意外にもデータマネージャーなども Amplify 側のバックエンド管理機能が使えるので、思ってたよりこれかなり良いですね。
本当にバックエンドデプロイ部分だけを外部に委譲したという感じです。