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

