Public Cloud/AWS

[AWS] CloudFormation으로 VPC 생성 및 업데이트하기

TTOII 2022. 4. 16. 16:47
728x90

✔️ 개요

  • Amazon VPC를 생성하는 AWS CloudFormation 템플릿 배포
  • 템플릿의 구성 요소 검사
  • CloudFormation 스택 업데이트

 

✔️ AWS CloudFormation을 사용해 VPC 스택 배포

템플릿을 이용해 VPC를 구축한다.

템플릿은 YAML 또는 JSON 형식을 사용할 수 있다. 

이제부터 사용하는 템플릿 형식은 YAML 형식이다. 

 

IPv4 CIDR를 10.0.0.0/16으로 설정한다. 즉 10.0.x.x 로 시작하는 모든 IP주소가 포함된다.

AWSTemplateFormatVersion: 2010-09-09
Description: Deploy a VPC

Resources:
  VPC:
    Type: AWS::EC2::VPC 
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      Tags:
      - Key: Name
        Value: Lab VPC
  • Type 파라미터 - CloudFormation에 의해 생성되는 리소스의 유형을 선언함 
  • Properties - 생성할 리소스에 대한 추가 정보를 지정
    • CidrBlock : VPC와 연결된 IP 주소 범위 
    • EnableDnsHostnames : DNS 이름을 EC2 인스턴스에 연결하도록 VPC 구성
    • Tags : 익숙한 이름을 리소스에 추가한다.

 

✔️ 인터넷 게이트웨이

인터넷 게이트웨이는 VPC의 인스턴스와 인터넷 간 통신을 허용한다. 

인터넷 게이트웨이는 VPC 라우팅 테이블에서 인터넷 라우팅 트래픽에 대한 대상을 제공하고 

퍼블릭 IPv4 주소가 할당된 인스턴스에 대해 네트워크 주소 변환(NAT)을 수행하는 두가지 용도로 사용된다.

InternetGateway:
  Type: AWS::EC2::InternetGateway
  Properties:
    Tags:
    - Key: Name
      Value: Lab Internet Gateway

인터넷 게이트웨이를 VPC와 연결해줘야 한다.

VPCGatewayAttachment는 VPC와 게이트웨이(ex. 인터넷 게이트웨이)의 관계를 생성한다.

AttachGateway:
  Type: AWS::EC2::VPCGatewayAttachment
  Properties:
    VpcId: !Ref VPC
    InternetGatewayId: !Ref InternetGateway

템플릿에서 다른 템플릿의 다른 요소를 참조할 때는 !Ref 키워드를 사용하고 그 뒤에 다른 리소스의 이름이 온다.

이름만 참조하여 서로 연결되는 리소스를 쉽게 구축할 수 있다.

 

 

✔️ 서브넷

퍼블릿 서브넷 1과 프라이빗 서브넷 1을 생성한다. 

  • Public Subnet : IGW를 통해 인터넷에 연결되며 공개적으로 액세스 할 수 있어야 하는 리소스에서 사용
  • Private Subnet : 인터넷에 연결되어 있지 않으며 이 서브넷의 모든 리소스는 인터넷에서 연결할 수 없다. 보안 강화
PublicSubnet1:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref VPC
    CidrBlock: 10.0.0.0/24
    AvailabilityZone: !Select 
      - '0'
      - !GetAZs ''
    Tags:
      - Key: Name
        Value: Public Subnet 1

PrivateSubnet1:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref VPC
    CidrBlock: 10.0.1.0/24
    AvailabilityZone: !Select 
      - '0'
      - !GetAZs ''
    Tags:
      - Key: Name
        Value: Private Subnet 1
  • Vpcld : 서브넷이 보함된 VPC를 나타냄
  • CidrBlock : 서브넷에 할당된 IP 주소 범위
  • AvailabilityZone : 서브넷을 포함해야 하는 리전 내의 물리적 위치를 정의함

가용 영역은 !Select 라는 함수와 !GetAZs 라는 함수를 사용한다.

