subtitle

RaiseTechの各種コースをはじめとしたイロイロな学習の記録

CloudFormationでVPCのテンプレートを作成する

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