LINE MessageAPIで作った天気予報アプリをAWSでデプロイしてみた！

以前作成したアプリのデプロイに関する記事です。

無料で使いたいのでherokuへデプロイしましたが、Flex Messageが届きませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/034cce25-2e95-e6f9-e36a-c12348e8a7b1.png)

ということでお金がかかりますが、AWSにデプロイすることにします。

アプリ作成までの記事はこちらです。

https://qiita.com/Ryo9597/items/bcb807688f35d6a72861

それではAWSへのデプロイをやっていきましょう！
今回のアプリはDBを使っていませんが、もしかしたら使うこともあると思うので一応RDSも使います。

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

### 2. 東京リージョンになっていることを確認
![スクリーンショット 2021-05-01 14.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/73a9450b-47d7-5c13-54a7-e5e882db1e49.png)

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

![スクリーンショット 2021-06-06 9.19.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/293e84f5-6577-bb61-637d-031d40807c45.png)

### 4. サブネットを作成（IP:10.0.0.0/24, 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24）
■ルート
コンソールで「VPC」と検索→左ペイン内の「サブネット」を選択→「サブネットを作成」を選択

#### Public Subnetを作成（IP:10.0.0.0/24, 10.0.1.0/24)
Laravelで使うサブネットを作成します。

![スクリーンショット 2021-06-06 9.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/2426ea9a-c913-f031-017b-7c4d916ee9e9.png)

![スクリーンショット 2021-06-06 9.25.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/dff8731b-b1fb-568e-0f4f-bb602a287063.png)

#### Private Subnetを作成（IP:10.0.2.0/24, 10.0.3.0/24)
RDS(MySQL)で使うサブネットを作成します。

![スクリーンショット 2021-06-06 9.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/f0fc5e41-18cb-1c7d-6c89-f0890faf4366.png)

![スクリーンショット 2021-06-06 9.27.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/4d0cd02d-bf05-78ca-e40b-ae7148ca07d6.png)

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

![スクリーンショット 2021-06-06 9.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/981e8b38-75ec-1934-f513-e8460cdd966f.png)

![スクリーンショット 2021-06-06 9.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/e1571448-61be-4f98-5ceb-c0bfef4c65c9.png)

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

![スクリーンショット 2021-06-06 9.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/91a4641c-f161-3679-3ca0-68d44d879656.png)

### 7. Publicサブネット内にEC2を構築
■ルート
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「インスタンスを起動」を選択

#### ■ステップの流れ
##### ①**Amazon Linux 2 AMI (HVM), SSD Volume Type**を選択
##### ②**t2.micro**を選択
##### ③インスタンスの詳細の設定の、`ネットワーク`, `サブネット`, `自動割り当てパブリックIP`を変更
![スクリーンショット 2021-06-06 9.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/a3da796e-7744-b017-072e-b18288a70012.png)
##### ④ストレージはそのままでOK
##### ⑤キーを`Name`で追加（値は任意でOK）
![スクリーンショット 2021-06-06 9.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/070d7151-32fe-1935-59f6-f6c8342c53e8.png)
##### ⑥セキュリティーグループを変更
EC2は、HTTP通信でリクエスト、レスポンスを行うため`HTTP`を許可します。
![スクリーンショット 2021-06-06 9.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/85a4d05a-dc15-c209-df0c-225f3e31d9df.png)
##### ⑦キーペアの作成
私は事前に作成しているキーペアがあるのでそちらを使います。
このキーペアは`desktop`にでも保存しておきましょう。
![スクリーンショット 2021-06-06 9.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/326c5832-02f5-f25a-9676-7a498032dba8.png)

以前書いたEC2の記事です。
基本的な内容になっているのでEC2ってなんやねんって方は見てもらえると！

https://qiita.com/Ryo9597/items/342cf2037878e4ef782c

### 8. EC2のIPアドレスを固定するために`Elastic IP`を導入する
IPアドレスを固定する理由としては、インスタンスを再起動しても同じIPアドレスに固定しておきたいためです。

通常、インスタンスを再起動するとIPアドレスが変わってしまいます。
それでは再起動する度にSSH接続の設定を変えないといけないため、IPアドレスを固定します。

ちなみに、Elastic IPは関連づけを行わなければ費用が発生します。
その点はご注意ください。


■ルート
コンソールで「EC2」と検索→左ペイン内の「Elastic IP」を選択→「Elastic IPアドレスの割り当て」を選択

![スクリーンショット 2021-06-06 9.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/1eb7de4f-0764-18da-1003-ed0583ba74ce.png)

