CloudFormationで3層アーキテクチャ用VPCを作る[③VPCコンポーネント編]

前回に引き続き、今回もVPC周り。
以下のVPCコンポーネントまとめて作って、VPCへアタッチしていく。
– InternetGateway
– NatGatway
– ルートテーブル(メイン/カスタム)
– NWACL

※長くなったので、ルートテーブル/ACLはひとまず空のままにする。。

Contents

VPCコンポーネント設計

InternetGateway

作ってVPCアタッチするだけだけど、一応Name付けて情報整理しとく。

Name(logical-id) アタッチするVPC
igwmainVPC mainVPC

NatGateway

NatGatewayでは、配置するサブネット、EIPの設定も一緒に指定する。

今回EIPはAWSから払い出されるものを指定するだけなんだけれど、設定項目として整理しとく。
EIPは任意のものを取得し、それをNatGatewayに割り当てるように記述する。

Name(logical-id) 配置サブネット EIP
ngwmainVPC pubWEB1 AWSから払い出し

ルートテーブル

デフォルトのルートテーブルはCloudFormationでは扱えないらしいので未使用にする。
プライベートサブネット用、パブリックサブネット用のルートテーブルをカスタムで新規作成して、 各サブネットに明示的にアタッチする。
プライベートサブネット用テーブルはNatGatewayをデフォルトの通信先。
パブリックサブネット用テーブルはInternetGateWayをデフォルトの通信先にする。

種別 Name(logical-id) 種別 サブネットの関連付け デフォルト通信先
カスタム rtprv prv prvAP1,prvAP2,prvDB1,prvDB2 igwmainVPC
カスタム rtpub pub pubWEB1,pubWEB2 ngwmainVPC

NW ACL

ありがたーいことにAWS公式でNWACLのベストプラクティスがある。
基本的なところは参考にしつつ、今回の要件に沿うように設計する。
ルールの中身はVPC内に配置するリソースに応じて定義するとして、まずは各箇所で使うACLを定義。
デフォルトのNWACLはCloudFormationでの触り方が分からなかったので扱わないことにしておき、 カスタムのNWACLを各層ごとに定義しておく。

VPC セキュリティのベストプラクティス: マルチ AZ、セキュリティグループ、ACL、IAM、フローログ、Network Access Analyzer、Firewall、GuardDuty を使用します。
種別 Name アタッチ対象 制御
default vpcdefault mainVPC デフォルト(全通信許可)
custom naclpubWEB pubWEB1/2 ※次回検討
custom naclprvAP prvAP1/2 ※次回検討
custom aclprvDB prvDB1/2 ※次回検討

CloudFormationテンプレート

完成したテンプレートはこちら。

AWSTemplateFormatVersion: 2010-09-09
Description: "CloudFormation VPCtest"
Mappings:
  TagsMap:
    EnvName:
      Name: "VPCtest"
  VPCCiderMap:
    mainVPC:
      CidrBlock: "172.16.0.0/18"
  SubnetMap:
    pubWEB1:
      CidrBlock: "172.16.10.0/24"
    pubWEB2:
      CidrBlock: "172.16.11.0/24"
    prvAP1:
      CidrBlock: "172.16.20.0/24"
    prvAP2:
      CidrBlock: "172.16.21.0/24"
    prvDB1:
      CidrBlock: "172.16.30.0/24"
    prvDB2:
      CidrBlock: "172.16.31.0/24"

Resources:
# VPC
  mainVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !FindInMap
        - VPCCiderMap
        - mainVPC
        - CidrBlock
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: 'default'
      Tags:
       - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
# Subnet
  pubWEB1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref "mainVPC"
      CidrBlock: !FindInMap
        - SubnetMap
        - pubWEB1
        - CidrBlock
      AvailabilityZone: !Select
        - 0
        - !GetAZs 
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
  pubWEB2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref "mainVPC"
      CidrBlock: !FindInMap
        - SubnetMap
        - pubWEB2
        - CidrBlock
      AvailabilityZone:  !Select
        - 1
        - !GetAZs 
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
  prvAP1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref "mainVPC"
      CidrBlock: !FindInMap
        - SubnetMap
        - prvAP1
        - CidrBlock
      AvailabilityZone:  !Select
        - 0
        - !GetAZs 
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
  prvAP2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref "mainVPC"
      CidrBlock: !FindInMap
        - SubnetMap
        - prvAP2
        - CidrBlock
      AvailabilityZone:  !Select
        - 1
        - !GetAZs 
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
  prvDB1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref "mainVPC"
      CidrBlock: !FindInMap
        - SubnetMap
        - prvDB1
        - CidrBlock
      AvailabilityZone:  !Select
        - 0
        - !GetAZs 
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
  prvDB2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref "mainVPC"
      CidrBlock: !FindInMap
        - SubnetMap
        - prvDB2
        - CidrBlock
      AvailabilityZone:  !Select
        - 1
        - !GetAZs 
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
# InternetGateway
  igwmainVPC:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties: 
      VpcId: 
        Ref: mainVPC
      InternetGatewayId: 
        Ref: igwmainVPC
