AWS Amplify Gen2 でカスタムパイプラインを構成してバックエンドスタックを CodeBuild を使ってデプロイさせてみた

AWS Amplify Gen2 でカスタムパイプラインを構成してバックエンドスタックを CodeBuild を使ってデプロイさせてみた

Clock Icon2025.01.10

いわさです。

先日のアップデートで、Amplify の defineFunction が Node.js 以外もサポートしました。

https://dev.classmethod.jp/articles/amplifygen2-definefunction-runtime/

これによって Python など、Lambda 関数でサポートされる全てのランタイムが使えるようになったのですが、一部の関数はビルド時に Docker を使う場合があり、現在の Amplify ネイティブの CI/CD 環境ではバックエンドのビルドが出来ない場合があります。

ではそのような環境の場合は Amplify Gen2 の採用を諦めるしかないのかというとそうではなく、カスタムパイプラインという機能を使うことでバックエンドスタックのビルド・デプロイのみを Amplify から別のビルド環境に委譲することが出来ます。

今回は先日作成した defineFunction + Python なアプリケーションを、このカスタムパイプラインを使って CoeeBuild でデプロイしてみましたのでどのような様子になるのかを紹介します。

まず、Amplify のフルスタック Git ベース CI/CD 環境を使って失敗させてみる

まずは先日のコードを GitHub リポジトリに格納し、ここから Amplify アプリケーションを作成します。

https://github.com/Tak1wa/hoge0110amplifyfunction

アプリケーション作成後、最初のビルド・デプロイが始まります...が、やはりエラーとなりました。

3C4C747D-331C-4C57-8DAB-5D91CF0007B5.png

カスタムパイプラインを作ってみる

ということでカスタムパイプラインを構成してみましょう。
CodeBuild、CodeCatalyst、GitHub 様々な環境で実行出来ます。要はnpx ampx pipeline-deployコマンドが実行できれば基本的にどこでもいけます。

以下の手順に従って構成することが出来ますが、ざっくり言うと以下を行います。

  • Amplify の Git トリガーによる自動ビルド機能と、バックエンドビルド部分を無効化して、ビルドトリガー用の Webhook を作成する
  • CodeBuild は Git トリガーでビルドを開始しnpx ampx pipeline-deployを実行する
  • CodeBuild はバックエンドのビルドとデプロイが終わったら Webhook を実行する
  • Amplify 側のパイプラインが開始され、フロントエンド部分だけビルドとデプロイが行われる

https://docs.amplify.aws/react/deploy-and-host/fullstack-branching/custom-pipelines/

Amplify 側のバックエンドビルドを無効化

まず、デフォルトだと Git トリガーで自動ビルドが走るようになっているのでそれを無効化します。
アプリケーションのブランチ設定からブランチごとに無効化が出来ます。

ブランチの設定___Amplify___ap-northeast-1.png

続いてホスティングの中にビルド設定がありまして、そこにビルドスペック的な amplify.yml という設定箇所があります。場合によってはリポジトリのルートに配置されている場合もあります。
要は Amplify の CI/CD はこのビルドスペックに基づいて実行されています。

ここで amplify.yml を編集し、まずnpx ampx pipeline-deploynpx ampx generate outputsに変更します。これでバックエンドのビルド・デプロイはされません。
ただし、npx ampx generate outputsによってフロントエンドが必要とするamplify_outputs.jsonは生成してくれるという感じです。

ついでにここで、CodeBuild 完了時に Amplify 側のビルドを開始するための受信 Webhook を作成しておきましょう。ここの「コマンド」値が必要になります。

Cursor_and_ビルドの設定___Amplify___ap-northeast-1.png

CodeBuild の設定

続いて CodeBuild プロジェクトを作成します。
まず該当リポジトリ・ブランチによるトリガーを構成します。カスタムパイプラインを使う場合はまず Amplify 以外のパイプラインが先に動くということです。

56A5B7B8-F07B-4145-86F0-20386B9F96E8.png

続いて、Amplify バックエンドリソースのデプロイを行う必要があるので、CodeBuild の Buildspec を定義します。今回はインラインで次のように定義しました。

プロジェクト_を編集___CodeBuild___ap-northeast-1.png

コマンドは冒頭のドキュメントに従って実装しています。環境変数の設定を忘れないようにしましょう。
Amplify App ID は以下から取得出来ます。

7DF3B6B5-F893-40DC-9CCB-473C80B2EF78_4_5005_c.jpeg

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 サービスロールの権限が不足しているので、ログを見ながら追加のポリシーをアタッチしてやりましょう。

962BCFA8-A0A3-46BD-87A7-8A2EF87A69B6.png

実行する

ここまでで設定は完了です。
ブランチを更新して動作を確認してみましょう。

まずは CodeBuild プロジェクトが動き出しました。この時点では Amplify 側のパイプラインは何も動いていないです。

18769757-C601-42BC-94FB-9795035C924B.png

CodeBuild 側のビルド・デプロイが完了しました。

7CCEB901-5922-4A66-BACB-8927FA1419BE.png

そうすると、CodeBuild が Webhook にリクエストを送信するので、次に Amplify のパイプラインが動き出します。

F979DD72-7DAD-479E-92B0-6EAD6C018F47.png

ただし、ここではnpx ampx pipeline-deployは実行されず、フロントエンドのビルド・デプロイが行われるだけです。
少し待つと Amplify パイプライン側も完了しました。なるほど。

183BDF98-760F-41F1-BB84-8E392E6FBFA3.png

マネジメントコンソールを確認してみると CodeBuild が問題なく Lambda Python 関数をデプロイ出来ていることが確認出来ます。

72874C13-CF73-47EA-B255-85598D91C14A.png

また、Amplify 側で管理されるバックエンドリソースとしても関数が存在していることが確認出来ました。関数だけでなく認証やデータもです。
カスタムパイプラインにしてもうまく統合されており、管理面でも問題なさそうですね。

6E19AD4E-89E6-4674-BC5F-FA072752498C.png

さいごに

本日は AWS Amplify Gen2 でカスタムパイプラインを構成してバックエンドスタックを CodeBuild を使ってデプロイさせてみました。

最初の準備だけちょっと手間が発生しますが、意外にもデータマネージャーなども Amplify 側のバックエンド管理機能が使えるので、思ってたよりこれかなり良いですね。
本当にバックエンドデプロイ部分だけを外部に委譲したという感じです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.