이 코드는 리전 내의 가용 영역 목록을 검색하며 목록의 첫번째 요소를 참조한다. 

이렇게 하면 가용 영역을 템플릿에 하드 코딩하지 않아도 템플릿이 런타임 시 가용 영역 목록을 검색하므로 

모든 리전에서 템플릿을 사용할 수 있다.  (템플릿의 재사용성이 높아진다.)

 

 

✔️ 라우팅 테이블 

라우팅 테이블은 서브넷 안팎으로 트래픽 방향을 정하는(즉, 라우팅)데 사용된다.

 

라우팅 테이블 구성

  • VPC 내 트래픽(10.0.0.0/16은 로컬로 라우팅
  • 인터넷으로 가는 트래픽(0.0.0.0/0)은 IGW로 라우팅

퍼블릭 라우팅 테이블

PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: Public Route Table

퍼블릭 라우팅 테이블에서 인터넷으로의 경로를 정의한 코드 

 PublicRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

프라이빗 라우팅 테이블

PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
      - Key: Name
        Value: Private Route Table

 

경로의 구성

  • RouteTableId : 경로를 소유하는 라우팅 테이블
  • DestinationCidrBlock : 라우팅 테이블의 IP 주소 정의 (0.0.0.0/0은 인터넷으로 가는 트래픽이다.)
  • GateWayId : 트래픽을 라우팅할 위치

PublicSubnetRouteTableAssociation1은 PublicRoutingTable과 Public Subnet1이 연결되어 있음을 나타낸다.

라우팅 테이블은 여러 서브넷과 연결될 수 있으며 각 연결에는 명시적 연결이 필요하다.

PublicSubnetRouteTableAssociation1:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet1
      RouteTableId: !Ref PublicRouteTable

PrivateSubnetRouteTableAssociation1은 PrivateRoutingTable과 private Subnet1이 연결되어 있음을 나타낸다.

PrivateSubnetRouteTableAssociation1:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet1
      RouteTableId: !Ref PrivateRouteTable

Ouputs 구성 코드

  • VPC는 생성된 VPC의 ID 
  • AZ1은 서브넷이 생성된 가용 영역을 보여준다.
Outputs:
  VPC:
    Description: VPC
    Value: !Ref VPC
  AZ1:
    Description: Availability Zone 1
    Value: !GetAtt 
      - PublicSubnet1
      - AvailabilityZone

 

VPC 출력은 단순히 VPC에 대한 참조이며 그 결과 VPC ID가 표시된다.

AZ1 출력은 !GetAtt 함수를 사용해 리소스의 속성을 검사한다. 이 경우 퍼블릭 서브넷 1에서 AvailabilityZone 속성을 검색한다. 

 

 

✔️ 스택 업데이트

CloudFormation 스택이 배포된 후에는 리소스를 직접 수정하는 대신 CloudFormation을 통해 리소스를 변경하는 것이 좋다. 

리소스를 정의하는 새 CloudFormation 템플릿을 사용해 스택을 업데이트한다.

 

앞선 예제에서 다른 가용 영역에 Public Subnet과 Private Subnet을 추가한다. 

추가된 내용은 다음과 같다.

PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select 
        - '1'
        - !GetAZs ''
      Tags:
        - Key: Name
          Value: Public Subnet 2

PrivateSubnet2:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref VPC
    CidrBlock: 10.0.3.0/24
    AvailabilityZone: !Select 
      - '1'
      - !GetAZs ''
    Tags:
      - Key: Name
        Value: Private Subnet 2
          
PublicSubnetRouteTableAssociation2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet2
      RouteTableId: !Ref PublicRouteTable
      
 rivateSubnetRouteTableAssociation2:
   Type: AWS::EC2::SubnetRouteTableAssociation
   Properties:
     SubnetId: !Ref PrivateSubnet2
     RouteTableId: !Ref PrivateRouteTable
      
AZ2:
    Description: Availability Zone 2
    Value: !GetAtt
      - PublicSubnet2
      - AvailabilityZone
728x90