CloudFormationでVPCのテンプレートを作成する前に、作りたいVPCの構成を確認しておく。(基本的には、AWS環境構築1:VPC構築で作成したものを再現したいと思っている。)
今後、EC2も作成することを考えて、セキュリティグループなども今回設定しておく。
作りたいVPCの概要
- VPC:172.16.0.0/16 (cf_vpc_02)
- PublicSubnet1:172.16.0.0/20 (Cf_PublicSubnet_00)
- PublicSubnet2:172.16.16.0/20 (Cf_PublicSubnet_16)
- PrivateSubnet1:172.16.32.0/20 (Cf_PrivateSubnet_32)
- PrivateSubnet2:172.16.64.0/20 (Cf_PrivateSubnet_64)
作りたいVPCの条件
- サブネットには、異なるアベイラビリティゾーンを設定する
- 2つのパブリックサブネットには共通のIGWを設定する
- ルートテーブルには2つのPublicSubnetを関連付ける
- Elastic IPは使用しない
- セキュリティグループはAWS環境構築6のプロトコルを想定
ここからテンプレートの作成
テンプレートは、JSONかYAMLなので、YAMLで作成する。YAMLは括弧がない分、すっきりするので個人的に好み。
テンプレートのフォーマットを覚えるのが無理ゲーなので、VSCodeに必ずスニペットを入れておくこと。
※参考にしたのは、AWS CloudFormationユーザーガイドのサンプルテンプレートのAmazon Virtual Private Cloudの中の「Amazon VPC における単一の Amazon EC2」
VPCの作成
- CfVPC:VPCの名前(好きなものをつければいい)
- Type:固定
- CidrBlock:IPv4 CIDR
- EnableDnsSupport:DNS解決は有効
- Tags:Nameを指定しておくとコンソールマネージャーで見たときにわかりやすい
Resources:
CfVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 172.16.0.0/16
EnableDnsSupport: true
Tags:
- Key: Name
Value: cf_vpc_02
サブネットの作成
- CfSubnet16~64:サブネットの名前(好きなものをつければいい)
- Type:固定
- AvailabilityZone:4つのサブネットに対して適度にばらけさせて設定
- VpcId:サブネットに紐づけるVPC(上で作成したVPCを参照させる)
- CidrBlock:サブネットのIPv4 CIDR
- Tags:Nameを指定しておくとコンソールマネージャーで見たときにわかりやすい
CfSubnet16:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1a
VpcId: !Ref CfVPC
CidrBlock: 172.16.16.0/20
Tags:
- Key: Name
Value: Cf_PublicSubnet_16
CfSubnet00:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1c
VpcId: !Ref CfVPC
CidrBlock: 172.16.0.0/20
Tags:
- Key: Name
Value: Cf_PublicSubnet_00
CfSubnet32:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1d
VpcId: !Ref CfVPC
CidrBlock: 172.16.32.0/20
Tags:
- Key: Name
Value: Cf_PrivateSubnet_32
CfSubnet64:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1c
VpcId: !Ref CfVPC
CidrBlock: 172.16.64.0/20
Tags:
- Key: Name
Value: Cf_PrivateSubnet_64
IGW(インターネットゲートウェイ)の作成
- CfIGW:IGWの名前(好きなものをつければいい)
- Type:固定
- CidrBlock:サブネットのIPv4 CIDR
- VpcId:IGWに紐づけるVPC(上で作成したVPCを参照させる)
- InternetGatewayId:Attachmentに紐づけるIGW
- Tags:Nameを指定しておくとコンソールマネージャーで見たときにわかりやすい
CfIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: cf_igw_02
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref CfVPC
InternetGatewayId: !Ref CfIGW
ルートテーブルの作成
- CfRouteTable:ルートテーブルの名前(好きなものをつければいい)
- Type:固定
- VpcId:ルートテーブルに紐づけるVPC(上で作成したVPCを参照させる)
- Tags:Nameを指定しておくとコンソールマネージャーで見たときにわかりやすい
- RouteTableId:紐づけるルートテーブル
- DestinationCidrBlock:送信先は0.0.0.0/0
- GatewayId:紐づけるIGW
- CfSubnetRtblAssociationA~B:ルートテーブルに紐づけるサブネットの名前(好きなものでOK)
- RouteTableId:サブネットに紐づけるルートテーブル
- SubnetId:紐づけるサブネットを参照
CfRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref CfVPC
Tags:
- Key: Name
Value: cf_rtbl_02
CfRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref CfRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref CfIGW
CfSubnetRtblAssociationA:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref CfRouteTable
SubnetId: !Ref CfSubnet00
CfSubnetRtblAssociationB:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref CfRouteTable
SubnetId: !Ref CfSubnet16
ネットワークACLの作成
デフォルトのままでよければ特に記述は必要なし。
補足:
サブネットに対して紐付けたいACLがある場合は、指定できる。
指定しなければ、変更可能なデフォルトのネットワークACLが自動的に設定されるが、指定してカスタムネットワークACLを作成する場合は、ルールを追加するまでは、全てのトラフィックが拒否になるので注意。
- CfNetworkACL:ネットワークACLの名前(好きなものをつければいい)
- Type:固定
- Tags:Nameを指定しておくとコンソールマネージャーで見たときにわかりやすい
- VpcId:ルートテーブルに紐づけるVPC(上で作成したVPCを参照させる)
CfNetworkACL:
Type: AWS::EC2::NetworkAcl
Properties:
Tags:
- Key: Name
Value: cf_acl_02
VpcId: !Ref CfVPC
CfSubnetNwAssociation:
Type: AWS::EC2::SubnetNetworkAclAssociation
Properties:
NetworkAclId: !Ref CfNetworkACL
SubnetId: !Ref CfSubnet00
この下にインバウンド・アウトバウンドトラフィックルールを設定
セキュリティグループの作成
- CfsecGroup:セキュリティグループの名前(好きなものをつければいい)
- Type:固定
- GroupName :セキュリティグループ名(好きなものを)
- VpcId:ルートテーブルに紐づけるVPC(上で作成したVPCを参照させる)
- SecurityGroupIngress:許可するプロトコル、ポート、IPv4 CIDR
- Tags:Nameを指定しておくとコンソールマネージャーで見たときにわかりやすい
CfsecGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: cf-launch-wizerd_02
GroupDescription: Enable SSH access via port 22
VpcId: !Ref CfVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: 172.16.16.0/20
- IpProtocol: tcp
FromPort: 3000
ToPort: 3000
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: cf_sg_02
VPCテンプレート
VPC関連の設定をひとまとめにしたもの
Resources:
CfVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 172.16.0.0/16
EnableDnsSupport: true
Tags:
- Key: Name
Value: cf_vpc_02
CfSubnet16:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1a
VpcId: !Ref CfVPC
CidrBlock: 172.16.16.0/20
Tags:
- Key: Name
Value: Cf_PublicSubnet_16
CfSubnet00:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1c
VpcId: !Ref CfVPC
CidrBlock: 172.16.0.0/20
Tags:
- Key: Name
Value: Cf_PublicSubnet_00
CfSubnet32:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1d
VpcId: !Ref CfVPC
CidrBlock: 172.16.32.0/20
Tags:
- Key: Name
Value: Cf_PrivateSubnet_32
CfSubnet64:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1c
VpcId: !Ref CfVPC
CidrBlock: 172.16.64.0/20
Tags:
- Key: Name
Value: Cf_PrivateSubnet_64
CfIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: cf_igw_02
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref CfVPC
InternetGatewayId: !Ref CfIGW
CfRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref CfVPC
Tags:
- Key: Name
Value: cf_rtbl_02
CfRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref CfRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref CfIGW
CfSubnetRtblAssociationA:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref CfRouteTable
SubnetId: !Ref CfSubnet00
CfSubnetRtblAssociationB:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref CfRouteTable
SubnetId: !Ref CfSubnet16
CfsecGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: cf-launch-wizerd_02
GroupDescription: Enable SSH access via port 22
VpcId: !Ref CfVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: 172.16.16.0/20
- IpProtocol: tcp
FromPort: 3000
ToPort: 3000
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: cf_sg_02
注意点
TagsのKeyはNameとnameは区別される。
小文字のnameにすると、コンソールマネージャーのName欄には表示されないので注意。
