간단하게 위 그림과 같은 VPC만 구성해보도록 하고, 리소스별로 살펴보겠다
1. 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
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::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
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에서 스택을 생성해보자
전체 파일
aws console > 서비스 > CloudFormation > 스택 생성
준비된 템플릿 > 템플릿 파일 업로드 > 파일 선택으로 방금 만든 yaml 파일을 선택해준다
이름 대충 설정해주고, 쭉쭉 다음 눌러서 스택을 생성해준다
리소스들이 생성되고 있는걸 확인할 수 있다
생성이 완료된 후, VPC로 들어가면 원하는 리소스들이 잘 생성된걸 확인할 수 있다
'공부 > IaC' 카테고리의 다른 글
[AWS CloudFormation] #3 웹서버용 EC2 만들기 (SG, EC2, UserData) (0) | 2021.01.05 |
---|---|
[AWS CloudFormation] #2 파라미터 사용하기 (VPC 구성) (0) | 2021.01.05 |
[AWS CloudFormation] #0 실습 전 개념 정리 (0) | 2021.01.04 |
[Ansible] Role 사용법과 변수 파일(vars) 설정, 암호화 (1) | 2020.11.11 |
[Ansible] Ansible로 Git 레포지토리 연결하기 (0) | 2020.11.08 |
댓글