AWS Framework

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

更新日:

今後も何度か同じことを調べそうなので忘備録としてまとめておく。手順を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へのデプロイ

前提

aws cli, eb-cli をインストールしておくこと。

$ pwd
/home/ikuty
$ aws --version
aws-cli/1.10.37 Python/2.6.6 Linux/2.6.32-573.22.1.el6.x86_64 botocore/1.4.27
$ eb --version
EB CLI 3.7.6 (Python 2.7.9)

Administrator AccessポリシーをもつユーザをIAMで作成し、aws-cli から該当ユーザの権限で操作できるようにしておくこと。

$ aws configure
AWS Access Key ID [****************]
AWS Secret Key [***********************]
Default region name [ap-northeast-1]
Default output format [json]

VPCの環境構築

VPCを作成する。アドレスの範囲をCIDR標記で記述する。ネットワーク部を16bit取る。
vpc-cc2b11a9というIDのVPCが作成されたという報告がjsonで戻る。

$ aws ec2 create-vpc --cidr-block 10.0.0.0/16
{
    "Vpc": {
        "VpcId": "vpc-cc2b11a9",
        "InstanceTenancy": "default",
        "State": "pending",
        "DhcpOptionsId": "dopt-fec65c9b",
        "CidrBlock": "10.0.0.0/16",
        "IsDefault": false
    }
}

vpc-cc2b11a9というVPCにNameタグを付与する。

$ aws ec2 create-tags --resources vpc-cc2b11a9 --tags Key=Name,Value="vpc"

VPCとは、クラウド上に閉じたネットワークを構築する機能であり、VPC作成時に、閉じたネットワークを構成する要素が同時に生成される。構成要素は以下の通り。

  • Routing Table
  • Subnet
  • Network ACL
  • Security group

なお、Network ACL、Security group について AWS のドキュメントでは以下の通り説明している。

Amazon VPCのネットワークACL(アクセスコントロールリスト)は、サブネット内外のトラフィックを制御するファイアウォールとして任意のセキュリティを提供します。セキュリティグループの設定と同じようにACLのルールを適応することによって、VPCに追加のセキュリティ層を提供します。EC2はサブネット指定ができませんのでネットワークACLを利用することはできません。

なんのこっちゃ、だが、図を見ると一目瞭然である。NetworkACLを使ってサブネット毎にファイアウォールを定義できる
security-diagram

NetworkACL、SecurityGroupいずれもファイアウォールのように見えるが、以下のような違いがある。

セキュリティグループ ネットワーク ACL
インスタンスレベルで動作します(第 1 保護レイヤー) サブネットレベルで動作します(第 2 保護レイヤー)
ルールの許可のみがサポートされます ルールの許可と拒否がサポートされます
ステートフル: ルールに関係なく、返されたトラフィックが自動的に許可されます ステートレス: 返されたトラフィックがルールによって明示的に許可されます
トラフィックを許可するかどうかを決める前に、すべてのルールを評価します トラフィックを許可するかどうかを決めるときに、順番にルールを処理します
インスタンスの起動時に誰かがセキュリティグループを指定した場合、または後でセキュリティグループをインスタンスに関連付けた場合にのみ、インスタンスに適用されます。 関連付けられたサブネット内のすべてのインスタンスに自動的に適用されます(バックアップの保護レイヤーなので、セキュリティグループを指定する人物に依存する必要はありません)

Routing tableにタグをつける

vpc-cc2b11a9というIDを持ったVPCのRouting tableを確認する。rtb-964da5f2というIDを持ったRouting tableを確認できる。

$ aws ec2 describe-route-tables --filters "Name=vpc-id,Values=vpc-cc2b11a9"
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "RouteTableAssociationId": "rtbassoc-b2fd42d6",
                    "Main": true,
                    "RouteTableId": "rtb-964da5f2"
                }
            ],
            "RouteTableId": "rtb-964da5f2",
            "VpcId": "vpc-cc2b11a9",
            "PropagatingVgws": [],
            "Tags": [],
            "Routes": [
                {
                    "GatewayId": "local",
                    "DestinationCidrBlock": "10.0.0.0/16",
                    "State": "active",
                    "Origin": "CreateRouteTable"
                }
            ]
        }
    ]
}
$ aws ec2 create-tags --resources rtb-964da5f2 --tags Key=Name,Value="rtb main"

