AWS Framework

VPC内にElastic Beanstalk + RDS の環境を構築して Laravel アプリをデプロイする [RDS構築編]

更新日:

今後も何度か同じことを調べそうなので忘備録としてまとめておく。手順をstep by stepで記述するが、それぞれ分量が多いので以下の通り章立てを行ってエントリを分割する。

  • VPC構築編
    • VPCの作成
    • VPC、NetworkACL、SecurityGroupの確認、タグ付け
    • VPCのDNSホスト名を有効にする
    • サブネットの作成、タグ付け
    • インターネットゲートウェイの作成、タグ付け、VPCにアタッチ
    • パブリックサブネット用RoutingTableの作成
    • パブリックサブネット用RoutingTableにインターネットゲートウェイの関連付け
    • 作成したサブネットをパブリックサブネット用RoutingTableに繋ぎかえる
  • RDS構築編(本エントリ)
    • MySQLの設定変更(DBパラメータグループの作成)
    • DBサブネットグループを作成
    • RDS用セキュリティグループの作成
    • RDSインスタンスの作成
    • エンドポイントの確認、疎通確認
  • Elastic Beanstalk構築編
    • 環境の構築
    • .ebextensionsによるカスタマイズ
  • Laravel5アプリデプロイ編
    • gitリポジトリからclone
    • .envの編集
    • アプリで使うDBのダンプファイルをRDSにコピー
    • Laravelインストーラの準備
    • Laravel本体のインストール
    • ビルトインサーバでの疎通確認
    • Elastic Beanstalkへのデプロイ

MySQLの設定変更

my.cnf等のコンフィグファイルに記述していた内容をRDS風に記述する。RDSでは「DBパラメータ」に設定を記述していく。まず、DBパラメータを作成する。

$ aws rds create-db-parameter-group  \
    --db-parameter-group-name mydbparamgroup  \
    --db-parameter-group-family mysql5.6  \
    --description "public rds"
{
    "DBParameterGroup": {
        "DBParameterGroupName": "mydbparamgroup",
        "DBParameterGroupFamily": "mysql5.6",
        "Description": "public rds"
    }
}

文字コード関連の設定

$ aws rds modify-db-parameter-group --db-parameter-group-name  --parameters \
ParameterName=character_set_client,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_connection,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_database,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_results,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_server,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=collation_connection,ParameterValue=utf8mb4_general_ci,ApplyMethod=immediate \
ParameterName=collation_server,ParameterValue=utf8mb4_general_ci,ApplyMethod=immediate \
ParameterName=skip-character-set-client-handshake,ParameterValue=0,ApplyMethod=pending-reboot

init_connectパラメータの設定。デフォルトの設定をファイルに落とし、ファイルを変更する。

$ aws rds modify-db-parameter-group --generate-cli-skeleton > init_connect.json
# 変更後
$ cat init_connect.json
{
    "DBParameterGroupName": "", 
    "Parameters": [
        {
            "ParameterName": "", 
            "ParameterValue": "", 
            "Description": "", 
            "Source": "", 
            "ApplyType": "", 
            "DataType": "", 
            "AllowedValues": "", 
            "IsModifiable": true, 
            "MinimumEngineVersion": "", 
            "ApplyMethod": ""
        }
    ]
}
# 出力された設定ファイルを変更する
$ vi init_connect.json

# 変更内容は以下の通り
$ cat init_connect.json 
{
    "DBParameterGroupName": "mydbparamgroup", 
    "Parameters": [
        {
            "ParameterName": "init_connect", 
            "ParameterValue": "SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;", 
            "Description": "", 
            "Source": "", 
            "ApplyType": "", 
            "DataType": "", 
            "AllowedValues": "", 
            "IsModifiable": true, 
            "MinimumEngineVersion": "", 
            "ApplyMethod": "immediate"
        }
    ]
}

# 設定ファイルを読み込む
$ aws rds modify-db-parameter-group --cli-input-json file://init_connect.json
{
    "DBParameterGroupName": "mydbparamgroup"
}

DBサブネットグループを作成