作成できたら次は関連づけを行います。

![スクリーンショット 2021-06-06 9.44.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/c296c29a-0409-3d02-b4b0-da12676e7c5e.png)

![スクリーンショット 2021-06-06 9.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/16351851-9804-2fd2-000e-2cda1ca44dde.png)

### 9. SSH接続でログイン
ターミナルを開きましょう。

```terminal:ターミナル
// ①キーペアがあるところへ移動
$ cd desktop

// ②キーペア発見
$ ls -l Keypair.pem
-rw-r--r--@ 1 ryo  staff  1704  5  1 14:38 Keypair.pem

// ③権限を４００に変更
$ chmod 400 Keypair.pem

// ④SSH接続
$ ssh -i Keypair.pem ec2-user@(パブリックIPアドレス)

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|
```

これでEC2にログインできました。
それでは動作するために必要なものをまとめてみましょう。
<ul>
<li>**パッケージのアップデート**</li>
<li>**PHP7.4のインストール**</li>
<li>**PHPの拡張機能のインストール**</li>
<li>**Composerのインストール**</li>
<li>**GitHubからソースコードをクローン**</li>
<li>**vendorのインストール**</li>
<li>**Laravelの初期設定**</li>
<ul>
<li>環境設定ファイルの準備</li>
<li>アプリ固有のキーを発行</li>
<li>ディレクトリの権限変更</li>
</ul>
<li>**nginxのインストール**</li>
<ul>
<li>nginxの起動と再起動</li>
<li>ドキュメントルートなどのnginx設定</li>
</ul>
</ul>

結構やることは多いですがそんなに難しくないので頑張りましょう！

#### パッケージのアップデート
まずはパッケージのアップデートを以下のコマンドで行います。

```terminal:ターミナル
$ sudo yum update -y
```

#### PHP7.4のインストール
`php7.4`や`nginx`のインストールには、Amazon Linuxで提供している`amazon-linux-extras`というコマンドを使用します。

`amazon-linux-extras`とはあらかじめAWSでインストールされているソフトウェアを起動させることで簡単に利用できるシステムです。
さっそく以下のコマンドを入力してみましょう。

```terminal:ターミナル
// amazon-linux-extras
$ amazon-linux-extras
 0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  5  postgresql9.6            available    \
        [ =9.6.6  =9.6.8  =stable ]
  6  postgresql10             available    [ =10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
 11  vim                      available    [ =8.0  =stable ]
 15  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
          =7.2.16  =7.2.17  =7.2.19  =7.2.21  =7.2.22  =7.2.23
          =7.2.24  =7.2.26  =stable ]
 17  lamp-mariadb10.2-php7.2  available    \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5
          =10.2.10_7.2.8  =10.2.10_7.2.11  =10.2.10_7.2.13
          =10.2.10_7.2.14  =10.2.10_7.2.16  =10.2.10_7.2.17
          =10.2.10_7.2.19  =10.2.10_7.2.22  =10.2.10_7.2.23
          =10.2.10_7.2.24  =stable ]
 18  libreoffice              available    \
        [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    \
        [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50
          =stable ]
 24  epel                     available    [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 28  firecracker              available    [ =0.11  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 31  php7.3                   available    \
        [ =7.3.2  =7.3.3  =7.3.4  =7.3.6  =7.3.8  =7.3.9  =7.3.10
          =7.3.11  =7.3.13  =stable ]
 32  lustre2.10               available    \
        [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
 42  php7.4                   available    [ =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
 46  collectd                 available    [ =stable ]
 47  aws-nitro-enclaves-cli   available    [ =stable ]
 48  R4                       available    [ =stable ]
 49  kernel-5.4               available    [ =stable ]
 50  selinux-ng               available    [ =stable ]
 51  php8.0                   available    [ =stable ]
 52  tomcat9                  available    [ =stable ]
 53  unbound1.13              available    [ =stable ]
 54  mariadb10.5              available    [ =stable ]
 55  kernel-5.10              available    [ =stable ]
 56  redis6                   available    [ =stable ]
```

現時点では合計56個のパッケージとそのバージョンが表示されています。
では、amazon-linux-extrasを利用したPHPのインストールをしましょう。

```terminal:ターミナル
// PHP7.4のインストール
$ sudo amazon-linux-extras install -y php7.4

// バージョンを確認（OKです）
$ php -v
PHP 7.4.19 (cli) (built: May 13 2021 22:36:40) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
```

#### PHPの拡張機能のインストール
Laravelのインストール時やプロジェクト作成時にこれらの拡張機能がないとうまくいきません。

