✏️

[勉強会資料] LaravelサンプルアプリをEC2にデプロイする

2022/02/07に公開

参考: AWSでウェブアプリケーション環境構築

1. 目標

AWSにWebアプリをデプロイする手順、構成を学ぶ。
WebアプリにはLaravelのサンプルアプリケーションを利用する。

このサンプルアプリは、アカウント登録機能、ログイン機能、タスクの登録削除機能をもったシンプルなタスク管理アプリです。

最終的に、下図のような環境を構築する。東京リージョンを使用する。

構成図

2. ネットワーク構築

VPCやサブネット、ルーティングの設定を行う。

2.1 VPCを作成する

VPC(Virtual Private Cloud)とは:AWSクラウド内にある仮想ネットワーク。他のVPCとは論理的に隔離されている。

  1. マネジメントコンソールのサービスメニューからVPCを選択し、サイドメニューからVPCを選択

  2. 右上の「VPCを作成」をクリックし、下記の通り設定し、VPCを作成

    Item Value
    名前タグ YourName App VPC
    IPv4 CIDR ブロック 10.0.0.0/16
  3. 作成したVPCにチェックがついている状態で、右上の「アクション▼」からDNSホスト名を編集をクリックし、DNSホスト名を有効化する

2.2 サブネットを作成する

サブネットとは:VPC内をIPアドレスの範囲で論理的に小さく分割したネットワークのこと。CIDRにより指定する。

参考: CIDRとは

パブリックサブネットを作成

  1. VPCのサイドメニューから、サブネットを選択

  2. 右上の「サブネットを作成」をクリックし、下記の通り設定し、サブネットを作成

    Item Value
    VPC ID YourName App VPC(先ほど作成したもの)
    サブネット名 YourName Public Subnet
    アベイラビリティゾーン ap-northeast-1a
    IPv4 CIDR ブロック 10.0.0.0/24
  3. 作成したサブネットにチェックがついている状態で、右上の「アクション▼」から自動割り当てIP設定の変更をクリックし、パブリックIPv4アドレスの自動割り当てを有効にするチェックをONにして保存する

プライベートサブネットを作成

  1. 先ほどと同様に、下記の設定でサブネットを作成

    Item Value
    VPC ID YourName App VPC(先ほど作成したもの)
    サブネット名 YourName Private Web Subnet
    アベイラビリティゾーン ap-northeast-1a
    IPv4 CIDR ブロック 10.0.2.0/23
  2. もう一つ、下記の設定でサブネットを作成

    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変換を行う。

  1. VPCのサイドメニューから、インターネットゲートウェイを選択

  2. 右上の「インターネットゲートウェイの作成」をクリックし、下記の通り設定し、IGWを作成

    Item Value
    名前タグ YourName IGW
  3. 作成したIGWにチェックがついている状態で、右上の「アクション▼」からVPCにアタッチをクリックし、先ほど作成したVPCを選択してアタッチする

2.4 ルートテーブルを設定する

ルートテーブルとは:VPC内のネットワークトラフィックのルーティングを制御する仕組み。各サブネットはルートテーブルに関連付けられている。

サブネットがIGWへのルートを持つルートテーブルに関連付けられている場合、パブリックサブネットとなる。

プライベートルートテーブルを作成

  1. VPCのサイドメニューから、ルートテーブルを選択

  2. 表をスクロールし、VPC列に先ほど作成したVPC名が書かれているルートテーブルを選択

  3. 選択したルートテーブルのName列の鉛筆アイコンをクリックし、「YourName Private RouteTable」に変更

ここで、作成したルートテーブルのルートを確認する。プライベートサブネットを選択して、下部の「ルート」タブを確認すると、10.0.0.0/16のみとなっている。これは、VPC内全体を指しており、VPC内のサブネットはお互いに通信することができる。

パブリックルートテーブルを作成

  1. 右上の「ルートテーブルを作成」をクリックし、下記の通り設定し、ルートテーブルを作成

    Item Value
    名前 YourName Public RouteTable
    VPC YourName App VPC(先ほど作成したもの)
  2. パブリックルートテーブルにチェックがついている状態で、下部の「ルート」タブを選択

  3. 右側の「ルートを編集」を選択し、ルートの追加をクリックし、下記の通り設定し保存

    Item Value
    送信先 0.0.0.0/0
    ターゲット インターネットゲートウェイ、「YourName IGW」の順に選択
  4. パブリックルートテーブルにチェックがついている状態で、下部の「サブネットの関連付け」タブを選択

  5. 右側の「サブネットの関連付けを編集」を選択し、パブリックサブネットのチェックをONにし、関連付けを保存する

