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

## はじめに
以前こちらのアプリを作成しました。

https://qiita.com/Ryo9597/items/8e34de4eb0af5a9d0cf3

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

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

https://qiita.com/Ryo9597/items/9fc50ecc7d0b233af30d#12-ecs%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90

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

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

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

## アーキテクチャ

![arch2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/8cf6425b-db8b-87c4-89f2-23279a9931c2.png)


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

![スクリーンショット 2021-10-03 9.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/30bda031-c7b5-72d7-8b06-776ab45c495f.png)

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

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

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

## ハンズオン
### 1. AWSへログイン

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/f743bf17-b282-eb24-7f67-7008defac7ec.png)

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

![スクリーンショット 2021-10-03 9.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/1c7772f9-7cb3-ab1a-2e8f-6d553a382870.png)

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

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

![スクリーンショット 2021-10-03 9.58.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/d9f47668-3393-b1b0-f2ed-465dc4524d67.png)

![スクリーンショット 2021-10-03 9.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/516fd33e-7eff-19b7-6d64-8e85e62217fc.png)

### 5. Publicサブネットをインターネットに接続するためにInternet Gatewayを作成しアタッチ
■ルート
コンソールで「VPC」と検索→左ペイン内の「インターネットゲートウェイ」を選択→「インターネットゲートウェイの作成」を選択

![スクリーンショット 2021-10-03 10.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/1d57fb18-db02-9261-bd2b-8fdbca437b91.png)

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

![スクリーンショット 2021-10-03 10.03.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/0caecce4-002d-a024-8d21-1a49fc8021ea.png)

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

![スクリーンショット 2021-10-03 10.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/6817b04f-9d05-7f48-ed70-ddd892abe677.png)

### 6. ECSがインターネット接続するためにルートテーブルを作成
■ルート
コンソールで「VPC」と検索→左ペイン内の「サブネット」を選択→「Tutorial-Nuxtjs-Pub1a-001」を選択→「ルートテーブル」を選択→「ルート」へ移動→「ルートを編集」を選択

![スクリーンショット 2021-10-03 10.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/15d98d72-0cd1-734f-5d31-aaa215bcf952.png)

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

