LoginSignup
6
3

More than 1 year has passed since last update.

【ハンズオン/初学者でも簡単!】Fargateを使ってNuxt.jsを独自ドメインでデプロイする

Last updated at Posted at 2021-10-03

はじめに

以前こちらのアプリを作成しました。

このサイトのデプロイには、ECSのFargateを採用することに決めました。

前回の記事では、ECS/Fargateを使ってデプロイしました。
ただその記事内では、パブリックIPアドレスでのアクセスとなっていました。

なので今回は独自ドメインを取得してそのドメインでアクセスできるようにしましょう!

全ての操作画面を、添付しているので初学者でも取り組みやすいかと思います。
Nuxt.jsでのデプロイでは、Netlifyなどを使用すると思いますが、ポートフォリオにAWSが入っているとそれだけでも評価が高くなります!

ぜひチャレンジしてみてください。

アーキテクチャ

arch2.png

ゴール

独自ドメインで、Nuxt.jsのサイトにたどり着くことが今回のゴールです。

スクリーンショット 2021-10-03 9.13.08.png

対象読者

  • Nuxt.jsを勉強中の方
  • フロントエンドを勉強中の方
  • ポートフォリオのデプロイをNetlifyやHerokuを使用している方
  • ポートフォリオをEC2でデプロイしている方
  • サーバーレスに興味がある方
  • デプロイでAWSを使いたいが簡単な方法が知りたい方

EC2とは違い、Fargateはサーバーレスでアプリケーションの構築を行うことができます。
Dockerを勉強した方は確実にFargateの方が簡単にデプロイすることができます。

ということでやっていきましょう。

ハンズオン

1. AWSへログイン

2. 東京リージョンになっていることを確認

image.png

3. VPCの作成

■ルート
コンソールで「VPC」と検索→左ペイン内の「VPC」を選択→「VPCを作成」を選択

スクリーンショット 2021-10-03 9.56.36.png

4. サブネットを作成

■ルート
コンソールで「VPC」と検索→左ペイン内の「サブネット」を選択→「サブネットを作成」を選択

ロードバランサーを使うためには最低2つのAZで分散しておく必要があるのでサブネットは2つ作成します。

スクリーンショット 2021-10-03 9.58.15.png

スクリーンショット 2021-10-03 9.59.29.png

5. Publicサブネットをインターネットに接続するためにInternet Gatewayを作成しアタッチ

■ルート
コンソールで「VPC」と検索→左ペイン内の「インターネットゲートウェイ」を選択→「インターネットゲートウェイの作成」を選択

スクリーンショット 2021-10-03 10.02.51.png

「VPCへアタッチ」をクリックする。

スクリーンショット 2021-10-03 10.03.22.png

作成したVPCにアタッチします。

スクリーンショット 2021-10-03 10.04.10.png

6. ECSがインターネット接続するためにルートテーブルを作成

■ルート
コンソールで「VPC」と検索→左ペイン内の「サブネット」を選択→「Tutorial-Nuxtjs-Pub1a-001」を選択→「ルートテーブル」を選択→「ルート」へ移動→「ルートを編集」を選択

スクリーンショット 2021-10-03 10.06.10.png

7. Nuxt.jsの準備

Nuxt.jsのアプリケーションを作成します。

ターミナル
❯ npx create-nuxt-app .       

create-nuxt-app v3.6.0
✨  Generating Nuxt.js project in .
? Project name: src
? Programming language: JavaScript
? Package manager: Npm
? UI framework: (Use arrow keys)
? 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? ryo
? Version control system: Git

8. Dockerfileの作成

docker-composeを使ってもいいですが、今回はECRのコマンドに従ってできるDockerfileで作成していきます。

./Dockerfile
# Nodeイメージの取得
FROM node:14.15.3-alpine

# ワーキングディレクトリの指定
WORKDIR /app

# package.json, package-lock.jsonをコピー
COPY package*.json ./

# モジュールをインストール
RUN npm install

# その他のファイルをコピー
COPY . .

# ビルド
RUN npm run build

# ホスト
ENV HOST 0.0.0.0

# ポート
EXPOSE 3000

# 起動
CMD ["npm", "run", "start"]

9. ECRにDockerのイメージをプッシュ

■ルート
コンソールで「ECS」と検索→左ペイン内の「Amazon ECRのリポジトリ」を選択

リポジトリの作成
■ルート
「リポジトリの作成」を選択

image.png

これでリポジトリが作成できました。
この中に入りましょう。

DockerのイメージをECRにプッシュ

次に、「プッシュコマンドの表示」を選択します。

image.png

プッシュするために必要な4つのコマンドが表示されるので、
こちらをターミナルで実行しましょう!

image.png

実行した結果イメージが入っていれば成功です。

スクリーンショット 2021-10-03 10.35.48.png

10. Freenomでドメインを購入する

Freenomは1年間ドメインを無料で使えます。
なのでこちらでドメインを購入しましょう!

どうやればいいかわからない方は以下の記事がわかりやすいので以下の記事を参考にしてみてください。

今回私は、tutorial-nuxtjs.tkというドメインを取得しました。

スクリーンショット 2021-10-03 10.38.51.png

11. Route53と独自ドメインの紐付け

■ルート
コンソールで「Route53」と検索→左ペイン内の「ホストゾーン」を選択→「ホストゾーンの作成」を選択

スクリーンショット 2021-10-03 10.41.26.png

作成が正常に完了すると、NSレコードと呼ばれる値が割り振られます。

スクリーンショット 2021-10-03 10.42.16.png

この値をFreenomの方に書き写していきます。

スクリーンショット 2021-10-03 10.43.42.png

12. ロードバランサーの作成

