[勉強会資料] LaravelサンプルアプリをEC2にデプロイする
1. 目標
AWSにWebアプリをデプロイする手順、構成を学ぶ。
WebアプリにはLaravelのサンプルアプリケーションを利用する。
このサンプルアプリは、アカウント登録機能、ログイン機能、タスクの登録削除機能をもったシンプルなタスク管理アプリです。
最終的に、下図のような環境を構築する。東京リージョンを使用する。
2. ネットワーク構築
VPCやサブネット、ルーティングの設定を行う。
2.1 VPCを作成する
VPC(Virtual Private Cloud)とは:AWSクラウド内にある仮想ネットワーク。他のVPCとは論理的に隔離されている。
-
マネジメントコンソールのサービスメニューからVPCを選択し、サイドメニューからVPCを選択
-
右上の「VPCを作成」をクリックし、下記の通り設定し、VPCを作成
Item Value 名前タグ YourName App VPC IPv4 CIDR ブロック 10.0.0.0/16
-
作成したVPCにチェックがついている状態で、右上の「アクション▼」からDNSホスト名を編集をクリックし、DNSホスト名を有効化する
2.2 サブネットを作成する
サブネットとは:VPC内をIPアドレスの範囲で論理的に小さく分割したネットワークのこと。CIDRにより指定する。
参考: CIDRとは
パブリックサブネットを作成
-
VPCのサイドメニューから、サブネットを選択
-
右上の「サブネットを作成」をクリックし、下記の通り設定し、サブネットを作成
Item Value VPC ID YourName App VPC(先ほど作成したもの) サブネット名 YourName Public Subnet アベイラビリティゾーン ap-northeast-1a IPv4 CIDR ブロック 10.0.0.0/24
-
作成したサブネットにチェックがついている状態で、右上の「アクション▼」から自動割り当てIP設定の変更をクリックし、パブリックIPv4アドレスの自動割り当てを有効にするチェックをONにして保存する
プライベートサブネットを作成
-
先ほどと同様に、下記の設定でサブネットを作成
Item Value VPC ID YourName App VPC(先ほど作成したもの) サブネット名 YourName Private Web Subnet アベイラビリティゾーン ap-northeast-1a IPv4 CIDR ブロック 10.0.2.0/23
-
もう一つ、下記の設定でサブネットを作成
Item Value VPC ID YourName App VPC(先ほど作成したもの) サブネット名 YourName Private DB Subnet アベイラビリティゾーン ap-northeast-1a IPv4 CIDR ブロック 10.0.4.0/23
以上でVPC内に3つのサブネットを作成したが、まだ通信することはできない。
2.3 インターネットゲートウェイを作成する
インターネットゲートウェイ(IGW)とは:VPC内のインスタンスとインターネット間の通信を可能にする。インターネットに接続するためのルーティングのターゲットとして機能し、パブリックIPv4アドレスを割り当てたインスタンスのNAT変換を行う。
-
VPCのサイドメニューから、インターネットゲートウェイを選択
-
右上の「インターネットゲートウェイの作成」をクリックし、下記の通り設定し、IGWを作成
Item Value 名前タグ YourName IGW -
作成したIGWにチェックがついている状態で、右上の「アクション▼」からVPCにアタッチをクリックし、先ほど作成したVPCを選択してアタッチする
2.4 ルートテーブルを設定する
ルートテーブルとは:VPC内のネットワークトラフィックのルーティングを制御する仕組み。各サブネットはルートテーブルに関連付けられている。
サブネットがIGWへのルートを持つルートテーブルに関連付けられている場合、パブリックサブネットとなる。
プライベートルートテーブルを作成
-
VPCのサイドメニューから、ルートテーブルを選択
-
表をスクロールし、VPC列に先ほど作成したVPC名が書かれているルートテーブルを選択
-
選択したルートテーブルのName列の鉛筆アイコンをクリックし、「YourName Private RouteTable」に変更
ここで、作成したルートテーブルのルートを確認する。プライベートサブネットを選択して、下部の「ルート」タブを確認すると、10.0.0.0/16
のみとなっている。これは、VPC内全体を指しており、VPC内のサブネットはお互いに通信することができる。
パブリックルートテーブルを作成
-
右上の「ルートテーブルを作成」をクリックし、下記の通り設定し、ルートテーブルを作成
Item Value 名前 YourName Public RouteTable VPC YourName App VPC(先ほど作成したもの) -
パブリックルートテーブルにチェックがついている状態で、下部の「ルート」タブを選択
-
右側の「ルートを編集」を選択し、ルートの追加をクリックし、下記の通り設定し保存
Item Value 送信先 0.0.0.0/0
ターゲット インターネットゲートウェイ、「YourName IGW」の順に選択 -
パブリックルートテーブルにチェックがついている状態で、下部の「サブネットの関連付け」タブを選択
-
右側の「サブネットの関連付けを編集」を選択し、パブリックサブネットのチェックをONにし、関連付けを保存する
以上で、パブリックサブネットはインターネットにトラフィックを送信するルートを確保し、パブリックとなった
2.5 セキュリティグループを作成する
セキュリティグループとは:インスタンスのトラフィックを制御する仮想のファイアウォールとして機能する。セキュリティグループに設定されたルールに基づき、許可されたトラフィックのみがインスタンスに出入りすることが可能になる。
-
VPCのサイドメニューから、セキュリティグループを選択
-
「セキュリティグループを作成」をクリックし、下記の通り設定し作成
Item Value セキュリティグループ名 YourName App SG 説明 Allow web access VPC YourName App VPC インバウンドルール タイプ: HTTP, ソース: Anywhere-IPv4 アウトバウンドルール 変更なし
[補足]ルートテーブルとセキュリティグループの使い分け
ルートテーブルとセキュリティグループは共にトラフィックの制御に使用される。これらの違いは、ルートテーブルはサブネットに対して関連付けされるのに対し、セキュリティグループはインスタンスに対して関連付けされる。
2.6 異なるアベイラビリティゾーンにサブネットを作成する
高可用性を確保するため、複数のアベイラビリティゾーン(AZ)を活用する。設定を記載するので、作成手順は2.2を参照。また、各サブネットのルートテーブルも同様に設定する。
-
パブリックサブネット
Item Value VPC ID YourName App VPC サブネット名 YourName Public Subnet 2 アベイラビリティゾーン ap-northeast-1c IPv4 CIDR ブロック 10.0.1.0/24
パブリックIPv4アドレスの自動割り当てを有効化する設定も行う。
-
プライベートサブネット
Item Value VPC ID YourName App VPC サブネット名 YourName Private Web Subnet 2 アベイラビリティゾーン ap-northeast-1c IPv4 CIDR ブロック 10.0.6.0/23
Item Value VPC ID YourName App VPC サブネット名 YourName Private DB Subnet 2 アベイラビリティゾーン ap-northeast-1c IPv4 CIDR ブロック 10.0.8.0/23
以上で、VPCによるクラウド上のプライベートネットワークが構築された。
3. アプリ・DBサーバの構築
アプリケーションサーバ、データベースサーバを立ち上げ、ひとまずアプリケーションが動作するようにする。
3.1 パブリックサブネットでWebサーバを起動する
-
サービスでEC2を選択
-
ページ下部の「インスタンスを起動」を選択し、インスタンスを起動をクリック
-
以下のように設定していく
-
Amazonマシンイメージ(AMI)
- Amazon Linux 2 AMI
-
インスタンスタイプの選択
- t2.micro
(注:ここで「確認と作成」ではなく、「次のステップ」をクリックすること)
-
インスタンスの詳細の設定
-
ネットワーク: YourName App VPC
-
サブネット: YourName Public Subnet
-
下にスクロールし、「▼ 高度な詳細」のユーザデータに下記を入力
#!/bin/bash # Update yum yum update -y # Install Apache Web Server and git yum install -y httpd git # Install PHP amazon-linux-extras install -y php7.2 yum install -y php-devel php-pdo php-mbstring php-mcrypt php-mysqlnd php-xml php-gd php-opcache php-pecl-zip # Install Laravel app chmod 777 /var/www/html git clone https://github.com/laravel/quickstart-intermediate.git /var/www/html/laravel-sample chmod -R 777 /var/www/html/laravel-sample/bootstrap/cache chmod -R 777 /var/www/html/laravel-sample/storage # Install Composer export HOME="/root" curl -sS https://getcomposer.org/installer | php mv /composer.phar /usr/local/bin/composer (cd /var/www/html/laravel-sample && composer install) # Setting Apache sed -i -e '119s/html/html\/laravel-sample\/public/g' /etc/httpd/conf/httpd.conf sed -i -e '151s/None/All/g' /etc/httpd/conf/httpd.conf # Turn on web server chkconfig httpd on service httpd start
(注:「ネットワーク設定が変更されました」のダイアログが出た場合は「はい」を選択)
-
-
ストレージの追加
- (変更なし)
-
タグの追加
-
タグの追加をクリックし、以下を追加
キー 値 Name YourName App Server
-
-
セキュリティグループの設定
- 「既存のセキュリティグループを選択する」をクリックし、「YourName SG」を選択
-
-
確認と作成をクリックし、設定を確認後下部の「起動」をクリック。
-
ダイアログで「キーペアなしで続行」を選択し、チェックボックスをオンにする
-
インスタンスの作成をクリック
-
インスタンスの表示をクリックし、作成したインスタンスを選択
-
作成したインスタンスのパブリックIPv4アドレスをコピーする
-
作成したインスタンスが実行中になったら、コピーしたアドレスにアクセスする
-
LaravelサンプルアプリのWelcomeページが表示されれば構築完了
現時点では、Registerからユーザ登録を実施しようとすると、例外が発生して実行できない。これは、まだDBを作成していないためである。
3.2 プライベートサブネットにDBサーバを構築する
RDS用セキュリティグループの作成
-
サービスでVPCを選択
-
VPCのサイドメニューから、セキュリティグループを選択
-
「セキュリティグループを作成」をクリックし、下記の通り設定し作成
Item Value セキュリティグループ名 YourName SG RDS 説明 Trafic from app servers VPC YourName App VPC インバウンドルール タイプ: MYSQL/Aurora, ソース: YourName App SG アウトバウンドルール 変更なし
RDS用サブネットグループの作成
-
サービスでRDSを選択
-
RDSのサイドメニューから、サブネットグループを選択
-
右上の「DBサブネットグループを作成」をクリックし、下記の通り設定し作成
Item Value 名前 YourName DB Subnet Group 説明 Subnet group for private DB VPC Yourame App VPC アベイラビリティゾーン ap-northeast-1a, ap-northeast-1c サブネット 10.0.4.0/23
,10.0.8.0/23
ポイントは、複数のAZに配置したDB用のサブネットのみを選択するところ。
RDSの構築
-
RDSのサイドメニューから、データベースを選択
-
右上の「データベースの作成」をクリック
-
下記を順に設定する
-
データベース作成方法を選択
- 標準作成
-
エンジンのオプション
- MySQL(バージョンは8.0.23)
-
テンプレート
- 開発/テスト
-
設定
Item Value DB インスタンス識別子 YourName-laravel-sample-db マスターユーザー名 Subnet group for private DB マスターパスワード 任意の値 あるいはパスワードの自動生成のチェックをオンにする
-
DB インスタンスクラス
-
バースト可能クラス
-
ドロップダウンリストから db.t3.micro を選択
-
-
ストレージ
変更なし
-
可用性と耐久性
- スタンバイインスタンスを作成しないでください
-
接続
Item Value Virtual Private Cloud (VPC) YourName App VPC サブネットグループ YourName DB Subnet Group パブリックアクセス なし VPCセキュリティグループ 既存の選択 既存のVPCセキュリティグループ YourName SG RDSのみ(defaultは外す) アベイラビリティゾーン ap-northeast-1a 追加設定は変更なし
-
データベース認証
変更なし
-
追加設定
-
最初のデータベース名: mydb
-
自動バックアップを有効にします: チェックオフ
その他の設定は変更なし
-
以上を入力し、作成をクリック
-
-
パスワードの自動生成を使用した場合は、「データベース YourName-laravel-sample-db を作成しています」のダイアログから詳細を表示し、パスワードをコピーしておくこと
-
「接続とセキュリティ」タブのエンドポイントをコピーしておく
以上でRDSを使用したDBサーバの構築が完了した。
LaravelにDBを接続
WebサーバにデプロイしたアプリケーションにDBの接続情報を入力して、アプリケーションが接続できるようにする。
-
サービスでEC2を選択
-
EC2のサイドメニューから、インスタンスを選択
-
インスタンス名「YourName App Server」を選択し、上部の「接続」ボタンをクリック
-
EC2 Instance Connectで「接続」をクリックし、コンソールで以下の操作を実施
cd /var/www/html/laravel-sample sudo nano .env
.envファイルの下記を変更する。nanoコマンドだとコピペができる。
Item Value DB_HOST 先ほど作成したDBのエンドポイント DB_DATABASE mydb(最初のデータベース名で設定した名称) DB_USERNAME root(DBのマスターユーザー名) DB_PASSWORD 先ほど作成したDBのマスターパスワード LaravelのMigrationを実行する
sudo php artisan migrate
Migrationが成功したら、アプリケーションにアクセスし、ユーザ登録を実施してみましょう。問題なく動作するはずです。
4. サーバを冗長化する
4.1 Application Load Balancerの作成
-
サービスでEC2を選択
-
EC2のサイドメニューから、ロードバランサーを選択
-
ロードバランサーの作成をクリックし、Application Load Balancerの作成を選択
-
手順 1: ロードバランサーの設定にて、下記の通り設定
Item Value 名前 YourName ALB VPC YourName App VPC アベイラビリティゾーン 2つともオンにし、作成したパブリックサブネットを選択 -
手順 2: セキュリティ設定の構成はここではスキップ
-
手順 3: セキュリティグループの設定にて、下記の設定で新しいセキュリティグループを作成
Item Value セキュリティグループ名 YourName ALB SG 説明 Enable web access to load balancer ルール1 タイプ: HTTP, ソース: 任意の場所 ルール2 タイプ: HTTPS, ソース: 任意の場所 -
手順 4: ルーティングの設定にて、以下を実施
-
ターゲットグループの名前を「YourName App」と設定
-
ヘルスチェックの詳細設定を開き、次の通り変更
Item Value 正常のしきい値 2 間隔 10秒 ヘルスチェックを10秒間隔で実施し、インスタンスから2回連続で正しい応答が返されれば、インスタンスは正常と判断される。
-
-
手順 5: ターゲットの登録では、今は登録できないため、そのまま次へ
-
設定を確認し、作成をクリック
4.2 Auto Scalingを設定
セキュリティグループを更新
アプリケーションサーバに使用しているセキュリティグループのインバウンドルールを変更し、ALBからアクセスできるようにする。また、パブリックアクセスができないようにする。
-
EC2のサイドメニューから、セキュリティグループを選択
-
アプリケーションサーバに使用しているセキュリティグループを選択
-
インバウンドルールタブを開き、「Edit inbound rules」を選択
-
インバウンドルールを編集にて、下記の通り設定し、ルールを保存
-
既存のルールをすべて削除
-
「タイプ: HTTP, ソース: YourName ALB SG」のルールを追加
-
AMIを作成
-
EC2のサイドメニューから、インスタンスを選択
-
アプリケーションサーバのインスタンスを選択し、「アクション▼」からイメージとテンプレート → イメージを作成を選択
-
イメージを作成にて、イメージ名を「YourName App AMI」としてイメージを作成をクリック
起動テンプレートを作成
-
EC2のサイドメニューから、起動テンプレートを選択
-
起動テンプレートの作成をクリックし、下記の通り設定
Item Value 起動テンプレート名 YourName App LT AMI YourName App AMI インスタンスタイプ t2.micro セキュリティグループ YourName App SG (ALBからのインバウンドトラフィックを有効化したもの) IAMインスタンスプロフィール Systems Manager用のRole -
作成をクリック
Auto Scalingグループを作成
-
EC2のサイドメニューから、Auto Scalingグループを選択
-
Auto Scalingグループの作成をクリックし、下記の通り設定
Item Value Auto Scalingグループ名 YourName App ASG 起動テンプレート YourName App Template -
次へをクリックし、「設定の構成」のページで下記の通り設定
Item Value VPC YourName App VPC サブネット YourName Private Web Subnet 1, 2 (プライベートサブネット2つ) -
次へをクリックし、「詳細オプションを設定」のページで下記の通り設定
Item Value ロードバランシング 既存のロードバランサーにアタッチ 既存のロードバランサーターゲットグループ YourName-App/HTTP ヘルスチェックの猶予期間 200 CloudWatch内でグループメトリクスの収集を有効にする オン 先ほど作成したターゲットグループにAuto Scalingで作成したEC2インスタンスを登録するように指定することで、ロードバランサーよりこのターゲットグループ内のインスタンスにトラフィックが送信される。
-
次へをクリックし、「グループサイズとスケーリングポリシーを設定する」のページで下記の通り設定
Item Value 希望する容量 2 最小キャパシティ 2 最大キャパシティ 2 2つのインスタンスが常に維持されるように設定。
-
次の「通知の追加」は実施せず、その次の「タグを追加」で以下のように設定
Item Value キー Name 値 YourName-sample-app -
次のページで設定を確認し、「Auto Scalingグループを作成」をクリック
5. ElastiCacheのRedisを作成する
セッションを共有しなければ、複数のインスタンスでログイン情報が共有されず、アプリケーションが動作しない。
5.1 Session Managerをプライベートサブネットで利用可能にする
AWSの資料を参考に実施する。
VPCエンドポイント用のセキュリティグループを作成
-
サービスでVPCを選択
-
VPCのサイドメニューから、セキュリティグループを選択
-
「セキュリティグループを作成」をクリックし、下記の通り設定し作成
Item Value セキュリティグループ名 YourName VPC EP SG 説明 Allow access to VPC Endpoint VPC YourName App VPC インバウンドルール タイプ: HTTPS, ソース: YourName App SG アウトバウンドルール 変更なし
VPCエンドポイントを作成
-
VPCのサイドメニューから、エンドポイントを選択
-
サービス名で、
com.amazonaws.ap-northeast-1.ssm
を検索。大阪リージョンの場合は、com.amazonaws.ap-northeast-3.ssm
。 -
以下のように設定
Item Value VPC YourName App VPC サブネット YourName Private Web Subnet 1, 2 (アプリケーションサーバがあるプライベートサブネット) セキュリティグループ YourName VPC EP SG -
サービス名
com.amazonaws.[region].ssmmessages
、com.amazonaws.[region].ec2messages
で4.を同様に実施 -
サービスでSystems Managerを選択
-
Systems Managerのサイドメニューから、フリートマネージャーを選択し、アプリケーションサーバのインスタンスが表示されることを確認
5.2 ElastiCacheの設定
アプリケーションサーバ間でセッションを保存し共有するためのDBを、ElastiCacheのRedisで作成する。
Redis用セキュリティグループの作成
-
サービスでVPCを選択
-
VPCのサイドメニューから、セキュリティグループを選択
-
「セキュリティグループを作成」をクリックし、下記の通り設定し作成
Item Value セキュリティグループ名 YourName Redis SG 説明 Trafic from app servers VPC YourName App VPC インバウンドルール タイプ: カスタムTCP, ポート:6379, ソース: YourName App SG アウトバウンドルール 変更なし
Redis用サブネットグループの作成
RDS用のサブネットグループを作成した際と同様、Redisにもサブネットグループが必要となる。
-
サービスでElastiCacheを選択
-
ElastiCacheのサイドメニューから、サブネットグループを選択
-
「サブネットグループの作成」をクリックし、下記の通り設定し作成
Item Value 名前 YourName Redis Subnet Group 説明 Subnet group for Redis VPC Yourame App VPC アベイラビリティゾーン ap-northeast-1a, ap-northeast-1c サブネット 10.0.4.0/23
,10.0.8.0/23
ポイントは、複数のAZに配置したDB用のサブネットのみを選択するところ。
Redisの作成
-
ElastiCacheのサイドメニューから、Redisを選択
-
上部の「作成」をクリックし、下記の通り設定し作成
Item Value クラスターエンジン Redis 名前 YourName Redis 説明 Subnet group for Redis ポート 6379 レプリケーション数 1 マルチAZ オン サブネットグループ YourName Redis Subnet Group セキュリティグループ YourName Redis SG 自動バックアップの有効化 オフ
LaravelでRedisを利用する
Redisの接続情報を入力して、アプリケーションが接続できるようにする。
ベースとなるアプリケーションサーバを書き換え、AMIを更新する必要がある。
-
サービスでEC2を選択
-
EC2のサイドメニューから、インスタンスを選択
-
インスタンス名「YourName App Server」を選択し、上部の「接続」ボタンをクリック
-
EC2 Systems Managerで「接続」をクリックし、コンソールで以下の操作を実施
-
predisのインストール
LaravelでRedisを利用するためのライブラリをインストール。
cd /var/www/html/laravel-sample sudo su # 書き込み権限を変更 chmod 777 composer.json composer.lock # predisのインストール /usr/local/bin/composer require predis/predis # 書き込み権限を戻す chmod 644 composer.json composer.lock
-
環境変数の設定
nano .env
.envファイルの下記を変更する。
Item Value CACHE_DRIVER redis SESSION_DRIVER redis REDIS_HOST {作成したRedisのエンドポイント} エンドポイントの末尾のポート番号は入力しないよう注意。
-
Redisの設定を含むAMIを作成
-
EC2のサイドメニューから、インスタンスを選択
-
アプリケーションサーバのインスタンスを選択し、「アクション▼」からイメージとテンプレート → イメージを作成を選択
-
イメージを作成にて、イメージ名を「YourName App AMI Redis Ready」としてイメージを作成をクリック
起動テンプレートの変更
-
EC2のサイドメニューから、テンプレートの起動を選択
-
アプリケーションサーバの起動テンプレートを選択し、「アクション▼」から「テンプレートの変更」を選択
-
AMIを新たに作成したイメージに変更し、下部の「テンプレートのバージョンを作成」をクリック
-
起動テンプレートの詳細に戻り、起動テンプレートの「アクション▼」から「デフォルトバージョンを設定」を選択
-
最新バージョンを選択し、「デフォルトバージョンとして設定」をクリック
インスタンスの再生成
Auto Scalingが有効の場合、起動中のインスタンスを全て終了することで、新しい設定のインスタンスが立ち上がる。
立ち上がったら、アプリケーションを開き、ログインすると正常に動作することが確認できる。
Discussion