GitHub ActionsでNext.jsをS3にデプロイする
November 13, 2021
Next.js の Static HTML Export で生成した資産を Amazon S3 にデプロイする方法について。
昔初めて作った上記ワークフローが見つかったので、削除する前に思い出として残しておきます。
GitHub Actions のワークフロー定義ファイルだけ載せれば十分かもしれませんが、振り返りも兼ねてゼロから手順を書いておきます。
1.package.json を編集する #
npm run export
で Static HTML Export されるように package.json
にコマンドを追加しておきます。
(npm run build
などとコマンド名は好みで変えていただいて良いですが、以降に載せている GitHub Actions のワークフローファイルは npm run export
で動く前提で書いています。ここを変えた場合は以降も適宜書き換えてください。)
package.json
{
"scripts": {
"export": "next build && next export"
}
}
2.GitHub Actions のディレクトリを作成する #
ルートディレクトリ直下に .github
ディレクトリを、その中に workflows
ディレクトリを作成します。
└ .github/
└ workflows/
3.ワークフロー定義ファイルを作成する #
上記で作成したディレクトリの中に定義ファイルを作成します。(deploy.yml
の名称は任意です)
└ .github/
└ workflows/
└ deploy.yml
deploy.yml
name: Deploy to Amazon S3
on:
push: # プルリクのマージもプッシュと同じ
branches: [main] # ワークフロー起動対象のブランチ
jobs:
deploy: # ジョブ名(名前は任意)
runs-on: ubuntu-latest
timeout-minutes: 10 # デフォルトは360(6時間)のため短い時間で設定しておく
env:
NODE_ENV: production
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: 15.x
run: npm ci
run: npm run export
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
run: aws s3 sync ./out s3://${{ secrets.AWS_BUCKET_NAME }}
4.デプロイ用ユーザを AWS IAM で作成する #
GitHub から S3 へのデプロイを実行するユーザを作成します。
AWS にログインし IAM からユーザを追加します。ポリシーは以下とします。
(デプロイ先の S3 バケット名を example-bucket
としている場合の例です)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": ["arn:aws:s3:::example-bucket", "arn:aws:s3:::example-bucket/*"]
}
]
}
5.GitHub リポジトリにシークレットを設定する #
ここで設定した内容は deploy.yml
にて参照されます。具体的には deploy.yml
の以下にシークレットが反映されます。
${{ secrets.AWS_ACCESS_KEY_ID }}
${{ secrets.AWS_SECRET_ACCESS_KEY }}
${{ secrets.AWS_BUCKET_NAME }}
GitHub にログインし、リポジトリのページからシークレットを設定します。
Settings > Secrets > New repository secret
以下3つを追加します。
- Name:
AWS_ACCESS_KEY_ID
- Value:
********
Value には先ほど作った IAM ユーザの アクセスキー ID を設定します。
- Name:
AWS_SECRET_ACCESS_KEY
- Value:
********
Value には先ほど作った IAM ユーザの シークレットキー を設定します。
- Name:
AWS_BUCKET_NAME
- Value:
********
Value にはデプロイ先バケット名を設定します。(例:example-bucket
)
以上 #
あと deploy.yml
で指定した対象ブランチ(今回で言えば main
)に対してプッシュがあればワークフローが動き出し、S3 へのデプロイまで完了するはずです。
GitHub リポジトリの Actions タブからワークフローの状況が確認できるため、うまくいかない時にはこちらをご参照ください。