Next.js on Amplifyの503エラーの続き
概要
- 上記ブログの続き
- AmplifyでNext.jsをデプロイしたタイミングだと問題なく動くが、あるタイミングからCloud Frontの503エラーになっていた
- 上記事象が発生するのは、同じAmplifyプロジェクト上で同じソースコードで構築したhostingでも再現するものとしないものがあった
原因
- Next.js on Amplifyで構築される、Lambda@Edge に SQS の権限がアタッチされないことがある
- SQS の権限がアタッチ「されるとき」と「されないとき」の2パターンあるのがポイントで、ケースは以下
- ISRのキャッシュが切れて裏でページ生成されるタイミングで、Lambda@edge から SQS に SendMessage しようとしたときに権限がないと503エラーとなる
対処方法
- 解決するには、以下2つがある。(現状はどちらも試していて、どちらのケースでもうまく動いている)
- Amplify hostingを作り直す
- 事象が発生しているhostingを一度削除し、改めて作り直す
- まだサイト公開前とかであれば、こちらの方法がシンプルで良さそう
- 事象が発生している Lambda@edge にSQSの権限をアタッチする
- 雑にやるなら、AmazonSQSFullAccess ポリシーを付ける。正しくやるなら、"Resource": "arn:aws:sqs:us-east-1:<アカウント ID >:
", の Actionに "sqs:SendMessage" を指定する。
- 雑にやるなら、AmazonSQSFullAccess ポリシーを付ける。正しくやるなら、"Resource": "arn:aws:sqs:us-east-1:<アカウント ID >:
- Lambda@edge や SQS のIDについては、Amplifyコンソールのデプロイ部分のログに出力されている
- Lambda@edge に権限アタッチ後、改めてデプロイしても自分で割り当てた権限はついたままとなっている(Amplify側の挙動の保証はない?)
- Amplify hostingを作り直す
所感
- プロジェクト構築時は、シンプルな状態から始めることが多いので、途中からISR対応ページなど追加したときに気をつける
- Amplifyコンソールのデプロイフェーズのログが重要
- ここに出力されている、CloudFront や Lambda@edge のIDから詳細ログを追う力が必要