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欄には表示されないので注意。