Amplifyのデプロイを高速化する試行錯誤(nodejs, react)
参考にする
差分ビルド
まあやって損はないので有効化しとく
AMPLIFY_DIFF_DEPLOY
true
AMPLIFY_DIFF_BACKEND
true
buildに使用するdocker imageの改善
amplifyのdeployに行われるbuildにはdocker container を使用している。
そのdockerimageはだいぶ汎用的に作ってあるから、そこをよしなにすることでだいぶ速度改善が見込める?
builder imageの管理
builder image自体をどこで管理するかが問題になる。
dockerfileは該当リポジトリで管理するにしろ、変更がある毎にlocalで buildしてdocker hub にpush するのはダサいのでやりたくない。
github actionsに on.<push|pull_request>.paths
があり、ファイルの差分見てjob実行ができるのでこれを使っていい感じにする。
./images/builder/dockerfile
に配置して、github actionsでbuildし、ecrにpushすることにする
imageのダイエット
見た感じいらないものが結構あるので痩せれそう。
一旦buildしてdiveしてみる
というかそもそもbuilderを痩せさせたとしてもamplifyの実行環境でdocker imageキャッシュしてるだろうし下手に新規image作ったほうが時間かかりそうな気がしてきた。
そもそも何がボトルネックか調査してなかったから一旦計測する
計測
計測したらだいたい5分前後、爆速デプロイじゃないけど開発者からデプロイが遅いって文句出るほどの速度感じゃない気がする。
何か別に問題ありそう
buildセクションの下記で時間かかってる
2022-08-27T14:11:04.701Z [INFO]: # Patching NPM package '@aws-amplify/cli' from 7.6.14 to 9.2.1...
2022-08-27T14:12:43.472Z [INFO]: # Done patching NPM package '@aws-amplify/cli' to version 9.2.1
おそらく「デプロイが遅い」のではなく「デプロイ自体は早いけどcloudfrontのキャッシュが切れるまでデプロイ前のものを見てしまう」が答え?
amplifyのdeployまで終わったあとにcloudfrontのキャッシュクリアしてあげれば完璧?
それともそもそもとしてamplify側がその機能を提供してないのか?
cache-control: max-age=0
だったし、アプリケーション側みても x-cache: Miss from cloudfront
だった。キャッシュが悪さしてる説はなさそう
これを読む限りデフォルトでCDNのキャッシュ即時無効化してる?
Get started
If you’re an existing Amplify Console customer, you need to redeploy your site once to activate the instant cache invalidation feature.
デフォルトでオンになってそう
## Amplify CLIの最新化を無効化
amplifyはデフォルトでbuilder内のamplify cliを最新化してる
アプリ全般の設定>ビルドの設定>構築イメージ設定を編集>ライブパッケージの更新
からAmplify CLIの最新化を削除
↓
30sぐらい早くなった
デフォのbuilder imageに入ってるamplify CLIのバージョンが低すぎてdeployがコケるのでNG
稼動ブランチにmergeしなくても検証ができるようにfeature/*
にマッチするブランチは自動で環境が立ち上がるようにした
スクラップ再オープン
Amplify buildのプロビジョニングが激遅
pythonやruby, nodeのあらかたのバージョンをすべて入れたりしてるのでそれは遅くなるでしょという感じだし、このプロビジョニングの遅さ的にキャッシュヒット率も低そう。
よって、imageを作り直す。
以下が必要とのこと
- curl
- git
- openssh
- (npm系のbuildであれば) Node.js + NPM
これにapmlify cliも必須なのでinstallしておく
逆にこれだけしか必要とされてないなら自前でこれだけしか入ってないimage作ったほうが良さげ感ある
public ecrにpushする必要があるとのこと。
今回はreactプロジェクトなのでnode.jsとnpm、アプリケーションではyarnを使用しているのでyarnを入れたimageを作成する。
base imageは default imageのbaseと合わせてamazonlinux:2を使用する。