Open11

Amplifyのデプロイを高速化する試行錯誤(nodejs, react)

2357gi2357gi

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することにする

2357gi2357gi

というかそもそも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
2357gi2357gi

おそらく「デプロイが遅い」のではなく「デプロイ自体は早いけどcloudfrontのキャッシュが切れるまでデプロイ前のものを見てしまう」が答え?

amplifyのdeployまで終わったあとにcloudfrontのキャッシュクリアしてあげれば完璧?
それともそもそもとしてamplify側がその機能を提供してないのか?

cache-control: max-age=0 だったし、アプリケーション側みても x-cache: Miss from cloudfrontだった。キャッシュが悪さしてる説はなさそう

2357gi2357gi

## Amplify CLIの最新化を無効化
amplifyはデフォルトでbuilder内のamplify cliを最新化してる
https://zenn.dev/2357gi/scraps/78b6f921fc652d#:~:text=buildセクションの下記で時間かかってる

アプリ全般の設定>ビルドの設定>構築イメージ設定を編集>ライブパッケージの更新
からAmplify CLIの最新化を削除


30sぐらい早くなった

デフォのbuilder imageに入ってるamplify CLIのバージョンが低すぎてdeployがコケるのでNG

2357gi2357gi

スクラップ再オープン

Amplify buildのプロビジョニングが激遅

pythonやruby, nodeのあらかたのバージョンをすべて入れたりしてるのでそれは遅くなるでしょという感じだし、このプロビジョニングの遅さ的にキャッシュヒット率も低そう。
よって、imageを作り直す。

https://docs.aws.amazon.com/amplify/latest/userguide/custom-build-image.html#:~:text=Custom build image requirements

以下が必要とのこと

  • curl
  • git
  • openssh
  • (npm系のbuildであれば) Node.js + NPM

これにapmlify cliも必須なのでinstallしておく
逆にこれだけしか必要とされてないなら自前でこれだけしか入ってないimage作ったほうが良さげ感ある

public ecrにpushする必要があるとのこと。

2357gi2357gi

今回はreactプロジェクトなのでnode.jsとnpm、アプリケーションではyarnを使用しているのでyarnを入れたimageを作成する。

base imageは default imageのbaseと合わせてamazonlinux:2を使用する。