DB構築編にてAvailabilityZoneが異なるDB用サブネットを2個作成した。それぞれID/tagは"subnet-131feb65"/"subnet public db1"、"subnet-d6d2d38f"/"subnet public db2"であった。

DB サブネットグループmydbsubnetgroupを作成する。

 aws rds create-db-subnet-group --db-subnet-group-name mydbsubnetgroup --db-subnet-group-description "DB SubnetGroup for RDS Instance" --subnet-ids subnet-131feb65 subnet-d6d2d38f
{
    "DBSubnetGroup": {
        "Subnets": [
            {
                "SubnetStatus": "Active",
                "SubnetIdentifier": "subnet-131feb65",
                "SubnetAvailabilityZone": {
                    "Name": "ap-northeast-1a"
                }
            },
            {
                "SubnetStatus": "Active",
                "SubnetIdentifier": "subnet-d6d2d38f",
                "SubnetAvailabilityZone": {
                    "Name": "ap-northeast-1c"
                }
            }
        ],
        "DBSubnetGroupName": "mydbsubnetgroup",
        "VpcId": "vpc-cc2b11a9",
        "DBSubnetGroupDescription": "DB SubnetGroup for RDS Instance",
        "SubnetGroupStatus": "Complete"
    }
}

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

RDS用セキュリティグループ myrds を作成する。

$ aws ec2 create-security-group --group-name myrds --description "RDS security group" --vpc-id vpc-cc2b11a9
{
    "GroupId": "sg-b50742d1"
}
#タグ付け
$ aws ec2 create-tags --resources sg-b50742d1 --tags Key=Name,Value="sg rds"

RDS MySQLにVPCから接続するために、RDS用セキュリティグループに3306からのInbound許可設定を行う。(作成済のVPCセキュリティグループのIDはsg-73490c17。)

$ aws ec2 authorize-security-group-ingress --group-id sg-b50742d1
   --protocol tcp --port 3306 --source-group sg-73490c17

[参考] 下記のようにCIDR標記のアドレスを指定するとVPCの外部からも接続可能になる。

$ aws ec2 authorize-security-group-ingress --group-id sg-b50742d1 
   --protocol tcp --port 3306 --cidr 0.0.0.0/0

RDSインスタンスの作成

DBパラメータグループ、デフォルトセキュリティグループ、RDS用セキュリティグループを指定する。
外部からの接続を許可する場合 -- publicly-accessible を指定する必要がある。

$ aws rds create-db-instance 
 --db-instance-identifier hogedb 
 --allocated-storage 5 
 --db-instance-class db.t2.micro 
 --engine MySQL 
 --engine-version 5.6.22 
 --master-username hoge
 --master-user-password fuga 
 --db-name hogedb
 --db-parameter-group-name mydbparamgroup
 --db-subnet-group-name mydbsubnetgroup
 --vpc-security-group-ids sg-23fe8447 sg-b50742d1
 --storage-type standard
 --availability-zone ap-northeast-1a
 --no-multi-az
 --region ap-northeast-1
 --publicly-accessible
 --no-auto-minor-version-upgrade

疎通確認

エンドポイントを確認する。予めjqコマンドを利用可能にしておくこと。

# jqがない場合
$ sudo yum install jq
$ aws rds describe-db-instances --db-instance-identifier hogedb | jq '.DBInstances[].Endpoint'
{
  "Address": "hogedb.c3w6*******5990.ap-northeast-1.rds.amazonaws.com",
  "Port": 3306
}

PublicIp、PublicDnsName を確認する。

$ aws ec2 describe-network-interfaces --filters "Name=description,Values=RDSNetworkInterface"
{
..
            "Description": "RDSNetworkInterface",
            "Association": {
                "PublicIp": "54.95.100.249",
                "PublicDnsName": "ec2-54-92-100-249.ap-northeast-1.compute.amazonaws.com",
                "IpOwnerId": "amazon-rds"
            },
..
}

mysql コマンドでエンドポイントに接続してみる。

$ mysql -h 54.95.100.249 -P 3306 -u hoge -p -D hogedb
Enter password: fuga
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.22-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
...

-AWS, Framework

Copyright© ikuty.com , 2018 AllRights Reserved Powered by AFFINGER4.