NetworkACLにタグをつける

$ aws ec2 describe-network-acls --filters "Name=vpc-id,Values=vpc-cc2b11a9"
{
    "NetworkAcls": [
        {
            "Associations": [],
            "NetworkAclId": "acl-25fb1a41",
            "VpcId": "vpc-cc2b11a9",
            "Tags": [],
            "Entries": [
                {
                    "CidrBlock": "0.0.0.0/0",
                    "RuleNumber": 100,
                    "Protocol": "-1",
                    "Egress": true,
                    "RuleAction": "allow"
                },
                {
                    "CidrBlock": "0.0.0.0/0",
                    "RuleNumber": 32767,
                    "Protocol": "-1",
                    "Egress": true,
                    "RuleAction": "deny"
                },
                {
                    "CidrBlock": "0.0.0.0/0",
                    "RuleNumber": 100,
                    "Protocol": "-1",
                    "Egress": false,
                    "RuleAction": "allow"
                },
                {
                    "CidrBlock": "0.0.0.0/0",
                    "RuleNumber": 32767,
                    "Protocol": "-1",
                    "Egress": false,
                    "RuleAction": "deny"
                }
            ],
            "IsDefault": true
        }
    ]
}
$ aws ec2 create-tags --resources acl-25fb1a41 --tags Key=Name,Value="acl main"

SecurityGroupにタグをつける

SecurityGroupを確認する。ID=sg-23fe8447というSecurityGroupが存在することがわかる。

$ aws ec2 describe-security-groups --filters "Name=vpc-id,Values=vpc-cc2b11a9"
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": [],
                    "PrefixListIds": []
                }
            ],
            "Description": "default VPC security group",
            "IpPermissions": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [],
                    "UserIdGroupPairs": [
                        {
                            "UserId": "281631559249",
                            "GroupId": "sg-23fe8447"
                        }
                    ],
                    "PrefixListIds": []
                }
            ],
            "GroupName": "default",
            "VpcId": "vpc-cc2b11a9",
            "OwnerId": "281631559249",
            "GroupId": "sg-23fe8447"
        }
    ]
}
$ aws ec2 create-tags --resources sg-23fe8447 --tags Key=Name,Value="sg main"

VPCのDNSホスト名を有効にする

VPC内のRDSに外部から接続できるようにDNSホスト名を有効にする。

#有効にする
$ aws ec2 modify-vpc-attribute --vpc-id vpc-cc2b11a9 --enable-dns-hostnames
#確認する
$ aws ec2 describe-vpc-attribute --vpc-id vpc-cc2b11a9 --attribute enableDnsHostnames
{
    "VpcId": "vpc-cc2b11a9",
    "EnableDnsHostnames": {
        "Value": true
    }
}

サブネットを作成する

最初のVPC作成時に、16ビットをネットワーク部として使う意図で、CIDR標記で/16を設定した。さらに、8ビットをサブネットとして利用するため、CIDR標記で/24を設定する。8ビット分(第3オクテット分)がサブネットとして利用でき、そのうち .0、.1、.2 のサブネットを作成する。第4オクテットがホスト部となるが、8ビット全て利用することはできず、利用できる最大数がそれぞれ"AvailableIpAddressCount"に書かれてる。なお、各サブネットにそれぞれIDが振られる。
RDSをMultiAZで運用しない場合でもDBサブネットグループを作成する際に2つのAvailabilityZoneが必要なので異なるAvailabilityZoneに対応するサブネットを作成する。

$ aws ec2 create-subnet --vpc-id vpc-cc2b11a9 --cidr-block 10.0.0.0/24 --availability-zone ap-northeast-1a
{
    "Subnet": {
        "VpcId": "vpc-cc2b11a9",
        "CidrBlock": "10.0.0.0/24",
        "State": "pending",
        "AvailabilityZone": "ap-northeast-1a",
        "SubnetId": "subnet-b71eeac1",
        "AvailableIpAddressCount": 251
    }
}
# ap-northeast-1a AvailabilityZone
$ aws ec2 create-subnet --vpc-id vpc-cc2b11a9 --cidr-block 10.0.1.0/24 --availability-zone ap-northeast-1a
{
    "Subnet": {
        "VpcId": "vpc-cc2b11a9",
        "CidrBlock": "10.0.1.0/24",
        "State": "pending",
        "AvailabilityZone": "ap-northeast-1a",
        "SubnetId": "subnet-131feb65",
        "AvailableIpAddressCount": 251
    }
}
# ap-northeast-1c AvailabitliyZone
$ aws ec2 create-subnet --vpc-id vpc-cc2b11a9 --cidr-block 10.0.2.0/24 --availability-zone ap-northeast-1c
{
    "Subnet": {
        "VpcId": "vpc-cc2b11a9",
        "CidrBlock": "10.0.2.0/24",
        "State": "pending",
        "AvailabilityZone": "ap-northeast-1c",
        "SubnetId": "subnet-d6d2d38f",
        "AvailableIpAddressCount": 251
    }
}

