Nuxt.js + AWS ECS Fargate その1(Nuxt.jsアプリ作成〜ECRリポジトリへのプッシュ)

トレンドのVuejs/NuxtをAws ECS, FargateでSSR、詳細解説します🚀 の記事を参考に進めてみる。
ローカル環境 使用バージョン
- Node.js: 12.11.0
- AWS CLI: 2.1.31
Nuxt.js アプリの作成
create nuxt-app で作成します。
$ yarn create nuxt-app nuxt-fargate_app
yarn create v1.13.0
create-nuxt-app v3.6.0
...
設定項目は下記のようにしました。
Fargateで動かすのでRendering modeはUniversalを指定。
しばらく触ってないと細々変わりますね。。
? Project name: nuxt-fargate_app
? Programming language: JavaScript
? Package manager: Npm
? UI framework: None
? Nuxt.js modules: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Linting tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Testing framework: None
? Rendering mode: Universal (SSR / SSG)
? Deployment target: Server (Node.js hosting)
? Development tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? What is your GitHub username? yuhei jotaki
? Version control system: Git
Dockerfile を使用してイメージを作成
Docker 向けに package.json の scripts を調整する。
...
"scripts": {
"dev": "HOST=0.0.0.0 PORT=3000 nuxt",
"build": "nuxt build",
"start": "HOST=0.0.0.0 PORT=3000 nuxt start",
"generate": "nuxt generate"
},
...
Dockerfile をプロジェクトディレクトリに作成して下記のようにする。
Node.jsのバージョンは 公式のイメージ を参考にする。
FROM node:12
RUN mkdir -p /var/www/nuxt-fargate_app
WORKDIR /var/www/nuxt-fargate_app
COPY ./ /var/www/nuxt-fargate_app
RUN npm run build
EXPOSE 3000
ENTRYPOINT ["npm", "run", "start"]
次にDockerアプリをrunningにする。
その後ビルドしてイメージが作成できているか確認。
$ docker build -t nuxt-fargate_app .
...
Successfully tagged nuxt-fargate_app:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nuxt-fargate_app latest XXXXX 39 seconds ago 1.03GB
...
起動してみる。
ここはあまり分かってないですが、 0.0.0.0:3000 でアクセスできたのでOKなのかな
$ docker run -d -p 3000:3000 nuxt-fargate_app
...
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61f86de41a7a nuxt-fargate_app "npm run start" 21 seconds ago Up 19 seconds 0.0.0.0:3000->3000/tcp amazing_yalow
ECRでリポジトリを作成してイメージをプッシュする
AWS ECR > リポジトリ作成をする。
今回は nuxt-fargate_app というリポジトリ名にしました。
その後コマンドで認証してイメージをプッシュする。
それぞれつまづきましたが、認証は get-login は現在非推奨のため get-login-password が良いとのことで Amazon ECR での AWS CLI の使用 - Amazon ECR を参考にしました。
※ 後々振り返ると、ECRコンソール内 > リポジトリ > 該当リポジトリを選択 > プッシュコマンドの表示 にもコマンドが書いてありました。
# <profile-name>: ~/.aws/credentials のプロファイルの名前
# <app-name>: nuxt-fargate_app
# <aws-region-name>: ap-northeast-1
# <aws-account-id>: アカウントID
# ユーザー切り替え
$ export AWS_DEFAULT_PROFILE=<profile-name>
# 認証トークンを取得し、レジストリに対して Docker クライアントを認証します。
$ aws ecr get-login-password | docker login --username AWS --password-stdin https://<aws-account-id>.dkr.ecr.<aws-region-name>.amazonaws.com
# Docker イメージを構築します。
$ docker build -t <app-name>:latest .
# 構築が完了したら、このリポジトリにイメージをプッシュできるように、イメージにタグを付けます。
$ docker tag <app-name>:latest <aws-account-id>.dkr.ecr.<aws-region-name>.amazonaws.com/<app-name>:latest
# 新しく作成した AWS リポジトリにこのイメージをプッシュします。
$ docker push <aws-account-id>.dkr.ecr.<aws-region-name>.amazonaws.com/<app-name>:latest
以上でイメージをプッシュできました。

AWSのコンソールやCLI最近あまり触る機会がなかったですが、CLIのバージョンアップやプロファイルの切り替え等々つまづくところが多かったです。
正直あまり分かってない部分も多いですが、次回以降はECSの設定になりそうですので引き続き更新できたらと思います。