[社内勉強会資料] CloudFormationで構築する自動デプロイ環境 ～ 2/6

# 第2回 CloudFormationテンプレートの実行（Network）
さて第2回の今回は、本記事に記載の「CloudFormationテンプレートを用いて、自動デプロイで利用するVPCを構築していきます。

前回：[[社内勉強会資料] CloudFormationで構築する自動デプロイ環境 ～ 1/6](https://qiita.com/toru-yamagishi/items/deb79c9a3f0040b6f8ad)

## CloudFormationで作成するリソース
* CloudFormationテンプレートを使って、以下のAWSリソースを作成します
    * VPC × 1
    * Public Subnet × 2
    * InternetGateway × 1
    * セキュリティグループ
        * CommonSecurityGroup：SSH(port:22)アクセス用
        * PublicSecurityGroup：HTTP(port:80)、HTTPS(port:443)アクセス用

## CloudFormationテンプレート
### network.yaml
```yaml
AWSTemplateFormatVersion: 2010-09-09
Description: network configration template

Parameters:
  ProjectEnvironment:
    Type: String
    Default: 'usecase-auto-deploy'
  PrimaryAZ:
    Type: AWS::EC2::AvailabilityZone::Name
    MinLength: 1
    Default: ap-northeast-1a
  SecondaryAZ:
    Type: AWS::EC2::AvailabilityZone::Name
    MinLength: 1
    Default: ap-northeast-1c
  VPCCidr:
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 10.0.0.0/16
    AllowedPattern: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(?:3[0-2]|[12][0-9]|[0-9])$
  App1Cidr:
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 10.0.100.0/24
    AllowedPattern: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(?:3[0-2]|[12][0-9]|[0-9])$
    Description: on Primary AZ
  App2Cidr:
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 10.0.101.0/24
    AllowedPattern: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(?:3[0-2]|[12][0-9]|[0-9])$
    Description: on Secondary AZ
  AllowSSH:
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 123.50.201.40/29
    AllowedPattern: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(?:3[0-2]|[12][0-9]|[0-9])$

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCidr
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default
      Tags:
        - { Key: Name, Value: !Sub "${ProjectEnvironment}-vpc" }
  App1Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref App1Cidr
      AvailabilityZone: !Ref PrimaryAZ
      Tags:
        - { Key: Name, Value: !Sub "${ProjectEnvironment}-app-1" }
  App2Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref App2Cidr
      AvailabilityZone: !Ref SecondaryAZ
      Tags:
        - { Key: Name, Value: !Sub "${ProjectEnvironment}-app-2" }
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - { Key: Name, Value: !Sub "${ProjectEnvironment}-internet-gateway" }
  AttachInternetGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - { Key: Name, Value: !Sub "${ProjectEnvironment}-public" }
  PublicRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  AssociateApp1Subnet:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref App1Subnet
  AssociateApp2Subnet:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref App2Subnet
  CommonSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VPC
      GroupName: !Sub "${ProjectEnvironment}-common-sg"
      GroupDescription: Allow All in VPC
      SecurityGroupIngress:
        - { IpProtocol: -1, CidrIp: !Ref VPCCidr }
        - { IpProtocol: tcp, FromPort: 22, ToPort: 22, CidrIp: !Ref AllowSSH }
      Tags:
        - { Key: Name, Value: !Sub "${ProjectEnvironment}-common" }
  PublicSecurityGroup:
      Type: AWS::EC2::SecurityGroup
      Properties:
        VpcId: !Ref VPC
        GroupName: !Sub "${ProjectEnvironment}-public-sg"
        GroupDescription: Allow http(s)
        SecurityGroupIngress:
          - { IpProtocol: tcp, FromPort: 443, ToPort: 443, CidrIp: 0.0.0.0/0 }
          - { IpProtocol: tcp, FromPort: 80, ToPort: 80, CidrIp: 0.0.0.0/0 }
        Tags:
          - { Key: Name, Value: !Sub "${ProjectEnvironment}-public-sg" }

Outputs:
  VPCARN:
    Value: !Ref VPC
    Export:
      Name: !Sub "${ProjectEnvironment}-vpc"
  VPCCIDR:
    Value: !Ref VPCCidr
    Export:
      Name: !Sub "${ProjectEnvironment}-vpc-cidr"
  ALBSubnetId1:
    Value: !Ref App1Subnet
    Export:
      Name: !Sub "${ProjectEnvironment}-ALBSubnetId1"
  ALBSubnetId2:
    Value: !Ref App2Subnet
    Export:
      Name: !Sub "${ProjectEnvironment}-ALBSubnetId2"
  ECSSubnetId1:
    Value: !Ref App1Subnet
    Export:
      Name: !Sub "${ProjectEnvironment}-ECSSubnetId1"
  ECSSubnetId2:
    Value: !Ref App2Subnet
    Export:
      Name: !Sub "${ProjectEnvironment}-ECSSubnetId2"
  ECSSecurityGroupId:
    Value: !Ref CommonSecurityGroup
    Export:
      Name: !Sub "${ProjectEnvironment}-ECSSecurityGroupId"
  ALBSecurityGroupId:
    Value: !Ref PublicSecurityGroup
    Export:
      Name: !Sub "${ProjectEnvironment}-ALBSecurityGroupId"
```

## CloudFormationの実行
1. AWSコンソールにログインし、「CloudFormation」の画面に移動する
1. 「CloudFormation」の画面で「スタックの作成」を実行する
![capture1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481148/8fb06b11-94a3-3ad9-42b1-fc96da7d2a64.png)
1. VPC構築用のCloudFormationテンプレートをアップロードする
![capture2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481148/80688996-8cf6-d6d3-c2c4-b5e8feafb4cc.png)
3-1. テンプレートの準備：「テンプレートの準備完了」
3-2. テンプレートの指定：「テンプレートファイルのアップロード」
3-3. テンプレートファイルのアップロード：「ファイルの選択」でCloudFormationテンプレートファイルを選択する
3-4. 「次へ」を選択する
1. スタックの詳細を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481148/196f4cc4-bcf3-ca54-6af5-daa18820d222.png)
4-1. 「スタックの名前」には `usecase-auto-deploy-network` を設定してください
4-2. 画面の一番下まで移動して「次へ」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481148/c4df1c0c-59cf-2a54-d809-6374c5ed00b4.png)
1. スタックのオプション
5-1. スタックのオプションは変更せず、そのまま「スタックの作成」を選択してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481148/0a9a053d-66ce-513d-4cdb-ad36285d81d5.png)
1. CloudFormationスタックの実行
6-1. 「スタックの作成」まで実行されると、スタックの一覧に作成したCloudFormationスタックの進捗状況が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481148/a289bc65-50db-555d-1703-60c522184263.png)
6-2. スタックの作成が成功すると、「CREATE_COMPLETE」のステータスになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481148/d74f0fda-3df2-a434-ca26-2cc09dd24c6b.png)
6-3. スタックの「リソース」タブから作成されたリソースの内容を確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481148/ff5da1b0-c8de-d133-b2cf-9d77b7142624.png)


連載の第2回となる今回はここまで。

次回第3回は、自動デプロイのデプロイ先となるECSとECRを構築していきます。

次回：[[社内勉強会資料] CloudFormationで構築する自動デプロイ環境 ～ 3/6](https://qiita.com/toru-yamagishi/items/c9a2d877a5de553a4c4f)