# NatGateway
  ngwpubWEB1:
    Type: AWS::EC2::NatGateway
    Properties: 
      AllocationId: 
        Fn::GetAtt:
         - ngwpubWEB1EIP
         - AllocationId
      SubnetId: 
        Ref: pubWEB1
      Tags: 
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name     
  ngwpubWEB1EIP:
    DependsOn: AttachGateway
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
      Tags: 
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name   
  ngwpubWEB2:
    Type: AWS::EC2::NatGateway
    Properties: 
      AllocationId: 
        Fn::GetAtt:
         - ngwpubWEB2EIP
         - AllocationId
      SubnetId: 
        Ref: pubWEB2
      Tags: 
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name     
  ngwpubWEB2EIP:
    DependsOn: AttachGateway
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
      Tags: 
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name   

  # Route Tables
  rtprv1:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:  
        Ref: mainVPC
      Tags:
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name   
  rtprv1route1:
    Type: AWS::EC2::Route
    Properties:
       RouteTableId:
         Ref: rtprv1
       DestinationCidrBlock: 0.0.0.0/0
       NatGatewayId:
         Ref: ngwpubWEB1
  rtprv2:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:  
        Ref: mainVPC
      Tags:
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name   
  rtprv2route1:
    Type: AWS::EC2::Route
    Properties:
       RouteTableId:
         Ref: rtprv2
       DestinationCidrBlock: 0.0.0.0/0
       NatGatewayId:
         Ref: ngwpubWEB2
  rtpub:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:  
        Ref: mainVPC
      Tags:
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name  
  rtpubroute1:
    Type: AWS::EC2::Route
    Properties:
       RouteTableId:
         Ref: rtpub
       DestinationCidrBlock: 0.0.0.0/0
       GatewayId:
         Ref: igwmainVPC
  # RouteTable Association       
  pubWEB1rtAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: pubWEB1
      RouteTableId:
        Ref: rtpub
  pubWEB2rtAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: pubWEB2
      RouteTableId:
        Ref: rtpub
  prbAP1rtAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: prvAP1
      RouteTableId:
        Ref: rtprv1
  prbAP2rtAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: prvAP2
      RouteTableId:
        Ref: rtprv2

#NW ACL
  naclpubWEB:
    Type: AWS::EC2::NetworkAcl
    Properties:
       VpcId:
         Ref: mainVPC
       Tags:
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
  naclprvAP:
    Type: AWS::EC2::NetworkAcl
    Properties:
       VpcId:
         Ref: mainVPC
       Tags:
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
  naclprvDB:
    Type: AWS::EC2::NetworkAcl
    Properties:
       VpcId:
         Ref: mainVPC
       Tags:
        - 
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
  pubWEB1naclAssociatoin:
     Type: AWS::EC2::SubnetNetworkAclAssociation
     Properties:
       SubnetId:
         Ref: pubWEB1
       NetworkAclId:
         Ref: naclpubWEB
  pubWEB2naclAssociatoin:
     Type: AWS::EC2::SubnetNetworkAclAssociation
     Properties:
       SubnetId:
         Ref: pubWEB2
       NetworkAclId:
         Ref: naclpubWEB
  prvAP1naclAssociatoin:
     Type: AWS::EC2::SubnetNetworkAclAssociation
     Properties:
       SubnetId:
         Ref: prvAP1
       NetworkAclId:
         Ref: naclprvAP
  prvAP2naclAssociatoin:
     Type: AWS::EC2::SubnetNetworkAclAssociation
     Properties:
       SubnetId:
         Ref: prvAP2
       NetworkAclId:
         Ref: naclprvAP
  prvDB1naclAssociatoin:
     Type: AWS::EC2::SubnetNetworkAclAssociation
     Properties:
       SubnetId:
         Ref: prvDB1
       NetworkAclId:
         Ref: naclprvDB
  prvDB2naclAssociatoin:
     Type: AWS::EC2::SubnetNetworkAclAssociation
     Properties:
       SubnetId:
         Ref: prvDB2
       NetworkAclId:
         Ref: naclprvDB

長くなってきたので一旦ここまで。。
気が向いたらスタック分割やってみる。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする