CloudFormationでVPC&Subnet作成

こんにちは、risakoです！
最近寒くなってきましたね:snowflake:
最近は体調を崩し気味なので、よく寝てよく食べて風邪を引かないように気をつけています:slight_smile:


前回は、EC2を自動で増やしたり減らしてくれるAWS Auto Scalingについてご紹介しました！
今回は、AWS CloudFormation（以下、CloudFormation）について簡単ではありますがご紹介します。

#AWS CloudFormationを知ったきっかけ
このサービスを使い始めたきっかけは、一度設定したAWS Elemental MediaLiveを来年も使うかもしれない....と思った時に、そのまま残しておいては料金がかかってしまうためCloudFormationで書いてbacklog等メモで残しておけばいいのでは？との発想からでした。つまりは、節約のためです！:ok_hand:
ちなみに、CloudFormationの利用自体は無料です！
テンプレートに従って構築された各AWSサービスに対して課金されるようです。

#そもそもAWS CloudFormationとは
>AWS CloudFormation は、関連する AWS リソースの集約を整った予測可能な方法でプロビジョニングおよび更新し、開発者やシステム管理者が容易にそれらを作成、管理できるようにします。お客様は、AWS CloudFormation のサンプルテンプレートを使用したり、独自のテンプレートを作成したりして、AWS リソースと、アプリケーションを実行するために必要な関連するすべての依存関係やランタイムパラメータを記述できます。AWS のサービスをプロビジョニングする順番を見つけたり、依存関係が機能するように細かく注意したりする必要はありません。
参考：https://aws.amazon.com/jp/cloudformation/features/

すごくいいなと思ったところは、ベストプラクティスが盛り込まれたテンプレートで、１度作成してしまえば同じ構成を再現できるということです:sparkles:



#VPC＆Subnet作成

テンプレートを参考に複数同時にVPCとSubnetを作成してみたいと思います。
VPCとSubnetはコンソール上でも作成が簡単なので、CloufFormationでも簡単に作成できます。且つ、一緒に作成もできてしまうので時間短縮にもなります！

###VPCテンプレート(YAML)
```
Type: AWS::EC2::VPC
Properties: 
  CidrBlock: String
  EnableDnsHostnames: Boolean
  EnableDnsSupport: Boolean
  InstanceTenancy: String
  Tags: 
    - Tag
```
###必須事項
- CidrBlock

###Subnetテンプレート（YAML）
```
Type: AWS::EC2::Subnet
Properties: 
  AssignIpv6AddressOnCreation: Boolean
  AvailabilityZone: String
  CidrBlock: String
  Ipv6CidrBlock: String
  MapPublicIpOnLaunch: Boolean
  Tags: 
    - Tag
  VpcId: String
```
###必須事項
- CidrBlock
- VPCID

##実際に作成してみる
```
Resources:
  myVPC1:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: 10.15.0.0/16
      EnableDnsSupport: 'false'
      EnableDnsHostnames: 'false'
      Tags:
        - Key: Name
          Value: testA
  myVPC2:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: 10.30.0.0/16
      EnableDnsSupport: 'false'
      EnableDnsHostnames: 'false'
      Tags:
        - Key: Name
          Value: testB
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: myVPC2
      CidrBlock: 10.30.0.0/24
      AvailabilityZone: "ap-northeast-1a"
      Tags:
      - Key: Name
        Value: test-public
  PrivateSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: myVPC1
      CidrBlock: 10.15.0.0/24
      AvailabilityZone: "ap-northeast-1c"
      Tags:
      - Key: Name
        Value: test-private
```

##コンソールで確認してみる
###VPC
名前：TestA
CIDR: 0.15.0.0/16
![スクリーンショット 2019-11-14 17.48.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/36bb17bf-ffb1-ba92-7849-f069ce69775d.png)
名前：TestB
CIDR：10.30.0.0/16
![スクリーンショット 2019-11-14 17.48.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/4ee6d6c2-93c6-6516-51e0-83d09c78dd36.png)

###Subnet
名前：test-public
AZ:ap-northeast-1a
紐づいているVPC：testB

![スクリーンショット 2019-11-14 17.56.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/6762cbd5-7e91-2fe9-ac13-762bd5f6f967.png)

名前：test-private
AZ：ap-northeast-1c
紐づいているVPC：testA

![スクリーンショット 2019-11-14 17.56.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/5bc39c62-b437-dfe8-b225-b39b3d0d64dc.png)


CloudFormationに記述した通りに作成できているのが確認できました！

今回使用したテンプレートを保存しておけば次にVPCを作成するときに便利です！
また、既存の名前やCIDRを入力してしまうとうまく作成されないので注意です:point_up:

今回もお読みいただきありがとうございました:grinning:


#参考資料

- 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 Black Belt Online Seminar [AWS Cllud Formation]
https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2016-aws-cloudformation