🍳
Amplify ConsoleのPreview機能使用時のBackend設定メモ
やりたかったこと
- フロントエンドもバックエンドもAmplifyを使いたい。CDもAmplifyでやりたい
- フロントエンドはAmplifyのプレビュー機能を使いたい
- 確認が楽だから
- バックエンドはAmplifyのプレビュー機能を使いたくない
- バックエンドのAWSリソースを大量に作られると困るから
前提として、、、
Amplify Consoleによる静的ウェブホスティング
Amplify Consoleを使うと、GithubからSPAや静的サイトのホスティング、CI/CDの構築が簡単にできます。超便利です!!
Amplify Consoleのプレビュー機能
Amplify Consoleでプレビュー機能をONにすることで、Githubでプルリクエストを出した時点で、プレビュー環境がホスティングされます。超便利です!!
Amplify Consoleによるバックエンドのデプロイ
Amplify Consoleのビルドの設定ファイルであるamplify.yaml
にbackendのCD設定を追加すると、バックエンドのCDも構築されます。超便利です!!
backend:
phases:
build:
commands:
- amplifyPush --simple
バックエンドのプレビュー機能??
Amplify Consoleのプレビュー機能がONのときに、バックエンドのCDはどうなるのでしょうか?
プレビュー機能で2パターン選べます。
-
Create new backend environment for every Pull Request
を選ぶと、プルリクする度に新しい環境が作られます。- 一見良さそうですが、バックエンドの場合DBやCognito等いろいろ初期設定しないとまともに動かないですのでプルリクの度に新環境を一式全部揃えるのはなかなかツラいです。いい感じに初期設定自動化したとしても、APIやCognitoやS3の各種リソースがプルリク毎に作られるのはコスト的にもツラいです。
-
Point all Pull Requests for this branch to an existing environment
を選ぶと、既存のバックエンドを使用します。- 一見良さそうですが、既存のバックエンドがプルリクされた内容で上書きされます。つまりプルリクを出すことでCognitoを削除することも可能です。え?
既存のバックエンドを使いつつ上書きしない方法
ということで本題です。既存のバックエンドを使いつつ、上書きしない方法を紹介します。
-
プレビュー機能の設定で
Point all Pull Requests for this branch to an existing environment
を選び、既存のバックエンドを使う設定にします。 -
ビルド用のスクリプトファイルを作る
./script/deploy_backend.sh
if [ $AWS_BRANCH = $USER_BRANCH ]
then
echo 'start deploy backend'
amplifyPush --simple
echo 'end deploy backend'
else
echo 'skip deploy backend'
fi
-
$AWS_BRANCH
: Githubのブランチ名 -
$USER_BRANCH
: バックエンドのenv- ちなみにこの変数はamplifyのマニュアルに載っていないので説明が正しいかは謎
- preview時は
$USER_BRANCH
が、プルリク先になるので、if [ $AWS_BRANCH = $USER_BRANCH ]
がfalse
となり、amplifyPushは実行されない - previewでない時は、
if [ $AWS_BRANCH = $USER_BRANCH ]
がtrue
となりamplifyPushされる
3.ビルド用のスクリプトファイルを、amplify.ymlから呼び出す
amplify.yml
backend:
phases:
build:
commands:
- chmod +x ./script/deploy_backend.sh
- ./script/deploy_backend.sh
補足
- amplify.yml内に
- if [ $AWS_BRANCH = $USER_BRANCH ]; then amplifyPush --simple; fi
と書いても何故かif文を無視してamplifyPushされるので、外部のスクリプトが必要。謎です。 - amplifyのドキュメントに
AMPLIFY_SKIP_BACKEND_BUILD
というそれっぽい環境変数が載っていますが何に使えるのか分かりませんでした。- (追記)amplify.ymlにbackendを書いてなくてもbackendのリソースが存在していると(詳細条件不明)、勝手にbackend対して不要な処理をしてエラーを出してビルド失敗になることがあり、その時にこの環境変数を入れたらfrontendのみをbuildしてくれるようになりました。
- 明確にfrontendしか存在しない場合はこのオプション付けたほうがよいかもです。
- (追記)amplify.ymlにbackendを書いてなくてもbackendのリソースが存在していると(詳細条件不明)、勝手にbackend対して不要な処理をしてエラーを出してビルド失敗になることがあり、その時にこの環境変数を入れたらfrontendのみをbuildしてくれるようになりました。
参考
- amplifyの環境変数のドキュメント。参考にしようと思って頑張って読みましたが、あまり参考になりませんでした。
$USER_BRANCH
は載ってないですし、、、
https://docs.aws.amazon.com/amplify/latest/userguide/environment-variables.html
課題
バックエンドが修正された時の動作確認をどうするかという問題が残っています。
2022/05/24追記
$USER_BRANCH
について関連しそうなissue。
Discussion