AWS CloudFormationテンプレートのススメ#2 VPC編


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

CloudFormationテンプレートに興味を持ち、最近構築したものをテンプレートを使って再現できるか試してみました。

 

CloudFormationテンプレートはスタック結果が同じでも、テンプレート作成者によってパラメータや出力が違いますよね。

 

第2回は、オーソドックスなVPC・サブネットのテンプレートを紹介します。

 

 

CloudFormationテンプレートでVPCを構築

■前提

CloudFormationのスタックを作成する前に、以下が前提条件ですのでご確認ください。

 

  • 特にありません

 

 

■構築図

 

今回の構築図は上の画像です。

 

 

■CloudFormationテンプレート

今回のテンプレートを使用すると、VPC、パブリックサブネット2つ、プライベートサブネット2つ、インターネットゲートウェイ、ルートテーブル3つができるテンプレートです。

 

AWSTemplateFormatVersion: "2010-09-09"

Description:
  Create VPC,Subnet,IGW,and RouteTable

Parameters:
  myVPCCIDR:
    Type: String
    Default: 10.0.0.0/16

  myPublicSubnet1CIDR:
    Type: String
    Default: 10.0.1.0/24

  myPublicSubnet2CIDR:
    Type: String
    Default: 10.0.3.0/24

  myPrivateSubnet1CIDR:
    Type: String
    Default: 10.0.2.0/24

  myPrivateSubnet2CIDR:
    Type: String
    Default: 10.0.4.0/24

Resources:
  myVPC: 
    Type: AWS::EC2::VPC
    Properties: 
      CidrBlock: !Ref myVPCCIDR
      EnableDnsHostnames: 'true'
      EnableDnsSupport: 'true'
      InstanceTenancy: default
      Tags: 
        - Key: Name
          Value: !Sub ${AWS::StackName}-vpc

  myInternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-IGW

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
         Ref: myVPC
      InternetGatewayId:
         Ref: myInternetGateway

  myPublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: myVPC
      CidrBlock: !Ref myPublicSubnet1CIDR
      AvailabilityZone: !Select 
        - 0
        - Fn::GetAZs: !Ref 'AWS::Region'
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-subnet-public1

  myPublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: myVPC
      CidrBlock: !Ref myPublicSubnet2CIDR
      AvailabilityZone: !Select 
        - 1
        - Fn::GetAZs: !Ref 'AWS::Region'
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-subnet-public2

  myPrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: myVPC
      CidrBlock: !Ref myPrivateSubnet1CIDR
      AvailabilityZone: !Select 
        - 0
        - Fn::GetAZs: !Ref 'AWS::Region'
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-subnet-private1

  myPrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: myVPC
      CidrBlock: !Ref myPrivateSubnet2CIDR
      AvailabilityZone: !Select 
        - 1
        - Fn::GetAZs: !Ref 'AWS::Region'
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-subnet-private2

  myPublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:  
        Ref: myVPC
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-rtb-public

  myPrivateRouteTable1:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:  
        Ref: myVPC
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-rtb-private1

  myPrivateRouteTable2:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:  
        Ref: myVPC
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-rtb-private2

  myPublicRoute:
    Type: AWS::EC2::Route
    Properties:
       RouteTableId:
         Ref: myPublicRouteTable
       DestinationCidrBlock: 0.0.0.0/0
       GatewayId:
         Ref: myInternetGateway

  myPublicSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: myPublicSubnet1
      RouteTableId:
        Ref: myPublicRouteTable

  myPublicSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: myPublicSubnet2
      RouteTableId:
        Ref: myPublicRouteTable

  myPrivateSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: myPrivateSubnet1
      RouteTableId:
        Ref: myPrivateRouteTable1

  myPrivateSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: myPrivateSubnet2
      RouteTableId:
        Ref: myPrivateRouteTable2

Outputs:
  myVPC:
    Value: !Ref myVPC
    Export:
      Name: !Sub ${AWS::StackName}-vpc

  myVPCCIDR:
    Value: !Ref myVPCCIDR
    Export:
      Name: !Sub ${AWS::StackName}-vpc-cidr

  myPublicSubnet1:
    Value: !Ref myPublicSubnet1
    Export:
      Name: !Sub ${AWS::StackName}-subnet-public1

  myPublicSubnet1CIDR:
    Value: !Ref myPublicSubnet1CIDR
    Export:
      Name: !Sub ${AWS::StackName}-subnet-public1-cidr

  myPublicSubnet2:
    Value: !Ref myPublicSubnet2
    Export:
      Name: !Sub ${AWS::StackName}-subnet-public2

  myPublicSubnet2CIDR:
    Value: !Ref myPublicSubnet2CIDR
    Export:
      Name: !Sub ${AWS::StackName}-subnet-public2-cidr

  myPrivateSubnet1:
    Value: !Ref myPrivateSubnet1
    Export:
      Name: !Sub ${AWS::StackName}-subnet-private1

  myPrivateSubnet1CIDR:
    Value: !Ref myPrivateSubnet1CIDR
    Export:
      Name: !Sub ${AWS::StackName}-subnet-private1-cidr

  myPrivateSubnet2:
    Value: !Ref myPrivateSubnet2
    Export:
      Name: !Sub ${AWS::StackName}-subnet-private2

  myPrivateSubnet2CIDR:
    Value: !Ref myPrivateSubnet2CIDR
    Export:
      Name: !Sub ${AWS::StackName}-subnet-private2-cidr

  myPublicRouteTable:
    Value: !Ref myPublicRouteTable
    Export:
      Name: !Sub ${AWS::StackName}-rtb-public

  myPrivateRouteTable1:
    Value: !Ref myPrivateRouteTable1
    Export:
      Name: !Sub ${AWS::StackName}-rtb-private1

  myPrivateRouteTable2:
    Value: !Ref myPrivateRouteTable2
    Export:
      Name: !Sub ${AWS::StackName}-rtb-private2

 

 

■結果

今回のテンプレートを利用してスタックを作成してみます。

 

テンプレートの汎用性を高めるため、CIDRをパラメータとして入力できるようにしてあります。

 

また、マネージメントコンソールでVPCを作った時の結果に近くなるように、ルートテーブルの作成数やサブネットの関連付けにこだわりました

 

 

スタック作成画面でCIDRが入力できます。デフォルトでは、VPCCIDR: 10.0.0.0/16、各サブネット: 10.0.1.0/24、10.0.2.0/24、10.0.3.0/24、10.0.4.0/24を割り当てています。

 

saitou-cfn-vpc

 

↓他の設定は特にないので、「スタック作成」をクリックしてください。数分で作成が完了するはずです。

 

saitou-cfn-vpc

 

↓出力は各サービスのIDと、入力したCIDRです。

 

saitou-cfn-vpc

 

 

今回は以上です。

 

 

まとめ:AWS CloudFormationテンプレートのススメ#2 VPC編

CloudFormationのテンプレートを自在に作れるようになりたいと思い、現在関わっているプロジェクトの構築をテンプレート化してみました。

 

VPCとサブネットはマネージメントコンソールで簡単に作れますよね。しかし、テンプレートを書くことで、各リソースの細かいプロパティやリソース同士の関連性を確認することができました。

 

作成したテンプレートは公式ドキュメントを見ながら独自に書いたものです。こんな風にしたほうがいいよ、というのがありましたらどんどんご連絡ください!

 

 

参考リンク:AWS公式ドキュメント
 

 

↓ほかの協栄情報メンバーもAWS CloudFormationに関する記事を公開しています。ぜひ参考にしてみてください。

 

■CloudFormation作成を効率化するValidate Template機能について(INAMURA)
https://cloud5.jp/cfn-validatetemplate-function/

 

■CloudFormationでRDS(Aurora PostgreSQL リージョン別クラスター)を構築する(小林 剛)
https://cloud5.jp/create-rds-aurora-postgresql-region-by-cfn/

 

■CloudFormationによる【S3】の構築(umemoto)
https://cloud5.jp/cf-s3/

Last modified: 2023-01-14

Author