はじめてのAWS CloudFormation -VPC作成編-

# はじめに
前々回の記事:[はじめてのAWS CloudFormation -S3バケット作成編-](https://qiita.com/Mouflon_127000/items/6731e5c5d793341a8906)
前回の記事:[はじめてのAWS CloudFormation -IAMユーザー作成編-](https://qiita.com/Mouflon_127000/items/97e1e4b10a18871d8609)

引き続きCloudFormationを学ぼうという試みと取り組んだ内容の記録です。
今回はCloudFormationでVPC(VPC、サブネット、IGW、ルートテーブル)を作成してみます。

# 方針
作成するVPC環境の方針を考えます。
- 作成するVPCは1つ。
- VPCエンドポイントやEC2間の名前解決に備えDNSホスト名を有効化する。
- サブネットはパブリックとプライベートをAZを分けて2つずつ作成する。
- VPCとサブネットのCIDRは以下の通りとする(デプロイ時にパラメータとして任意に指定できる方式にする)。
    - VPC:10.1.0.0/16
    - パブリックサブネットA(AZ:ap-northeast-1a):10.1.10.0/24
    - パブリックサブネットC(AZ:ap-northeast-1c):10.1.20.0/24
    - プライベートサブネットA(AZ:ap-northeast-1a):10.1.30.0/24
    - プライベートサブネットC(AZ:ap-northeast-1c):10.1.40.0/24
- IGWを作成し、パブリックサブネットのデフォルトゲートウェイとしてIGWを指定する。
- DHCPオプションセットについてはデフォルトで作成されるものを利用する(テンプレート内で明示的に作成しない)。
- タグ「Key:Env, Value:CFn-test」を付与する。

構成図:
![CFn-VPC.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561546/f5d38d37-028c-0ffa-274e-73d09222c653.jpeg)


# テンプレート用パラメータの確認
公式ドキュメントから各リソースで指定可能なPropertiesを確認します。
各リソースの細かいパラメータの中身は割愛。

[AWS公式ドキュメント - AWS::EC2::VPC](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html)
[AWS公式ドキュメント - AWS::EC2::Subnet](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html)
[AWS公式ドキュメント - AWS::EC2::InternetGateway](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html)
[AWS公式ドキュメント - AWS::EC2::VPCGatewayAttachment](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html)
[AWS公式ドキュメント - AWS::EC2::RouteTable](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html)
[AWS公式ドキュメント - AWS::EC2::Route](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html)
[AWS公式ドキュメント - AWS::EC2::GatewayRouteTableAssociation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-gatewayroutetableassociation.html)

# 完成したCloudFormationテンプレート


```yml:CreateVPC
AWSTemplateFormatVersion: 2010-09-09
Description: Create VPC

Parameters:
  VpcCidr:
    Type: String
    Default: "10.1.0.0/16"
  
  PubSubnetACidr:
    Type: String
    Default: "10.1.10.0/24"

  PubSubnetCCidr:
    Type: String
    Default: "10.1.20.0/24"

  PriSubnetACidr:
    Type: String
    Default: "10.1.30.0/24"

  PriSubnetCCidr:
    Type: String
    Default: "10.1.40.0/24"

Resources: 
#VPC
  CFnVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCidr
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Env
          Value: CFn-test

#Subnet
  CFnPubSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      VpcId: !Ref CFnVpc
      CidrBlock: !Ref PubSubnetACidr
      Tags:
        - Key: Env
          Value: CFn-test

  CFnPubSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: "ap-northeast-1c"
      VpcId: !Ref CFnVpc
      CidrBlock: !Ref PubSubnetCCidr
      Tags:
        - Key: Env
          Value: CFn-test

  CFnPriSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      VpcId: !Ref CFnVpc
      CidrBlock: !Ref PriSubnetACidr
      Tags:
        - Key: Env
          Value: CFn-test

  CFnPriSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: "ap-northeast-1c"
      VpcId: !Ref CFnVpc
      CidrBlock: !Ref PriSubnetCCidr
      Tags:
        - Key: Env
          Value: CFn-test

#InternetGW
  CFnIGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Env
          Value: CFn-test

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref CFnVpc
      InternetGatewayId: !Ref CFnIGW

#RouteTable
  PubRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref CFnVpc
      Tags:
        - Key: Env
          Value: CFn-test
        
  PubRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PubRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref CFnIGW

  PubRouteTableAssociationA:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref CFnPubSubnetA
      RouteTableId: !Ref PubRouteTable

  PubRouteTableAssociationB:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref CFnPubSubnetC
      RouteTableId: !Ref PubRouteTable
```

# おわりに
CloudFormationを使ってVPC環境を作成してみました。
今回作成したVPC作成のテンプレートと以前作成したS3バケット作成のテンプレートと組み合わせて、
VPCフローログの設定までやれるように改良していきたいです。