以上で、パブリックサブネットはインターネットにトラフィックを送信するルートを確保し、パブリックとなった

2.5 セキュリティグループを作成する

セキュリティグループとは:インスタンスのトラフィックを制御する仮想のファイアウォールとして機能する。セキュリティグループに設定されたルールに基づき、許可されたトラフィックのみがインスタンスに出入りすることが可能になる。

  1. VPCのサイドメニューから、セキュリティグループを選択

  2. 「セキュリティグループを作成」をクリックし、下記の通り設定し作成

    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サーバを起動する

  1. サービスでEC2を選択

  2. ページ下部の「インスタンスを起動」を選択し、インスタンスを起動をクリック

  3. 以下のように設定していく

    1. Amazonマシンイメージ(AMI)

      • Amazon Linux 2 AMI
    2. インスタンスタイプの選択

      • t2.micro

      (注:ここで「確認と作成」ではなく、「次のステップ」をクリックすること)

    3. インスタンスの詳細の設定

      • ネットワーク: 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
        

      (注:「ネットワーク設定が変更されました」のダイアログが出た場合は「はい」を選択)

    4. ストレージの追加

      • (変更なし)
    5. タグの追加

      • タグの追加をクリックし、以下を追加

        キー
        Name YourName App Server
    6. セキュリティグループの設定

      • 「既存のセキュリティグループを選択する」をクリックし、「YourName SG」を選択
  4. 確認と作成をクリックし、設定を確認後下部の「起動」をクリック。

  5. ダイアログで「キーペアなしで続行」を選択し、チェックボックスをオンにする

  6. インスタンスの作成をクリック

  7. インスタンスの表示をクリックし、作成したインスタンスを選択

  8. 作成したインスタンスのパブリックIPv4アドレスをコピーする

  9. 作成したインスタンスが実行中になったら、コピーしたアドレスにアクセスする

  10. LaravelサンプルアプリのWelcomeページが表示されれば構築完了

現時点では、Registerからユーザ登録を実施しようとすると、例外が発生して実行できない。これは、まだDBを作成していないためである。

3.2 プライベートサブネットにDBサーバを構築する

RDS用セキュリティグループの作成

  1. サービスでVPCを選択

  2. VPCのサイドメニューから、セキュリティグループを選択

  3. 「セキュリティグループを作成」をクリックし、下記の通り設定し作成

    Item Value
    セキュリティグループ名 YourName SG RDS
    説明 Trafic from app servers
    VPC YourName App VPC
    インバウンドルール タイプ: MYSQL/Aurora, ソース: YourName App SG
    アウトバウンドルール 変更なし

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

  1. サービスでRDSを選択

  2. RDSのサイドメニューから、サブネットグループを選択

  3. 右上の「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の構築

  1. RDSのサイドメニューから、データベースを選択

  2. 右上の「データベースの作成」をクリック

  3. 下記を順に設定する

    1. データベース作成方法を選択

      • 標準作成
    2. エンジンのオプション

      • MySQL(バージョンは8.0.23)
    3. テンプレート

      • 開発/テスト
    4. 設定

      Item Value
      DB インスタンス識別子 YourName-laravel-sample-db
      マスターユーザー名 Subnet group for private DB
      マスターパスワード 任意の値

      あるいはパスワードの自動生成のチェックをオンにする

    5. DB インスタンスクラス

      • バースト可能クラス

      • ドロップダウンリストから db.t3.micro を選択

    6. ストレージ

      変更なし

    7. 可用性と耐久性

      • スタンバイインスタンスを作成しないでください
    8. 接続

      Item Value
      Virtual Private Cloud (VPC) YourName App VPC
      サブネットグループ YourName DB Subnet Group
      パブリックアクセス なし
      VPCセキュリティグループ 既存の選択
      既存のVPCセキュリティグループ YourName SG RDSのみ(defaultは外す)
      アベイラビリティゾーン ap-northeast-1a

      追加設定は変更なし

    9. データベース認証

      変更なし

    10. 追加設定

      • 最初のデータベース名: mydb

      • 自動バックアップを有効にします: チェックオフ

      その他の設定は変更なし

    以上を入力し、作成をクリック

  4. パスワードの自動生成を使用した場合は、「データベース YourName-laravel-sample-db を作成しています」のダイアログから詳細を表示し、パスワードをコピーしておくこと

  5. 「接続とセキュリティ」タブのエンドポイントをコピーしておく

以上でRDSを使用したDBサーバの構築が完了した。

LaravelにDBを接続

WebサーバにデプロイしたアプリケーションにDBの接続情報を入力して、アプリケーションが接続できるようにする。

  1. サービスでEC2を選択

  2. EC2のサイドメニューから、インスタンスを選択

  3. インスタンス名「YourName App Server」を選択し、上部の「接続」ボタンをクリック

  4. 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の作成

  1. サービスでEC2を選択

  2. EC2のサイドメニューから、ロードバランサーを選択

  3. ロードバランサーの作成をクリックし、Application Load Balancerの作成を選択

  4. 手順 1: ロードバランサーの設定にて、下記の通り設定

    Item Value
    名前 YourName ALB
    VPC YourName App VPC
    アベイラビリティゾーン 2つともオンにし、作成したパブリックサブネットを選択
  5. 手順 2: セキュリティ設定の構成はここではスキップ

  6. 手順 3: セキュリティグループの設定にて、下記の設定で新しいセキュリティグループを作成

    Item Value
    セキュリティグループ名 YourName ALB SG
    説明 Enable web access to load balancer
    ルール1 タイプ: HTTP, ソース: 任意の場所
    ルール2 タイプ: HTTPS, ソース: 任意の場所
  7. 手順 4: ルーティングの設定にて、以下を実施

    1. ターゲットグループの名前を「YourName App」と設定

    2. ヘルスチェックの詳細設定を開き、次の通り変更

      Item Value
      正常のしきい値 2
      間隔 10秒

      ヘルスチェックを10秒間隔で実施し、インスタンスから2回連続で正しい応答が返されれば、インスタンスは正常と判断される。

  8. 手順 5: ターゲットの登録では、今は登録できないため、そのまま次へ

  9. 設定を確認し、作成をクリック

4.2 Auto Scalingを設定

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

アプリケーションサーバに使用しているセキュリティグループのインバウンドルールを変更し、ALBからアクセスできるようにする。また、パブリックアクセスができないようにする。

  1. EC2のサイドメニューから、セキュリティグループを選択

  2. アプリケーションサーバに使用しているセキュリティグループを選択

  3. インバウンドルールタブを開き、「Edit inbound rules」を選択

  4. インバウンドルールを編集にて、下記の通り設定し、ルールを保存

    • 既存のルールをすべて削除

    • 「タイプ: HTTP, ソース: YourName ALB SG」のルールを追加

AMIを作成

  1. EC2のサイドメニューから、インスタンスを選択

  2. アプリケーションサーバのインスタンスを選択し、「アクション▼」からイメージとテンプレート → イメージを作成を選択

  3. イメージを作成にて、イメージ名を「YourName App AMI」としてイメージを作成をクリック

起動テンプレートを作成

  1. EC2のサイドメニューから、起動テンプレートを選択

  2. 起動テンプレートの作成をクリックし、下記の通り設定

    Item Value
    起動テンプレート名 YourName App LT
    AMI YourName App AMI
    インスタンスタイプ t2.micro
    セキュリティグループ YourName App SG (ALBからのインバウンドトラフィックを有効化したもの)
    IAMインスタンスプロフィール Systems Manager用のRole
  3. 作成をクリック

Auto Scalingグループを作成

  1. EC2のサイドメニューから、Auto Scalingグループを選択

  2. Auto Scalingグループの作成をクリックし、下記の通り設定

    Item Value
    Auto Scalingグループ名 YourName App ASG
    起動テンプレート YourName App Template
  3. 次へをクリックし、「設定の構成」のページで下記の通り設定

    Item Value
    VPC YourName App VPC
    サブネット YourName Private Web Subnet 1, 2 (プライベートサブネット2つ)
  4. 次へをクリックし、「詳細オプションを設定」のページで下記の通り設定

    Item Value
    ロードバランシング 既存のロードバランサーにアタッチ
    既存のロードバランサーターゲットグループ YourName-App/HTTP
    ヘルスチェックの猶予期間 200
    CloudWatch内でグループメトリクスの収集を有効にする オン

    先ほど作成したターゲットグループにAuto Scalingで作成したEC2インスタンスを登録するように指定することで、ロードバランサーよりこのターゲットグループ内のインスタンスにトラフィックが送信される。

  5. 次へをクリックし、「グループサイズとスケーリングポリシーを設定する」のページで下記の通り設定

    Item Value
    希望する容量 2
    最小キャパシティ 2
    最大キャパシティ 2

    2つのインスタンスが常に維持されるように設定。

  6. 次の「通知の追加」は実施せず、その次の「タグを追加」で以下のように設定

    Item Value
    キー Name
    YourName-sample-app
  7. 次のページで設定を確認し、「Auto Scalingグループを作成」をクリック

