CloudFormation으로 VPC, Subnet, InternetGateway, RouteTable 생성해 보기

CloudFormation으로 Network를 생성해 보는 과정을 정리해 봤습니다.
2022.02.02

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 CloudFormation으로 Network를 생성해 보는 과정을 정리해 봤습니다.

파라미터 설정

AWSTemplateFormatVersion: "2010-09-09"
Description: VPC Network set
Metadata: 
  "AWS::CloudFormation::Interface": 
    ParameterGroups: 
      - Label: 
          default: "Network Configuration"
        Parameters: 
          - VPCCIDR
          - PublicSubnetACIDR
          - PublicSubnetCCIDR
          - PrivateSubnetACIDR
          - PrivateSubnetCCIDR
    ParameterLabels: 
      VPCCIDR: 
        default: "VPC CIDR"
      PublicSubnetACIDR: 
        default: "PublicSubnetA CIDR"
      PublicSubnetCCIDR: 
        default: "PublicSubnetC CIDR"
      PrivateSubnetACIDR: 
        default: "PrivateSubnetA CIDR"
      PrivateSubnetCCIDR: 
        default: "PrivateSubnetC CIDR"
#-------------------------------------------------------------------
#Input VPC, Subnet Parameters
#-------------------------------------------------------------------
Parameters:
  VPCCIDR:
    Type: String
    Default: "10.0.0.0/16"

  PublicSubnetACIDR:
    Type: String
    Default: "10.0.0.0/18"

  PublicSubnetCCIDR:
    Type: String
    Default: "10.0.64.0/18"

  PrivateSubnetACIDR:
    Type: String
    Default: "10.0.128.0/18"

  PrivateSubnetCCIDR:
    Type: String
    Default: "10.0.192.0/18"

먼저 Metadata를 통해서 하나의 파라미터 그룹과 레이블을 만들어줍니다. 파라미터 그룹에는 하나의 VPC와 4개의 서브넷이 포함되어 있습니다. 이어서 파라미터 레이블을 통해 AWS CloudFormation에서 파라미터를 입력할 때 나타나는 값들을 설정합니다.

CloudFormation에서 확인해 보면, 파라미터 레이블에서 설정했던 값들이 위 이미지와 같이 나오는것을 확인할 수 있습니다. 이어서「Parameters」를 통해서 변수명과 타입, 디폴트 값을 적어주는데, 여기서 디폴트 값은 위 이미지처럼 디폴트로 입력 되는 값들을 타나냅니다.

VPC, Subnet, InternetGateway 생성

#-------------------------------------------------------------------
#Set VPC, InternetGateway, Subnet
#-------------------------------------------------------------------
Resources:
  VPC: 
    Type: "AWS::EC2::VPC"
    Properties: 
      CidrBlock: !Ref VPCCIDR
      EnableDnsSupport: "true"
      EnableDnsHostnames: "true"
      InstanceTenancy: default
      Tags: 
        - Key: Name
          Value: !Sub "test-vpc"

이어서「Resources」를 통해서 VPC, Subnet, InternetGateway를 생성합니다.「CidrBlock: !Ref VPCCIDR」를 통해서 파라미터에서 입력한 VPC Cidr를 해당 VPC에 적용합니다. VPC에 대한 자세한 내용은 아래 링크를 참고해 주세요.

 InternetGateway: 
    Type: "AWS::EC2::InternetGateway"
    Properties: 
      Tags: 
        - Key: Name
          Value: !Sub "test-igw"
  InternetGatewayAttachment: 
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties: 
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC

이어서 InternetGateway도 생성합니다. AWS::EC2::VPCGatewayAttachment를 통해서 InternetGateway를 VPC에 연결합니다.

  PublicSubnetA: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "ap-northeast-2a"
      CidrBlock: !Ref PublicSubnetACIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "test-front-subnet-1a"
  PublicSubnetC: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "ap-northeast-2c"
      CidrBlock: !Ref PublicSubnetCCIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "test-front-subnet-1c"
  PrivateSubnetA: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "ap-northeast-2a"
      CidrBlock: !Ref PrivateSubnetACIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "test-application-subnet-1a"
  PrivateSubnetC: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "ap-northeast-2c"
      CidrBlock: !Ref PrivateSubnetCCIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "test-application-subnet-1c"

그리고 각각의 서브넷들을 생성합니다.

#-------------------------------------------------------------------
#Route Tables
#-------------------------------------------------------------------
  FRONTRTB : 
    Type: "AWS::EC2::RouteTable"
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "test-front-rtb"
  APPRTB1A: 
    Type: "AWS::EC2::RouteTable"
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "test-application-rtb-1a"
  APPRTB1C: 
    Type: "AWS::EC2::RouteTable"
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "test-application-rtb-1c"
  FRONTRTBroute: 
    Type: "AWS::EC2::Route"
    Properties: 
      RouteTableId: !Ref FRONTRTB
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref InternetGateway

이어서 라우팅 테이블을 만들고, FRONTRTBroute 라우팅 테이블에는 인터넷 게이트웨이를 연결합니다.

라우팅 테이블에 서브넷 연결

#-------------------------------------------------------------------
#Route Tables Subnet Association
#-------------------------------------------------------------------
  FRONTRTBAssociation: 
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties: 
      SubnetId: !Ref PublicSubnetA
      RouteTableId: !Ref FRONTRTB
  FRONTRTB2Association: 
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties: 
      SubnetId: !Ref PublicSubnetC
      RouteTableId: !Ref FRONTRTB
  APPRTB1AAssociation: 
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties: 
      SubnetId: !Ref PrivateSubnetA
      RouteTableId: !Ref APPRTB1A
  APPRTB1CAssociation: 
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties: 
      SubnetId: !Ref PrivateSubnetC
      RouteTableId: !Ref APPRTB1C

이제 각각의 라우팅 테이블에 서브넷을 연결합니다.

결과 확인

이제 CloudFormation에서 생성을 해보면 문제 없이 Complete되는 것을 확인할 수 있습니다.

VPC에 들어가서 확인해 보면 VPC와 서브넷 등이 정상적으로 생성 된 것을 확인할 수 있습니다.

참고