8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-06-07

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

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

image.png

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

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

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

ハンズオン

1. AWSへログイン

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

スクリーンショット 2021-05-01 14.21.09.png

3. VPCを作成(IP:10.0.0.0/21)

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

スクリーンショット 2021-06-06 9.19.49.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

スクリーンショット 2021-06-06 9.25.01.png

Private Subnetを作成(IP:10.0.2.0/24, 10.0.3.0/24)

RDS(MySQL)で使うサブネットを作成します。

スクリーンショット 2021-06-06 9.26.25.png

スクリーンショット 2021-06-06 9.27.24.png

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

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

スクリーンショット 2021-06-06 9.28.48.png

スクリーンショット 2021-06-06 9.29.16.png

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

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

スクリーンショット 2021-06-06 9.31.01.png

7. Publicサブネット内にEC2を構築

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

■ステップの流れ

Amazon Linux 2 AMI (HVM), SSD Volume Typeを選択
t2.microを選択
③インスタンスの詳細の設定の、ネットワーク, サブネット, 自動割り当てパブリックIPを変更

スクリーンショット 2021-06-06 9.34.56.png

④ストレージはそのままでOK
⑤キーをNameで追加(値は任意でOK)

スクリーンショット 2021-06-06 9.36.12.png

⑥セキュリティーグループを変更

EC2は、HTTP通信でリクエスト、レスポンスを行うためHTTPを許可します。
スクリーンショット 2021-06-06 9.39.45.png

⑦キーペアの作成

私は事前に作成しているキーペアがあるのでそちらを使います。
このキーペアはdesktopにでも保存しておきましょう。
スクリーンショット 2021-06-06 9.40.40.png

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

8. EC2のIPアドレスを固定するためにElastic IPを導入する

IPアドレスを固定する理由としては、インスタンスを再起動しても同じIPアドレスに固定しておきたいためです。

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

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

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

スクリーンショット 2021-06-06 9.43.18.png

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

スクリーンショット 2021-06-06 9.44.16.png

スクリーンショット 2021-06-06 9.44.55.png

9. SSH接続でログイン

ターミナルを開きましょう。

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

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

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

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

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

これでEC2にログインできました。
それでは動作するために必要なものをまとめてみましょう。

  • **パッケージのアップデート**
  • **PHP7.4のインストール**
  • **PHPの拡張機能のインストール**
  • **Composerのインストール**
  • **GitHubからソースコードをクローン**
  • **vendorのインストール**
  • **Laravelの初期設定**
    • 環境設定ファイルの準備
    • アプリ固有のキーを発行
    • ディレクトリの権限変更
  • **nginxのインストール**
    • nginxの起動と再起動
    • ドキュメントルートなどのnginx設定

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

パッケージのアップデート

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

ターミナル
$ sudo yum update -y

PHP7.4のインストール

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

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

ターミナル
// 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のインストールをしましょう。

ターミナル
// 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のインストール時やプロジェクト作成時にこれらの拡張機能がないとうまくいきません。

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

composerのインストール

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

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

ターミナル
// 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からソースコードをクローン

ターミナル
// 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を使って個別にダウンロードする必要があります。

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

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

Laravelの初期設定

ターミナル
// 環境設定ファイルの準備
$ cp .env.example .env

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

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

nginxのインストール

nginxはapacheと似た機能を提供するWebサーバーです。

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

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

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

ターミナル
// 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

ドキュメントルートなどのnginx設定
ターミナル
$ sudo vi /etc/nginx/nginx.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を再起動します。

ターミナル
$ sudo service nginx restart

10. AMIの作成

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

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

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

スクリーンショット 2021-06-07 9.29.37.png

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

スクリーンショット 2021-06-07 9.33.04.png

スクリーンショット 2021-06-07 9.33.27.png

スクリーンショット 2021-06-07 9.34.02.png

12. EC2のIPアドレスを固定するためにElastic IPを導入する

新しく作成したEC2インスタンスの002-LINE-WeatherElastic IPを導入しましょう。
上記でやったことを繰り返すだけなので省略します。

13. PrivateサブネットにRDSを構築

AWSのサービスであるRDSを利用してMySQLを立ち上げLaravelと連携できるようにします。

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

サブネットグループの作成

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

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

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

スクリーンショット 2021-06-07 9.38.35.png

DBの作成

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

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

スクリーンショット 2021-06-07 9.40.07.png

スクリーンショット 2021-06-07 9.40.45.png

スクリーンショット 2021-06-07 9.42.12.png

スクリーンショット 2021-06-07 9.42.47.png

セキュリティグループを修正

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

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

スクリーンショット 2021-06-07 9.44.26.png

LaravelのDB接続設定

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

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

ターミナル
// SSH接続
$ ssh -i Keypair.pem ec2-user@(パブリックIP)

// .envファイルを編集
$ vi /var/www/LINE-Weather/src/.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=???
ターミナル
// 移動
$ 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に関して詳しく知りたい方はどうぞ。

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

スクリーンショット 2021-06-07 9.58.40.png

スクリーンショット 2021-06-07 9.59.32.png

スクリーンショット 2021-06-07 10.00.01.png

スクリーンショット 2021-06-07 10.00.17.png

15. EC2のセキュリティグループのアクセス許可をロードバランサーからに変更する

■ルート
コンソールで「EC2」と検索→左ペイン内の「セキュリティグループ」を選択→「EC2-LINE-Weather-SG」を選択

スクリーンショット 2021-06-07 10.01.46.png

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

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

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

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

スクリーンショット 2021-06-07 10.04.54.png

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

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

スクリーンショット 2021-06-07 10.08.34.png

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

スクリーンショット 2021-06-07 10.09.31.png

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

スクリーンショット 2021-06-07 10.10.26.png

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

18. ドメインとロードバランサーを紐付ける

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

スクリーンショット 2021-06-07 10.11.57.png

スクリーンショット 2021-06-07 10.12.27.png

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

スクリーンショット 2021-06-07 10.13.19.png

成功ですね!

19. ロードバランサーでリスナーを追加する

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

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

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

スクリーンショット 2021-06-07 10.14.39.png

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

スクリーンショット 2021-06-07 10.15.46.png

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

スクリーンショット 2021-06-07 10.16.54.png

スクリーンショット 2021-06-07 10.17.06.png

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

スクリーンショット 2021-06-07 10.17.33.png

スクリーンショット 2021-06-07 10.18.33.png

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

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

スクリーンショット 2021-06-07 10.19.10.png

20. セキュリティグループの修正でHTTPSへのリダイレクト設定

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

スクリーンショット 2021-06-07 10.21.05.png

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

スクリーンショット 2021-06-07 13.50.56.png

終わりに

HTTPSでアクセスできました。

スクリーンショット 2021-06-07 13.51.45.png

だが...動かぬ

image.png

iOS の画像.png

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

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

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

8
7
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
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?