```terminal:ターミナル
$ sudo yum install -y php-mbstring php-dom php-zip
```

#### composerのインストール
PHPのパッケージマネージャーであるcomposerをインストールしていきましょう。
curlコマンドはインターネット上のファイルを取得するコマンドで、ダウンロードしたcomposerのインストーラーをphpで実行するコマンドになります。

どこでもcomposerコマンドを使えるようにパスを通しましょう。
mvコマンドを使って、/usr/bin/に移動させることにより、どのディレクトリからでもcomposerコマンドを使えるようになります。

```terminal:ターミナル
// Composerのインストール
$ curl -sS https://getcomposer.org/installer | php

// Composerがどこでも使えるようにパスを通す
$ sudo mv composer.phar /usr/bin/composer

// バージョンを確認（OKです）
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.1.1 2021-06-04 08:46:46
```

#### GitHubからソースコードをクローン

```terminal:ターミナル
// GitHubからソースコードをクローンをする準備
// ディレクトリを作成して移動する
$ sudo mkdir /var/www
$ cd /var/www

// アクセス権限を変更
$ sudo chmod 777 .

// gitをインストール
$ sudo yum install -y git

// GitHubからソースコードをクローン
$ git clone https://github.com/ssk9597/LINE-Weather.git

// アクセス権限を変更して誰でも書き込みできないようにする
sudo chmod 0755 .
```

#### vendorのインストール
GitHubからクローンしても`vendorディレクトリ`は付属してきません。
その理由としてはそもそもvendorはフレームワークの根幹機能がまとまったディレクトリになります。

そのため、バージョンが同じであれば同じ内容になります。
しかも容量が大きいためGitHubにアップロードするのは非効率です。
JavaScriptなどでいうと、`node_modules`と一緒です。

`vendor`はLaravelを利用する環境で、composerを使って個別にダウンロードする必要があります。

```terminal:ターミナル
// ディレクトリに移動する
$ cd LINE-Weather
$ cd src

// vendorのインストール
$ composer install
```

#### Laravelの初期設定
```terminal:ターミナル
// 環境設定ファイルの準備
$ cp .env.example .env

// アプリ固有のキーを発行
$ php artisan key:generate

// ディレクトリの権限変更
$ chmod 0777 -R storage
$ chmod 0777 -R bootstrap
```

#### nginxのインストール
nginxはapacheと似た機能を提供するWebサーバーです。

主な違いとしては駆動方式です。

apacheはユーザーからのアクセスの度にプロセスを立ち上げる駆動方式に対して、nginxはプロセスは増えずループによってユーザーからのアクセスを捌く方式です。

そのため、nginxの方がメモリ効率良く、近年においてはnginxのシェアが高まってきています。

https://news.mynavi.jp/article/20190425-814314/

```terminal:ターミナル
// nginxをインストール
$ sudo amazon-linux-extras install -y nginx1

// バージョンを確認（OKです）
$ nginx -v
nginx version: nginx/1.20.0

// nginxが再起動後も自動的に動くようにする
$ sudo systemctl enable nginx

// nginxをスタート状態に
sudo service nginx start
```

nginxを起動したら、EC2のIPアドレスにブラウザからアクセスしてみましょう。

以下のようなnginxの初期画面が表示されていれば、正常に動作しています。

![スクリーンショット 2021-06-07 9.20.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/fc2a13dd-a41a-b176-0e6a-79a7b872aea0.png)

##### ドキュメントルートなどのnginx設定

```terminal:ターミナル
$ sudo vi /etc/nginx/nginx.conf
```

```conf:etc/nginx/nginx.conf
  server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        # ==========ここを編集する==========
        root         /var/www/LINE-Weather/src/public;
        # ==========ここを編集する==========

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        # ==========ここを編集する==========
        location / {
          try_files $uri $uri/ /index.php?$query_string;
        }
        # ==========ここを編集する==========

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
```

ここまで編集できましたら、nginxを再起動します。

```terminal:ターミナル
$ sudo service nginx restart
```

### 10. AMIの作成
今回は冗長化されたウェブサービスを作るので上記と同じ内容のEC2インスタンスを作る必要があります。
しかし、またゼロからポチポチするのもめんどくさいので、上記で作ったEC2インスタンスからコピーしましょう。
その仕組みをAMIと言います。

作成した**001-LINE-Weather**を停止してAMIを作成します。

■ルート
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「インスタンスの状態」から停止を選択
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「アクション」から「イメージを作成」を選択

