Next.jsでSPAを作成してAWS Amplifyでhostingを試みたところ「403 Access Denied」が表示されました。
原因と対処法をまとめます。
再現手順
Next.jsのアプリケーションは予め作成されており、Githubにpush済みであることを前提とします。
以下コマンドを実行して、プロジェクトを初期化します。
$ amplify init
Note: It is recommended to run this command from the root of your app directory
? Enter a name for the project next-app
? Enter a name for the environment production
? Choose your default editor: Visual Studio Code
? Choose the type of app that you\'re building javascript
Please tell us about your project
? What javascript framework are you using react
? Source Directory Path: src
? Distribution Directory Path: build
? Build Command: npm run-script build
? Start Command: npm run-script start
以下コマンドを実行して、hostingを追加します。
$ amplify add hosting
? Select the plugin module to execute Hosting with Amplify Console (Managed hosting with custom domains, Continuous deployment)
? Choose a type Continuous deployment (Git-based deployments)
? Continuous deployment is configured in the Amplify Console. Please hit enter once you connect your repository
Amplify Consoleの画面がブラウザで開くので、Github認証をしてデプロイ対象を選択します。
リポジトリとブランチの選択以外はデフォルトのままです。
デプロイが完了して、デプロイ先のURLにアクセスすると「403 Access Denied」が表示されます。
なにがいけなかったのか?
Next.jsを静的HTMLにエクスポートできていないことと、エクスポート先のディレクトリを指定できていないことが原因です。
ハマリポイントは3点あります。
1. package.json に記載されているbuildコマンドに静的HTMLへのエクスポートコマンドが含まれていない
create-next-app
で自動生成された package.json
をそのまま使用していたのですが、 build
のコマンドが next build
のみとなっています。
next build
コマンドは .next
ディレクトリにハイブリッドページの起動を前提としたファイルをビルドするだけなので、静的HTMLは出力してくれません。
build
のコマンドに next export
を追加することで、out
ディレクトリに静的HTMLを出力するようになります。
{
// 省略
"scripts": {
"dev": "next",
"build": "next build && next export", // 修正
"start": "next start",
"post-update": "echo \"codesandbox preview only, need an update\" && yarn upgrade --latest"
}
}
加えて .gitignore
に out
を追記しておきましょう。
echo "out\n" >> .gitignore
2. amplify initしたときのDistribution Directory Pathが誤っている
amplify init
したときの選択肢「Distribution Directory Path」にデフォルトである build
をそのまま入力していました。
next export
コマンドは out
ディレクトリに静的HTMLを出力するのでこのディレクトリを指定する必要があります。
$ amplify init
Note: It is recommended to run this command from the root of your app directory
? Enter a name for the project next-app
? Enter a name for the environment production
? Choose your default editor: Visual Studio Code
? Choose the type of app that you\'re building javascript
Please tell us about your project
? What javascript framework are you using react
? Source Directory Path: src
? Distribution Directory Path: out # 修正
? Build Command: npm run-script build
? Start Command: npm run-script start
3. amplify hostingしたときのビルドの設定が誤っている(Continuous deployment を選択したときのみ該当)
Amplify ConsoleでContinuous deploymentの設定をするときに、アプリのビルド設定が自動検出されるのですが、ここのディレクトリ指定も build
となっています。
静的HTMLの出力先である out
に修正しましょう。