본문 바로가기
공부/IaC

[AWS CloudFormation] #1 간단 VPC 구성 (VPC, Subnet, IGW, NAT, RT)

by haejang 2021. 1. 5.
728x90
728x90

 

>>진행한 실습 GitHub

 

 

간단하게 위 그림과 같은 VPC만 구성해보도록 하고, 리소스별로 살펴보겠다

1. VPC

AWS::EC2::VPC

VPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock: 10.0.0.0/16
    EnableDnsHostnames: true
    Tags:
      - Key: Name
        Value: myVPC

VPC의 Cidr 블럭을 지정해주고, DNS 호스트 이름을 활성화 해주었다

DNS 호스트이름은 필수는 아니지만, 활성화를 해놔야 이 VPC 안에서 생성되는 인스턴스들이 DNS 호스트 이름을 갖게된다 (Default는 비활)

EnableDnsSupport는 DNS 확인인데 Default가 활성화라서 굳이 쓰지 않았다

 

2. Subnet

AWS::EC2::Subnet

PublicSubnet:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref VPC
    CidrBlock: 10.0.0.0/24
    AvailabilityZone: "ap-northeast-2a"
    MapPublicIpOnLaunch: true
    Tags:
      - Key: Name
        Value: public subnet

PrivateSubnet:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref VPC
    CidrBlock: 10.0.10.0/24
    AvailabilityZone: "ap-northeast-2c"
    Tags:
      - Key: Name
        Value: private subnet

퍼블릭 서브넷과 프라이빗 서브넷을 각각 가용영역 a와 c에 만들었다

원랜 c가 아니라 b에다 만드려고 했는데 이상하게 b, d는 안될때가 있다(그냥 마음 편히 a랑 c만 쓰자)

public ip는 퍼블릭 서브넷에서만 활성화 시켜줬다

그리고 VpcId로 위에서 만든 VPC를 연결해 줬는데, 이렇게 매개변수나 리소스 값을 반환할 땐 내장함수 Ref를 쓴다

YAML에서 Ref는 아래와 같이 2가지 방법으로 쓸 수 있다

VpcId: !Ref VPC

VpcId:
  Ref: VPC

 

3. Internet Gateway + VPC와 Attach

AWS::EC2::InternetGateway

AWS::EC2::VPCGatewayAttachment

IGW:
  Type: AWS::EC2::InternetGateway
  Properties:
    Tags:
      - Key: Name
        Value: myigw

Attachigw:
  Type: AWS::EC2::VPCGatewayAttachment
  Properties:
    InternetGatewayId: !Ref IGW
    VpcId: !Ref VPC

인터넷 게이트웨이는 간단하게 생성되지만, VPC와 연결하는걸 따로 해줘야한다

근데 연결하는것도 그냥 Ref로 VPC와 igw를 참조해주면 된다

 

4. NAT Gateway + EIP

AWS::EC2::EIP

AWS::EC2::NatGateway

EIP:
  Type: AWS::EC2::EIP

NAT:
  Type: AWS::EC2::NatGateway
  DependsOn: Attachigw
  Properties:
    AllocationId: !GetAtt EIP.AllocationId
    SubnetId: !Ref PublicSubnet

NAT 게이트웨이를 만드려면 EIP가 있어야해서 EIP를 먼저 만들어주었다

NAT 리소스 부분에 DependsOn이라는 속성이 있는데, 이는 해당 리소스가 다 만들어진 후에 생성될 수 있도록 해준다

AllocationId로 연결할 EIP를, SubnetId로 nat게이트웨이를 생성할 서브넷을 지정해주면 된다

여기서 GetAtt는 특정 리소스의 특정 속성 값을 뽑아낸다(Ref는 해당 리소스의 논리적 ID를 반환)(갖고있는 속성은 리소스별로 상이)

EIP의 주소 할당을 나타내기 위해 할당하는 ID인 AllocationId 라는 속성을 사용하면 된다

YAML에서 GetAtt를 사용하는 방법은 다음과 같다

AllocationId: !GetAtt EIP.AllocationId

AllocationId:
  Fn::GetAtt: [ EIP, AllocationId ]

AllocationId:
  Fn::GetAtt:
  - EIP
  - AllocationId

 

5. Route Table

먼저 Route Table을 만들고(AWS::EC2::RouteTable), Routing Table을 설정하고(AWS::EC2::Route), 서브넷 연결(AWS::EC2::SubnetRouteTableAssociation)까지 해줘야 한다

또한 Public과 Private 2개씩 만들어야 한다

PublicRT:
  Type: AWS::EC2::RouteTable
  Properties:
    VpcId: !Ref VPC
    Tags:
      - Key: Name
        Value: Public RT
PublicRoute:
  Type: AWS::EC2::Route
  DependsOn: Attachigw
  Properties:
    RouteTableId: !Ref PublicRT
    DestinationCidrBlock: 0.0.0.0/0
    GatewayId: !Ref IGW
PublicSubnetRTAssociation:
  Type: AWS::EC2::SubnetRouteTableAssociation
  Properties:
    RouteTableId: !Ref PublicRT
    SubnetId: !Ref PublicSubnet

PrivateRT:
  Type: AWS::EC2::RouteTable
  Properties:
    VpcId: !Ref VPC
    Tags:
      - Key: Name
        Value: Private RT
PrivateRoute:
  Type: AWS::EC2::Route
  DependsOn: Attachigw
  Properties:
    RouteTableId: !Ref PrivateRT
    DestinationCidrBlock: 0.0.0.0/0
    NatGatewayId: !Ref NAT
PrivateSubnetRTAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRT
      SubnetId: !Ref PrivateSubnet

이젠 뭐 딱히 설명할게 없다

Public은 인터넷 게이트웨이랑, Private은 NAT랑 연결해줬다

 

 

이제 다 끝났으니 CloudFormation에서 스택을 생성해보자

 

vpc.yaml
0.00MB

 

전체 파일

 

aws console > 서비스 > CloudFormation > 스택 생성

준비된 템플릿 > 템플릿 파일 업로드 > 파일 선택으로 방금 만든 yaml 파일을 선택해준다

이름 대충 설정해주고, 쭉쭉 다음 눌러서 스택을 생성해준다

 

 

리소스들이 생성되고 있는걸 확인할 수 있다

생성이 완료된 후, VPC로 들어가면 원하는 리소스들이 잘 생성된걸 확인할 수 있다

 

 

파라미터 사용하는 버전도 확인하기

728x90
728x90

댓글