![スクリーンショット 2021-06-07 9.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/b3737e9e-f7cf-bdfb-c83b-79c6886fcbff.png)

### 11. 作成したAMIを使ってインスタンスを作成

![スクリーンショット 2021-06-07 9.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/e53c8b70-1454-f60f-f770-39f05cb41ad3.png)

![スクリーンショット 2021-06-07 9.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/12725b20-8f4e-6370-ccce-a6bc677179b0.png)

![スクリーンショット 2021-06-07 9.34.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/8c7a181f-4d69-5af8-e9d7-5a58851a7e7e.png)

### 12. EC2のIPアドレスを固定するために`Elastic IP`を導入する
新しく作成したEC2インスタンスの**002-LINE-Weather**に`Elastic IP`を導入しましょう。
上記でやったことを繰り返すだけなので省略します。

### 13. PrivateサブネットにRDSを構築
AWSのサービスであるRDSを利用してMySQLを立ち上げLaravelと連携できるようにします。

以前書いたRDSの記事です。

https://qiita.com/Ryo9597/items/b9f642b824b2eb9b8c10

#### サブネットグループの作成
RDSには、**エンドポイント通信**という機能があります。
もし通信障害などが発生して、親のRDSが使えなくなった時子のRDSに接続してくれる機能です。
つまり、このことから**異なるAZにサブネットがないとRDSは使えません**。

ということで複数のサブネットにまたがる形でRDSは構築されるので、
**サブネットグループ**というものが必要になります。

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

![スクリーンショット 2021-06-07 9.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/44802c68-9df9-993f-9325-ce681aea14c1.png)

##### DBの作成
■ルート
コンソールで「RDS」と検索→左ペイン内の「データベース」を選択→「データベースの作成」を選択

追記する部分のみスクショしました。

![スクリーンショット 2021-06-07 9.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/277c2d1b-7253-620b-69f0-d8acb01c6595.png)

![スクリーンショット 2021-06-07 9.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/c9b324e2-73b1-1b38-903f-0889f4a44e9d.png)

![スクリーンショット 2021-06-07 9.42.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/42ef0b89-667b-6a5c-da9c-d9f8d8b557d8.png)

![スクリーンショット 2021-06-07 9.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/0249c43f-37c7-67bb-7c57-96d684655c29.png)

##### セキュリティグループを修正
■ルート
コンソールで「VPC」と検索→左ペイン内の「セキュリティグループ」を選択→「RDS-SG-1」を選択

DBは重要な情報が入っているため誰でも彼でもアクセスできると困ります。
なので、PublicサブネットのEC2（セキュリティグループ→EC2-LINE-Weather-SG）からしか触れないように修正します。

![スクリーンショット 2021-06-07 9.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/3ebc0e49-c0de-e37c-2b86-4f771fd6e752.png)

##### LaravelのDB接続設定
EC2（Laravel）からRDSに接続するための設定を行っていきます。
EC2は2台あるので、両方ともに同じ設定をする必要があります。

2台ともSSH接続を行ってください。

```terminal:ターミナル
// SSH接続
$ ssh -i Keypair.pem ec2-user@（パブリックIP）

// .envファイルを編集
$ vi /var/www/LINE-Weather/src/.env
```

```env:/var/www/LINE-Weather/src/.env
DB_CONNECTION=mysql
DB_HOST=line-weather.cjsmw2zqsiga.ap-northeast-1.rds.amazonaws.com
DB_PORT=3306
DB_DATABASE=line_weather
DB_USERNAME=admin
DB_PASSWORD=password

// LINE
LINE_CHANNEL_SECRET=???
LINE_CHANNEL_ACCESS_TOKEN=???

// OpenWeatherAPI
WEATHER_API=???
```

```terminal:ターミナル
// 移動
$ cd /var/www/LINE-Weather/src

// migrate
$ php artisan migrate
```

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

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

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

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

以前書いたELBの記事です。
ELBに関して詳しく知りたい方はどうぞ。

https://qiita.com/Ryo9597/items/b565755667b423765ff4

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

![スクリーンショット 2021-06-07 9.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/f2abefe3-aad8-3dfc-6e68-0607a9ba94c2.png)

![スクリーンショット 2021-06-07 9.59.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/4e0399ec-3c3e-75ac-7719-ce0df6c80a80.png)

![スクリーンショット 2021-06-07 10.00.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/727887a5-6220-aea9-3ee0-e8cfc9be42a2.png)

![スクリーンショット 2021-06-07 10.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/dd728062-a65a-fe10-1206-4f1a5ecd954e.png)

