以前作成したアプリのデプロイに関する記事です。
無料で使いたいのでherokuへデプロイしましたが、Flex Messageが届きませんでした。
ということでお金がかかりますが、AWSにデプロイすることにします。
アプリ作成までの記事はこちらです。
それではAWSへのデプロイをやっていきましょう!
今回のアプリはDBを使っていませんが、もしかしたら使うこともあると思うので一応RDSも使います。
ハンズオン
1. AWSへログイン
2. 東京リージョンになっていることを確認
3. VPCを作成(IP:10.0.0.0/21)
■ルート
コンソールで「VPC」と検索→左ペイン内の「VPC」を選択→「VPCを作成」を選択
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で使うサブネットを作成します。
Private Subnetを作成(IP:10.0.2.0/24, 10.0.3.0/24)
RDS(MySQL)で使うサブネットを作成します。
5. Publicサブネットをインターネットに接続するためにInternet Gatewayを作成しアタッチする
■ルート
コンソールで「VPC」と検索→左ペイン内の「インターネットゲートウェイ」を選択→「インターネットゲートウェイの作成」を選択
6. EC2がインターネット接続するためにルートテーブルを作成
■ルート
コンソールで「VPC」と検索→左ペイン内の「サブネット」を選択→「Laravel-Pub-1」を選択→「ルートテーブル」を選択→「ルート」へ移動→「ルートを編集」を選択
7. Publicサブネット内にEC2を構築
■ルート
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「インスタンスを起動」を選択
■ステップの流れ
①Amazon Linux 2 AMI (HVM), SSD Volume Typeを選択
②t2.microを選択
③インスタンスの詳細の設定の、ネットワーク
, サブネット
, 自動割り当てパブリックIP
を変更
④ストレージはそのままでOK
⑤キーをName
で追加(値は任意でOK)
⑥セキュリティーグループを変更
EC2は、HTTP通信でリクエスト、レスポンスを行うためHTTP
を許可します。
⑦キーペアの作成
私は事前に作成しているキーペアがあるのでそちらを使います。
このキーペアはdesktop
にでも保存しておきましょう。
以前書いたEC2の記事です。
基本的な内容になっているのでEC2ってなんやねんって方は見てもらえると!
8. EC2のIPアドレスを固定するためにElastic IP
を導入する
IPアドレスを固定する理由としては、インスタンスを再起動しても同じIPアドレスに固定しておきたいためです。
通常、インスタンスを再起動するとIPアドレスが変わってしまいます。
それでは再起動する度にSSH接続の設定を変えないといけないため、IPアドレスを固定します。
ちなみに、Elastic IPは関連づけを行わなければ費用が発生します。
その点はご注意ください。
■ルート
コンソールで「EC2」と検索→左ペイン内の「Elastic IP」を選択→「Elastic IPアドレスの割り当て」を選択
作成できたら次は関連づけを行います。
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.4
やnginx
のインストールには、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の初期画面が表示されていれば、正常に動作しています。
ドキュメントルートなどのnginx設定
$ sudo vi /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」と検索→左ペイン内の「インスタンス」を選択→「アクション」から「イメージを作成」を選択
11. 作成したAMIを使ってインスタンスを作成
12. EC2のIPアドレスを固定するためにElastic IP
を導入する
新しく作成したEC2インスタンスの002-LINE-WeatherにElastic IP
を導入しましょう。
上記でやったことを繰り返すだけなので省略します。
13. PrivateサブネットにRDSを構築
AWSのサービスであるRDSを利用してMySQLを立ち上げLaravelと連携できるようにします。
以前書いたRDSの記事です。
サブネットグループの作成
RDSには、エンドポイント通信という機能があります。
もし通信障害などが発生して、親のRDSが使えなくなった時子のRDSに接続してくれる機能です。
つまり、このことから異なるAZにサブネットがないとRDSは使えません。
ということで複数のサブネットにまたがる形でRDSは構築されるので、
サブネットグループというものが必要になります。
■ルート
コンソールで「RDS」と検索→左ペイン内の「サブネットグループ」を選択→「DB サブネットグループを作成」を選択
DBの作成
■ルート
コンソールで「RDS」と検索→左ペイン内の「データベース」を選択→「データベースの作成」を選択
追記する部分のみスクショしました。
セキュリティグループを修正
■ルート
コンソールで「VPC」と検索→左ペイン内の「セキュリティグループ」を選択→「RDS-SG-1」を選択
DBは重要な情報が入っているため誰でも彼でもアクセスできると困ります。
なので、PublicサブネットのEC2(セキュリティグループ→EC2-LINE-Weather-SG)からしか触れないように修正します。
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
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」と検索→左ペイン内の「ロードバランサー」を選択→「ロードバランサーの作成」を選択
15. EC2のセキュリティグループのアクセス許可をロードバランサーからに変更する
■ルート
コンソールで「EC2」と検索→左ペイン内の「セキュリティグループ」を選択→「EC2-LINE-Weather-SG」を選択
16. Freenomでドメインを購入する
Freenomは1年間ドメインを無料で使えます。
なのでこちらでドメインを購入しましょう!
どうやればいいかわからない方は以下の記事がわかりやすいので以下の記事を参考にしてみてください。
今回私は、line-weather-fashion.tk
というドメインを取得しました。
17. Route53と独自ドメインの紐付け
■ルート
コンソールで「Route53」と検索→左ペイン内の「ホストゾーン」を選択→「ホストゾーンの作成」を選択
作成が正常に完了すると、NSレコードと呼ばれる値が割り振られます。
この値をFreenomの方に書き写していきます。
以前書いたS3とRoute 53の記事です。
S3とRoute 53に関して詳しく知りたい方はどうぞ。
18. ドメインとロードバランサーを紐付ける
■ルート
コンソールで「Route53」と検索→左ペイン内の「ホストゾーン」を選択→「line-weather-fashion.tk」を選択→「レコードを作成」を選択
これでロードバランサーとline-weather-fashion.tk
は結びつきました。
成功ですね!
19. ロードバランサーでリスナーを追加する
AWS Certificate Manager(ACM) で証明書を取得します。
現状http通信でしかアプリケーションを利用できない状態です。
近年は常時SSL化(常に暗号化したデータをユーザーとサーバーでやりとり)が推奨されていて、
Google Chromeではhttp通信のままだと保護されていない通信と出てしまいます。
■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「LINE-Weathe-LB」を選択→「リスナーの追加」を選択
「新しいACM証明書をリクエスト」で発行を行います。
Route 53でレコードの作成を行います。
ありましたね!
証明書の検証に時間がかかるので成功になるまで待ちましょう。
成功に変わったら、次はリスナーの追加に戻ってSSL証明書を取得しましょう。
20. セキュリティグループの修正でHTTPSへのリダイレクト設定
■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「LB-LINE-Weather-SG」を選択→「セキュリティグループ」を選択
最後にロードバランサーのリスナーをHTTPS
のみにしましょう。
終わりに
HTTPSでアクセスできました。
だが...動かぬ
Flex MessageってどれくらいCPUとメモリ食うんでしょうね。。
t2.micro
からバランスの取れたCPUとバランスの取れたメモリ数のM系に変えて検証してみます。
このアプリに、M系はお財布痛すぎるので、最終的にはFlex Message
をやめて無料で運用できるHerokuにしようと思います。
こんな未完成なハンズオン記事はねーだろと思いますが、**「一応デプロイはできたぞ」**という記事でした。