サブネットにタグを付与する

作成したサブネットには、それぞれ、subnet-b71eeac1、subnet-131feb65、subnet-d6d2d38f というIDが振られている。それぞれにタグを付与する。

$ aws ec2 create-tags --resources subnet-b71eeac1 --tags Key=Name,Value="subnet public web"
$ aws ec2 create-tags --resources subnet-131feb65 --tags Key=Name,Value="subnet public db1"
$ aws ec2 create-tags --resources subnet-d6d2d38f --tags Key=Name,Value="subnet public db2"

インターネットゲートウェイの作成

インターネットゲートウェイを作成し、タグを付与する。

$ aws ec2 create-internet-gateway
{
    "InternetGateway": {
        "Tags": [],
        "InternetGatewayId": "igw-5bb8203e",
        "Attachments": []
    }
}
$ aws ec2 create-tags --resources igw-5bb8203e --tags Key=Name,Value="igw main"

インターネットゲートウェイをVPCにアタッチする。

#アタッチ
$ aws ec2 attach-internet-gateway --internet-gateway-id igw-5bb8203e --vpc-id vpc-cc2b11a9
#確認
$ aws ec2 describe-internet-gateways --internet-gateway-id igw-5bb8203e
{
    "InternetGateways": [
        {
            "Tags": [
                {
                    "Value": "igw main",
                    "Key": "Name"
                }
            ],
            "InternetGatewayId": "igw-5bb8203e",
            "Attachments": [
                {
                    "State": "available",
                    "VpcId": "vpc-cc2b11a9"
                }
            ]
        }
    ]
}

パブリックサブネット用のRoutingTableを作成する

VPC作成時に"rtb-964da5f2"というIDを持つRoutingTableが作成されていることを確認した。"rtb-964da5f2"にはVPC作成時に自動生成されたデフォルトサブネットが紐付いている。
今回、オリジナルのサブネット、インターネットゲートウェイを新たに作成するのに合わせて、RoutingTableを新規作成する。

# RoutingTable の作成
$ aws ec2 create-route-table --vpc-id vpc-cc2b11a9
{
    "RouteTable": {
        "Associations": [],
        "RouteTableId": "rtb-fe5cb49a",
        "VpcId": "vpc-cc2b11a9",
        "PropagatingVgws": [],
        "Tags": [],
        "Routes": [
            {
                "GatewayId": "local",
                "DestinationCidrBlock": "10.0.0.0/16",
                "State": "active",
                "Origin": "CreateRouteTable"
            }
        ]
    }
}
# タグ付け
$ aws ec2 create-tags --resources rtb-fe5cb49a --tags Key=Name,Value="rtb public"

パブリックサブネット用RoutingTableにインターネットゲートウェイを関連付ける

$ aws ec2 create-route --route-table-id rtb-fe5cb49a --destination-cidr-block 0.0.0.0/0 --gateway-id igw-5bb8203e
{
    "Return": true
}

新たに作成したサブネットをパブリックサブネット用RoutingTableに繋ぎかえる

$ aws ec2 associate-route-table --route-table-id rtb-fe5cb49a --subnet-id subnet-b71eeac1
{
    "AssociationId": "rtbassoc-0ce55a68"
}
$ aws ec2 associate-route-table --route-table-id rtb-fe5cb49a --subnet-id subnet-131feb65
{
    "AssociationId": "rtbassoc-c1e45ba5"
}
$ aws ec2 associate-route-table --route-table-id rtb-fe5cb49a --subnet-id subnet-d6d2d38f
{
    "AssociationId": "rtbassoc-76c97612"
}

-AWS, Framework

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