```terminal:ターミナル
❯ 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:./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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/8c66da4b-bc35-b1e3-8d7e-37b8756a64e7.png)

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/2c2201d1-ae8b-25cc-4aef-7e1b7cf6001a.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/44a70a2e-9bf1-cf99-d1a6-d62bd7b5848d.png)

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

![スクリーンショット 2021-10-03 10.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/b9f96f29-73bd-f728-35a9-ce10d1e3ac8d.png)

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

https://www.freenom.com/ja/index.html

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

https://note.com/dafujii/n/n406f385651e2

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

![スクリーンショット 2021-10-03 10.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/43f6482a-0e31-14fd-81b8-939bfd3e0ea6.png)

### 11. Route53と独自ドメインの紐付け
■ルート
コンソールで「Route53」と検索→左ペイン内の「ホストゾーン」を選択→「ホストゾーンの作成」を選択

![スクリーンショット 2021-10-03 10.41.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/4e7b493d-4a13-cff3-4910-9bee7b31febb.png)

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

![スクリーンショット 2021-10-03 10.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/6ea7d41a-a002-47ef-e9dd-632243503991.png)

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

![スクリーンショット 2021-10-03 10.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/0ee601d7-7d80-ef89-add2-8fdb0800e4ca.png)

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

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

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

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

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

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

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

https://dev.classmethod.jp/articles/aws-alb-port/


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

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

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

![スクリーンショット 2021-10-03 10.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/dd802b9f-8cf4-6c63-8ad5-3f03b299b893.png)

![スクリーンショット 2021-10-03 10.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/adf182d3-5212-f345-b9c7-c9666561f7db.png)

![スクリーンショット 2021-10-03 10.48.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/515c280f-2561-f824-10b8-f6f335bc78c2.png)

![スクリーンショット 2021-10-03 10.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/6480f179-03e2-0a17-32b0-d84933031687.png)

![スクリーンショット 2021-10-03 10.50.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/de594e14-a06f-c09d-9d42-82a7693fd7e4.png)

### 13. `HTTPS`で通信できるようにACMを発行する
AWS Certificate Manager（ACM） で証明書を取得します。

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

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

![スクリーンショット 2021-10-03 10.53.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/ffb91232-e577-866e-4560-24a9422aed5a.png)

![スクリーンショット 2021-10-03 10.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/255641f4-f910-f4ca-a020-996a03b29993.png)

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

![スクリーンショット 2021-10-03 10.56.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/d2bd0b1a-c782-1454-7a84-8a4550ab568b.png)

![スクリーンショット 2021-10-03 10.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/71791938-6041-0dbb-f5fb-c340abd1c38a.png)

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

![スクリーンショット 2021-10-03 10.58.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/b553d9f2-f7ae-cbad-795d-a0475556c2a7.png)

![スクリーンショット 2021-10-03 10.59.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/e0a8f802-a5f4-295b-9c6a-34ae16b6257b.png)

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

![スクリーンショット 2021-10-03 11.00.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/b3dbc720-6320-2316-46fa-0038dbb7a5f1.png)

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

![スクリーンショット 2021-10-03 11.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/b291534f-9465-5080-ec44-8d293123b5d3.png)

### 14. ロードバランサーのセキュリティグループを修正
リスナーのHTTPSが使用できないため、セキュリティグループの修正をする必要があります。

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

![スクリーンショット 2021-10-03 11.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/08d1b515-b9ec-af02-0beb-e6adc2345ab6.png)

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

![スクリーンショット 2021-10-03 11.06.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/fdb9f1cb-af3b-9632-4c77-7e69361ac08b.png)

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

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

![スクリーンショット 2021-10-03 11.08.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/7b2cad57-f6bd-13bb-e26e-88ca7646a946.png)

![スクリーンショット 2021-10-03 11.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/c6632aaa-d155-4dc0-aa3e-08c1e9cac66e.png)

![スクリーンショット 2021-10-03 11.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/edcb6805-e29e-c709-2cf9-69a6f04badde.png)

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

![スクリーンショット 2021-10-03 11.10.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/d472400e-edc3-9df1-9823-0a8937532a7c.png)

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

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

![スクリーンショット 2021-10-03 11.12.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/570f6745-291d-79a7-aed7-63d7436b93e9.png)

Fargateを選択しましょう。

![スクリーンショット 2021-10-03 11.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/f9521bb8-948e-c4af-3da9-03e2540c9b6a.png)

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

![スクリーンショット 2021-10-03 11.13.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/9ee9ee5b-fab3-b5d7-913e-29d8739740f9.png)

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

![スクリーンショット 2021-10-03 11.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/1d827297-c525-5d3c-acba-f6430849d8ca.png)

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/8f9c0434-721c-2edd-5a67-0d084090a96e.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/39b63c23-678c-fe5d-8466-7b4774df5d37.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/6e109f99-07d2-4c77-8729-ee463d0118c4.png)

### 18. ECSのサービスの作成

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/8abfcaa6-116b-d610-aebf-bee38d32fe2a.png)

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

![スクリーンショット 2021-10-03 11.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/92123ce1-d30d-2385-2501-c0e3dd7495bf.png)

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

![スクリーンショット 2021-10-03 11.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/c0fc6105-a61a-7d8f-a82e-bd28af68081c.png)

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

![スクリーンショット 2021-10-03 11.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/9600a4fd-8f27-c916-1677-6a9e8ee19ddd.png)

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

![スクリーンショット 2021-10-03 11.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/43cc9c7a-3bc9-e28e-b065-fc0a5cb5a1fc.png)

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

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

![スクリーンショット 2021-10-03 11.29.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/ac823d2a-f58c-f2e9-11cc-3441a7048865.png)

では、確認します。

![スクリーンショット 2021-10-03 11.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/ceabab56-0151-7513-cd1e-ee2d0e1fa958.png)

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

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

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

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

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