5. ElastiCacheのRedisを作成する

セッションを共有しなければ、複数のインスタンスでログイン情報が共有されず、アプリケーションが動作しない。

5.1 Session Managerをプライベートサブネットで利用可能にする

AWSの資料を参考に実施する。

VPCエンドポイント用のセキュリティグループを作成

  1. サービスでVPCを選択

  2. VPCのサイドメニューから、セキュリティグループを選択

  3. 「セキュリティグループを作成」をクリックし、下記の通り設定し作成

    Item Value
    セキュリティグループ名 YourName VPC EP SG
    説明 Allow access to VPC Endpoint
    VPC YourName App VPC
    インバウンドルール タイプ: HTTPS, ソース: YourName App SG
    アウトバウンドルール 変更なし

VPCエンドポイントを作成

  1. VPCのサイドメニューから、エンドポイントを選択

  2. サービス名で、com.amazonaws.ap-northeast-1.ssmを検索。大阪リージョンの場合は、com.amazonaws.ap-northeast-3.ssm

  3. 以下のように設定

    Item Value
    VPC YourName App VPC
    サブネット YourName Private Web Subnet 1, 2 (アプリケーションサーバがあるプライベートサブネット)
    セキュリティグループ YourName VPC EP SG
  4. サービス名com.amazonaws.[region].ssmmessagescom.amazonaws.[region].ec2messagesで4.を同様に実施

  5. サービスでSystems Managerを選択

  6. Systems Managerのサイドメニューから、フリートマネージャーを選択し、アプリケーションサーバのインスタンスが表示されることを確認

5.2 ElastiCacheの設定

アプリケーションサーバ間でセッションを保存し共有するためのDBを、ElastiCacheのRedisで作成する。

Redis用セキュリティグループの作成

  1. サービスでVPCを選択

  2. VPCのサイドメニューから、セキュリティグループを選択

  3. 「セキュリティグループを作成」をクリックし、下記の通り設定し作成

    Item Value
    セキュリティグループ名 YourName Redis SG
    説明 Trafic from app servers
    VPC YourName App VPC
    インバウンドルール タイプ: カスタムTCP, ポート:6379, ソース: YourName App SG
    アウトバウンドルール 変更なし

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

RDS用のサブネットグループを作成した際と同様、Redisにもサブネットグループが必要となる。

  1. サービスでElastiCacheを選択

  2. ElastiCacheのサイドメニューから、サブネットグループを選択

  3. 「サブネットグループの作成」をクリックし、下記の通り設定し作成

    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の作成

  1. ElastiCacheのサイドメニューから、Redisを選択

  2. 上部の「作成」をクリックし、下記の通り設定し作成

    Item Value
    クラスターエンジン Redis
    名前 YourName Redis
    説明 Subnet group for Redis
    ポート 6379
    レプリケーション数 1
    マルチAZ オン
    サブネットグループ YourName Redis Subnet Group
    セキュリティグループ YourName Redis SG
    自動バックアップの有効化 オフ

LaravelでRedisを利用する

Redisの接続情報を入力して、アプリケーションが接続できるようにする。

ベースとなるアプリケーションサーバを書き換え、AMIを更新する必要がある。

  1. サービスでEC2を選択

  2. EC2のサイドメニューから、インスタンスを選択

  3. インスタンス名「YourName App Server」を選択し、上部の「接続」ボタンをクリック

  4. 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を作成

  1. EC2のサイドメニューから、インスタンスを選択

  2. アプリケーションサーバのインスタンスを選択し、「アクション▼」からイメージとテンプレート → イメージを作成を選択

  3. イメージを作成にて、イメージ名を「YourName App AMI Redis Ready」としてイメージを作成をクリック

起動テンプレートの変更

  1. EC2のサイドメニューから、テンプレートの起動を選択

  2. アプリケーションサーバの起動テンプレートを選択し、「アクション▼」から「テンプレートの変更」を選択

  3. AMIを新たに作成したイメージに変更し、下部の「テンプレートのバージョンを作成」をクリック

  4. 起動テンプレートの詳細に戻り、起動テンプレートの「アクション▼」から「デフォルトバージョンを設定」を選択

  5. 最新バージョンを選択し、「デフォルトバージョンとして設定」をクリック

インスタンスの再生成

Auto Scalingが有効の場合、起動中のインスタンスを全て終了することで、新しい設定のインスタンスが立ち上がる。

立ち上がったら、アプリケーションを開き、ログインすると正常に動作することが確認できる。

GitHubで編集を提案

Discussion