✔️ 개요
- 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
'Public Cloud > AWS' 카테고리의 다른 글
[AWS] EFS(Elastic File System) 사용법 (0) | 2022.04.22 |
---|---|
[AWS] Lambda 실습 (0) | 2022.04.16 |
[AWS] AWS CloudFormation으로 웹 앱 런칭 및 관리하기 (0) | 2022.04.16 |
[AWS] AWS CLI와 SDK를 이용한 DynamoDB CRUD (0) | 2022.04.16 |
[AWS] aws-nuke를 이용해 aws 리소스 한번에 지우기 (0) | 2022.04.10 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!