ロードバランサーは、負荷のバランスを取る装置です。
例えばWebサーバーに負荷がかかりやすいアプリケーションの場合、複数のサーバーに負荷を振り分けます。
これを冗長化と言います。
今回も2台のECSを使っており冗長化しております。

ロードバランサーの主な機能としては3つです。
①ELBにはDNSのアクセスポイントが付与されます。
つまり、アクセスポイントを1つにして負荷を分散させることができます。

②ヘルスチェック機能がある
異常なインスタンスを発見したら通信をキャンセルしてくれます。

③ELBに証明書を付与することでSSL通信の終端になってくれる
HTTPS通信を復号する処理を担当してくれます。
つまり、internet gatewayの段階ではHTTPSだが、サブネット内ではHTTP通信となります。

■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「ロードバランサーの作成」を選択

今回は以下の記事と同じことをするのでこれだけでは意味がわからんという方はこちらを参照されてください。

このまま作成を行うと、3000番ポートをつけないとアクセスできません。
ポート番号なしでアクセスできるようにするためにロードバランサーを使います。
つまり、「ALBで80番で受けて3000番に転送する」ということです。

ALB → ターゲットグループ → EC2の流れでリクエストされるので、ALB(80)→TG(80->3000)→ECS(3000)になります。

それではやっていきましょう。

スクリーンショット 2021-10-03 10.46.40.png

スクリーンショット 2021-10-03 10.47.33.png

スクリーンショット 2021-10-03 10.48.42.png

スクリーンショット 2021-10-03 10.49.42.png

スクリーンショット 2021-10-03 10.50.39.png

13. HTTPSで通信できるようにACMを発行する

AWS Certificate Manager(ACM) で証明書を取得します。

現状http通信でしかアプリケーションを利用できない状態です。
近年は常時SSL化(常に暗号化したデータをユーザーとサーバーでやりとり)が推奨されていて、
Google Chromeではhttp通信のままだと保護されていない通信と出てしまいます。

■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「Tutorial-Nuxtjs-ALB」を選択→「リスナーの追加」を選択

スクリーンショット 2021-10-03 10.53.20.png

スクリーンショット 2021-10-03 10.54.24.png

SSL証明書を発行しましょう!

スクリーンショット 2021-10-03 10.56.37.png

スクリーンショット 2021-10-03 10.57.28.png

Route 53でレコードの作成を行います。

スクリーンショット 2021-10-03 10.58.24.png

スクリーンショット 2021-10-03 10.59.07.png

次はリスナーの追加に戻ってSSL証明書を取得しましょう。

スクリーンショット 2021-10-03 11.00.37.png

リスナーが追加されました!

スクリーンショット 2021-10-03 11.01.25.png

14. ロードバランサーのセキュリティグループを修正

リスナーのHTTPSが使用できないため、セキュリティグループの修正をする必要があります。

■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「Tutorial-Nuxtjs-ALB」を選択→「セキュリティグループ」を選択

スクリーンショット 2021-10-03 11.05.22.png

ロードバランサーのリスナーをHTTPSのみにしましょう。

スクリーンショット 2021-10-03 11.06.33.png

15. ロードバランサーとドメインの紐付け

■ルート
コンソールで「Route53」と検索→左ペイン内の「ホストゾーン」を選択→「tutorial-nuxtjs.tk」を選択→「レコードを作成」を選択

スクリーンショット 2021-10-03 11.08.11.png

スクリーンショット 2021-10-03 11.08.39.png

スクリーンショット 2021-10-03 11.09.14.png

これでロードバランサーとtutorial-nuxtjs.tkは結びつきました。

スクリーンショット 2021-10-03 11.10.16.png

16. ECSのタスク定義の作成

■ルート
コンソールで「ECS」と検索→左ペイン内の「タスク定義」を選択

スクリーンショット 2021-10-03 11.12.12.png

Fargateを選択しましょう。

スクリーンショット 2021-10-03 11.12.38.png

タスクとコンテナの定義の設定画面に進みます。

スクリーンショット 2021-10-03 11.13.43.png

コンテナの追加を行います。

スクリーンショット 2021-10-03 11.16.03.png

これでタスク定義は完了です。

17. ECSのクラスターの作成

■ルート
コンソールで「ECS」と検索→左ペイン内の「クラスター」を選択

image.png

「ネットワーキングのみ」を選択します。

image.png

クラスター名を設定します。

image.png

18. ECSのサービスの作成

では、最後にサービスの作成をしてデプロイしましょう。

image.png

設定を以下のように行います。

スクリーンショット 2021-10-03 11.20.25.png

ネットワーク構成に関しては以下のように設定しましょう。

スクリーンショット 2021-10-03 11.21.50.png

また、セキュリティグループの作成をしましょう。

スクリーンショット 2021-10-03 11.26.56.png

最後に、ロードバランサーの設定を行います。

スクリーンショット 2021-10-03 11.25.07.png

その後のオートスケーリングに関してはデフォルトのままでOKです。

ステータスが「RUNNING」になったら、ページにアクセスしましょう。

スクリーンショット 2021-10-03 11.29.21.png

では、確認します。

スクリーンショット 2021-10-03 11.29.06.png

成功してますね!
これでOKです。

削除手順

簡単に削除手順を説明します。

①ECS(タスク定義→タスク→サービス→クラスター)
②ECR
③ALB
④TG
⑤ACM
⑥Route 53
⑦SG
⑧VPC

この順番だと抜け漏れもなく全て削除できます。

終わりに

今回は、Nuxt.jsを例に行いましたがただポート番号が変わるだけでどんなフレームワークでも同じです!
ぜひ、Fargateを使ってみてください^^

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3