### 15. EC2のセキュリティグループのアクセス許可をロードバランサーからに変更する
■ルート
コンソールで「EC2」と検索→左ペイン内の「セキュリティグループ」を選択→「EC2-LINE-Weather-SG」を選択

![スクリーンショット 2021-06-07 10.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/8e9096f5-11dd-c152-7a77-50ec70e35cf3.png)

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

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

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

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

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

![スクリーンショット 2021-06-07 10.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/7197d808-7826-be5d-90c0-1a06fd9581aa.png)

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

![スクリーンショット 2021-06-07 10.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/1b54fe40-2025-2032-12a6-5bbeb6b5a11e.png)

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

![スクリーンショット 2021-06-07 10.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/d0369fd9-88ba-dbe7-852f-6cdee6a4cf19.png)

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

![スクリーンショット 2021-06-07 10.10.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/36a4fcfd-2938-86f5-a574-9428f3e3c2a7.png)

以前書いたS3とRoute 53の記事です。
S3とRoute 53に関して詳しく知りたい方はどうぞ。

https://qiita.com/Ryo9597/items/6d89595840a659b646cb

### 18. ドメインとロードバランサーを紐付ける
■ルート
コンソールで「Route53」と検索→左ペイン内の「ホストゾーン」を選択→「line-weather-fashion.tk」を選択→「レコードを作成」を選択

![スクリーンショット 2021-06-07 10.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/ba96efec-a1ce-9d24-35b7-96f47afd386c.png)

![スクリーンショット 2021-06-07 10.12.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/2cbb31ab-f354-07cf-0d32-2bedd3305e7a.png)

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

![スクリーンショット 2021-06-07 10.13.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/9f59b54b-c310-0dd3-0f47-e1e22434729f.png)

成功ですね！

### 19. ロードバランサーでリスナーを追加する
AWS Certificate Manager（ACM） で証明書を取得します。

現状http通信でしかアプリケーションを利用できない状態です。

近年は常時SSL化（常に暗号化したデータをユーザーとサーバーでやりとり）が推奨されていて、
Google Chromeではhttp通信のままだと保護されていない通信と出てしまいます。

![スクリーンショット 2021-06-07 10.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/80992ba4-0bc9-856d-0f58-0c6f78c02605.png)

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

![スクリーンショット 2021-06-07 10.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/a5d35f18-a23a-4cd9-3836-4ba5d6b2f013.png)

「新しいACM証明書をリクエスト」で発行を行います。

![スクリーンショット 2021-06-07 10.16.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/2afdf7d0-c4a9-3a3b-20e7-5c1d4e0f5e39.png)

![スクリーンショット 2021-06-07 10.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/bee5da95-1691-b53c-ddab-4d8d7fce0607.png)

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

![スクリーンショット 2021-06-07 10.17.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/b3817a17-9d03-f68c-fb42-78b2b611fbf4.png)

![スクリーンショット 2021-06-07 10.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/ffd70405-a178-eb9e-ab06-38c33c7dcf07.png)

ありましたね！
証明書の検証に時間がかかるので成功になるまで待ちましょう。

成功に変わったら、次はリスナーの追加に戻ってSSL証明書を取得しましょう。

![スクリーンショット 2021-06-07 10.19.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/27c4337b-5177-585f-dcb1-0a4be25e6304.png)

### 20. セキュリティグループの修正でHTTPSへのリダイレクト設定
■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「LB-LINE-Weather-SG」を選択→「セキュリティグループ」を選択

![スクリーンショット 2021-06-07 10.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/9ffaa374-8c7d-188c-cb47-2c01c4ffde47.png)

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

![スクリーンショット 2021-06-07 13.50.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/5a159459-849b-c44f-cc08-fa861aec8399.png)

## 終わりに
HTTPSでアクセスできました。

![スクリーンショット 2021-06-07 13.51.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/3674b642-c4de-58c7-6f1f-3f0005263a17.png)

### **だが...動かぬ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/5f3555a0-2e4d-73ae-3d3d-c77f9355c0fa.png)

![iOS の画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/4ffebc5c-acbc-06c2-755d-b3551d4e5004.png)

**Flex Message**ってどれくらいCPUとメモリ食うんでしょうね。。

`t2.micro`からバランスの取れたCPUとバランスの取れたメモリ数のM系に変えて検証してみます。
このアプリに、M系はお財布痛すぎるので、最終的には`Flex Message`をやめて無料で運用できるHerokuにしようと思います。

こんな未完成なハンズオン記事はねーだろと思いますが、**「一応デプロイはできたぞ」**という記事でした。