今後も何度か同じことを調べそうなので忘備録としてまとめておく。手順を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を使ってサブネット毎にファイアウォールを定義できる!
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\"
}