Nuxt3でAmplifyのデプロイ(publish)ができない時のtips
(*「Nuxt3で」と書きましたが、単に自分が試した環境というだけで、「Nuxt3が原因で/固有の」という意味はないです)
まずは普通に上手くいくはずの手順
-
amplify add hosting
(Hosting with Amplify Console
とManual deployment
を選択)をターミナルで叩く -
amplify publish
をターミナルで叩く
で、待っていればURLが発行されてアプリがウェブ上で見えるはずなんですが、本記事はこれが上手くいかなかった人のためのtipsです。
上記の手順が一番楽だと思うんですが、Githubのリポジトリからソースコードを接続し、Amplify Console上でデプロイする方法もあります。上記の方法は失敗した時に手掛かりが少ないので、上手くいかないようならこちらの方法を試すのもありだと思います。
amplify publish
に失敗する
Amplify Consoleでのbuild (構築)やAmplifyのpython3のバージョンが古い問題
アプリ内でpythonパッケージを使っている場合、Amplifyにデフォルトで乗っているpython3のバージョンが古くてパッケージがインストールできない問題が発生します。amplify.yml
におまじないを書いて、新しいバージョンのpython3をインストールする必要があります。
詳細は下記の記事を参考にしてください。
Distribution DirectoryやBaseDirectoryのパスはどこへ...
デフォルトではdist/
になっていると思います。
ウェブの記事等では、これを/dist/
にしましょうと書いてあったりするわけですが、amplify publish
を叩いた時にGenerated public .output/public
と出ているので、.output/public
とするのが正解のようです。
amplify.yml
ってどこにあるの? build setting (ビルドの設定)というタブはないんだが...
ウェブで検索していると、多くの記事でamplify.yml
を書き換える話が書かれています。Amplify Consoleの「ビルドの設定」で書き換える部分なのですが、そもそもこの「ビルドの設定」がない場合があります。
Amplifyのアプリをデプロイする方法は、いくつかあるようですが、Githubのリポジトリからソースコードを接続し、Amplify Console上でデプロイするときにしか(amplify.ymlの設定ができる)「ビルドの設定」は出てこないです。
ちゃんと調べたわけではないですが、amplify publish
でアプリを公開する場合は、amplify configure hosting
を叩いてDistributionDirectory
などを変更するのだと思います(が、自分は最初こっちでやろうとして上手くいかなかったので正解は不明です)。
自分でroot下にamplify.yml
を作成して書き込むという話も見かけますが、実際にそれをやって説明している記事・動画を見かけなかったのでスルーします。
viteエラーが出る
ERROR 'request' is not exported by __vite-browser-external
が出る場合は、nuxt.config.ts
を書き換えるのを忘れているからです。
export default defineConfig({
plugins: [vue()],
resolve: {
alias: [
{
find: './runtimeConfig',
replacement: './runtimeConfig.browser',
},
]
}
})
および
define: {
'window.global': {}
}
とする必要があります。(もしかしたら後者はなくても大丈夫かも?)
Directory Directory Pathでエラーが出る
Zipping artifacts failed. This is often due to an invalid distribution directory path. Run "amplify configure project" to check if your Distribution Directory is pointing to a valid path.
これはエラー文の通りpathを変える必要がある...と思っていたんですが、自分の場合は凡ミスで、これまでnpm run build
(yarn build
)やnpm run generate
(yarn generate
)をしていませんでした。これを叩くと色々ルーティング先が作られるので、叩きましょう。
AccessDeniedのエラーが出る
厄介でした。このエラーだけだと、何が悪いか情報が乏しすぎます...正直完全に理解していないですが、調べたこと・やってみたことを共有します。
(強引な)リダイレクト設定
これは素人目にも(素人だからかもしれないけれど)、見るからに強引な設定なんですが、
「リライトとリダイレクト」→「編集」→「テキストエディタを開く」から、
[
{
"source": "/<*>",
"target": "/index.html",
"status": "404-200",
"condition": null
}
]
とすると、AccessDeniedを突破できます。403エラーを無視して問答無用でリダイレクトしているだけな気がしますが、他の方法では解消できなかったのでこれを採用しました。(正しい方法を知っている方がいたら優しく教えてください)
よくあるリダイレクト設定
自分の場合はこれで解決というわけではなかったんですが、AWS Consoleにて、「リライトとリダイレクト」(旧「書き換えて、リダイレクト」)で設定すると、AccessDeniedを解消できるようです。
これはよく書いてあるので、詳細は下の記事などを参照してください。
amplify.yml
の設定についての補足
amplify.yml
の設定は、BaseDirectory
の値を設定する話がよく書かれていますが、yarnを使っている場合は、
frontend:
phases:
preBuild:
commands:
- npm ci
build:
commands:
- npm run generate
のところで、npm ci
→yarn install
, npm run generate
→yarn generate
にします。たぶん生成時には元からこうなっていると思いますが、解説動画・記事等でnpmにしてあっても、yarnで大丈夫ですよ、と言いたいです。
一旦hosting設定を削除する
-
amplify remove hosting
をターミナルで叩くとホスティングを消せます(amplify push
もしておく必要あり?)。 - Amplify Consoleの「全般」→「ブランチ」→ブランチを選択して「アクション」のところで削除できます
ただし、Githubリポジトリなどを用いずに直にAmplify Consoleでホスティングしたときに作成されるブランチを消すと、あとでamplify add hosting
をしても自動で生成されません。
消した後にamplify publish
を叩くと、「ブランチがありません」と怒られてエラーになります。
さいごに
ここまで試行錯誤してみたことをリストアップしてみたんですが、色々確認するためにもう一度デプロイ作業をしなおしてみたら、以前はBaseDirectoryが.output/public
にしないとエラーになったはずなのに、dist/
でもビルドが通って普通にデプロイ出来たりして、まだ謎が多い状態です。
なのでここに書いたことは、正しい情報であるという保証はなく、諸々の状況の下「これで上手くいくこともある」という程度の内容だと思ってください。また、こういうのは仕様変更ですぐに賞味期限切れになると思うので(だからこそ古い記事に振り回されて迷走するわけで、だからこそこの記事を書いたわけですが)、ナマモノだということも強調しておきます。
それでは。頑張りましょう。
Discussion