今回は、Next.jsのISRをVercelを使わずに実装する
ということで
Vercel を使えば一発ですが Vercel を使わないで実装はできるのかやっていきます。
ざっと調べた感じ、キーワードとしては
- next.js
- serverless-nextjs
- AWS CLI
でした。
AWS はちょっと触ったことがある初心者です。
結構難易度高そうだなと思いつつやっていきます。
導入していく
next.js を init
$ npx create-next-app --example with-typescript-eslint-jest with-typescript-eslint-jest-app --use-npm
Serverless Framwork を導入
まずは、Serverless Framework
を install
global
に入れるように書いてあるけど、プロジェクトに含めてみた。
$ npm install -D serverless
確認
$ npx serverless --version Framework Core: 2.44.0 (local) Plugin: 5.2.0 SDK: 4.2.3 Components: 3.11.0
AWS CLI の設定する
次の工程調べてたら、AWS CLI の設定いろいろしなきゃみたいだった。
とりあえず、AWS アカウントを作成して設定してみる(まじで初心者)
aws configure
aws configure
を実行
$ aws configure AWS Access Key ID [None]:
Access Key を聞かれたので、AWS の cli について調べる…
アクセスキーはアクセスキー ID と秘密アクセスキーからなり、AWS に対するプログラムによるリクエストに署名するときに使用されます。アクセスキーがない場合は、AWS マネジメントコンソールから作成できます。ベストプラクティスとして、不必要なタスクでは、AWS アカウントのルートユーザーアクセスキーを使用しないでください。代わりに、ご自身のアクセスキーを持つ新しい管理者 IAM ユーザーを作成します 。
これですね。
IAM
でユーザー作ろうねってことみたいです。
ポリシーの作成
ポリシーの作成で必要な権限を設定…
必要な権限についてはAWS Permissions for deploymentを参考にしていきます
sqs
の権限は ISR を使うときは必須なので、今回は追加しています。
ユーザーグループの作成
適当に名前をつけて、先ほど作成したポリシーを選択し保存
基本的にカスタムドメインで必要なもの以外選択しました
ユーザーの作成
- ユーザー名を適当に決める
- アクセスの種類は
プログラムによるアクセス
-
次のステップへ
- 先ほど作ったユーザーグループを指定
-
次のステップへ
- タグはつけず
次のステップへ
- 問題なければ
ユーザーの作成
を押して完了です
生成されたAccess Key
とSecret Access Key
をコピーしておいて…
再度aws configure
する
$ aws configure
Access Key
とSecret Access Key
を貼り付けて、あとはデフォのまま enter
多分、よくわからなかったら調べなさいと言われるだろうけど、とりあえず動かしたいってモチベなので…
$ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX $ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
そして、export も設定してここは完了です!
Serverless Next.js Component を導入
serverless.yaml
を作成し…
myApp: component: '@sls-next/serverless-component@1.20.0-alpha.4'
component を指定する
今回は ISR 対応したいので@sls-next/serverless-component@1.20.0-alpha.4
を指定
いったんデプロイしてみる
なんか、serverless.yaml
にinputs
を指定しているところが多いのですが、Zero-config
を掲げてたと思うのでいけるんじゃない?という気持ちでやっちゃいます。
好奇心だいじ
$ npx serverless
色々デプロイされ…
myApp: appUrl: https://********.cloudfront.net bucketName: ******** distributionId: ******** ****************************************************************************************************************************************************************** Warning: You are using the beta version of Serverless Components. Please migrate to the GA version for enhanced features: https://github.com/serverless/components ****************************************************************************************************************************************************************** 37s › myApp › done
Warning でてますが、ISR 対応がまだベータ版なのでしかたなしですね。
ISR 対応して確認していく
まずは、test/isr.tsx
を作成
import React from 'react' import { GetStaticProps } from 'next' interface Props { date: Date } export const getStaticProps: GetStaticProps = async () => { return { props: { date: new Date().toLocaleString(), }, revalipubDate: 5, } } const Isr: React.VFC<Props> = ({ date }) => <p>{date}</p> export default Isr
デプロイ
503 ERROR The request could not be satisfied.
503 エラーでました。
ふて寝しそうです。
オーマイオーマイ…
見落としてました権限も修正しないとですね
sqs のところが*
になってますね
↓ 参考
オーマイオーマイ…
もうこれでしたねしっかりと問題として上がってますね
Sure, let me take a look at the logs and let you know what happened
EDIT: looks like the Lambda itself doesn’t have permissions to access SQS endpoint:{ "errorType": "AccessDenied", "errorMessage": "Access to the resource https://sqs.us-east-1.amazonaws.com/ is denied.", ....I’ll fix but we should also make sure to mention in Readme to give the Lambda itself permissions to access SQS (if it > > wasn’t obvious or already done)
↓ 参考
最終的に、CloudFront / SQS / Lambda などなど削除し、プロジェクト内の.serverless
を削除してから
再度デプロイしたら正常に権限が適用され、問題なく動作することを確認しました!
参考
めっちゃ参考にさせてもらいました!
ありがとうございます…!