[Hand-on-labs] Creating an Amazon Virtual Private Cloud (VPC) with AWS CloudFormation
[AWS CloudFormation]
- AWS CloudFormation의 샘플 템플릿을 사용
- 애플리케이션을 실행하는 데 필요한 AWS 리소스 및 관련 종속성 또는 런타임 매개 변수를 설명하는 템플릿을 직접 만들 수 있다.
- AWS Management Console, AWS Command Line interface 또는 API를 사용하여 템플릿 및 관련 자원 콜렉션 (스택)을 배치하고 업데이트할 수 있다.
[Amazon Virtual Private Cloud(VPC)]
- Amazon VPC(Virtual Private Cloud)를 사용하면 가상 네트워크 내에서 리소스를 시작할 수 있는 AWS 클라우드의 논리적으로 격리 된 섹션을 프로비저닝 할 수 있다.
- 자체 IP 주소 범위 선택, 서브넷 작성 및 라우트 테이블 및 네트워크 게이트웨이 구성을 포함하여 가상 네트워킹 환경을 제어할 수 있다.
- 가상 사설망의 네트워크 구성을 사용자 정의 방법으로 설정할 수 있다.
- 웹 서버에 대해 public-facing subnet을 만들어 데이터베이스 또는 어플리케이션같은 백엔드 시스템을 인터넷 엑세스없이 private-facing subnet에 배치할 수 있다.
- Security Group 및 Network Access Control lists을 비롯한 여러 계층의 보안을 활용하여 각 서브넷의 Amazon EC2 인스턴스에 대한 액세스를 제어할 수 있다.
[Task 1: Deploy a Stack using AWS CloudFormation]
- CloudFormation 템플릿(vpc-1.yaml)을 이용하여 Stack을 생성한다.
[Task 2: Examine the VPC]
작성된 템플릿으로 생성된 VPC resource를 검사
- Amazon VPC
- Internet Gateway
- Two Subnets
- Two Route Tables
*이러한 리소스는 모두 하나의 Availability Zone 내에 있다.
*Availability Zone은 Region 내에 독립된 위치에 있으며 하나 이상의 Data center로 구성된다.
VPC를 만든 CloudFormation 템플릿 코드
- CidrBlock: VPC와 관련된 IP 주소 범위
- EnableDnsHostnames: DNS 이름을 Amazon EC2 인스턴스와 연결하도록 VPC를 구성
- Tags: Resources와 관련된 이름을 추가
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
[Select Internet Gateway]
- Internet Gateway는 사용자의 VPC와 인터넷의 인스턴스 간의 통신을 가능하게 하는 수평 확장, 중복, 고가용성 VPC 구성 요소이다.
- 따라서 네트워크 트래픽에 가용성 위험이나 대역폭 제약을 부과하지 않는다.
- Internet Gateway는 인터넷 라우팅 트래픽에 대한 VPC 경로 테이블에 대상을 제공
- 공용 IPv4 주소가 할당된 인스턴스에 대해 NAT(Network Tanslate)를 수행하는 두 가지 용도로 사용된다.
Internet Gateway를 만든 CloudFormation 템플릿 코드
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: Lab Internet Gateway
관리 콘솔에서 Internet Gateway가 VPC에 연결되어 있음을 보여주는 CloudFormation Template Code
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
[Select Subnet]
- Public Subnet
- 인터넷 게이트웨이를 통해 인터넷에 연결되며 공개적으로 액세스 할 수 있어야 하는 리소스에서 사용할 수 있다.
- Private Subnet
- 인터넷에 연결되어 있지 않다.
- 이 서브넷의 모든 리소스는 인터넷을 통해 접근할 수 없으므로 이러한 리소스 주위에 추가적인 보안을 제공한다.
- 서브넷을 생성한 CloudFormation 템플릿 코드
- Vpcid: 서브넷을 포함하는 VPC를 나타낸다.
- CidrBlock: 서브넷에 할당 된 IP 주소의 범위
- Availability Zone: Region 내에 물리적인 위치가 서브넷을 포함해야하는지 정의
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
* Availability Zone은 ! Select라는 함수와 !GetAZs 라는 함수를 사용한다.
* 이 코드는 영역 내의 AZ 목록을 검색하고 목록에서 첫 번째 요소를 참조한다.
* 이 방법으로 템플릿은 가용성 영역을 템플릿에 하드 코딩하지 않고 런타임에 가용성 영역 목록을 검색하기 때문에 모든 영역에서 사용할 수 있다.
[Route Table]
- 라우팅 테이블은 트래픽을 서브넷 안밖으로 유도하는 데 사용된다.
- VPC(10.0.0,0/16) 내의 트래픽의 경우 트래픽을 로컬로 라우팅한다.
- 인터넷으로 가는 트래픽 (0.0.0.0/0)의 경우 트래픽을 인터넷 게이트웨이(IGW)로 라우팅한다.
- Public Route Table을 생성한 CloudFormation 템플릿 코드
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: Public Route Table
* Private Route Table에도 비슷한 코드가 있다.
- Private Route Table 내에서 인터넷에 대한 경로를 정의한 코드
- RouteTableId: 경로를 소유한 RouteTable을 나타낸다.
- DestivationCidrBlock: 라우팅 규칙의 IP 주소 범위를 정의, 0.0.0.0/0은 인터넷에 연결된 트래픽을 나타낸다.
- GatewayId는 트래픽을 라우팅 할 위치를 정의, 이 경우 이전에 정의된 Internet Gateway이다.
PublicRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
* 현재 Route는 Public Route Table을 위해서 설정되어있다.
[Select Subnet Connect]
- Public Route Table이 Public Subnet 1과 연결되어 있음을 보여준다.
- Route Table은 여러 개의 서브넷과 연관 될 수 있으며 각 연결에는 명시적 연결이 필요하다.
PublicSubnetRouteTableAssociation1:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref PublicRouteTable
* Public Subnet1은 Public Route Table과 연결되어 있음을 선언한다.
[CloudFormation]
- 새로운 CloudFormation 템플릿으로 스택을 업데이트
* 두개의 Route Table Associations가 추가되어 해당 서브넷을 해당 Route Tabl과 연결함을 확인
- 출력 탭을 클릭
* 원래 가용성 영역과 다른 값을 가진 추가 가용성 영역이 표시 됨을 확인
[VPC]
- 서브넷 클릭하여 네 개의 서브넷이 표시됨을 확인
- 각각 클릭하여 Route Table 탭에서 설정을 검토
* VPC 는 고 가용성 응용 프로그램을 지원하도록 업데이트
[Task 4: Viewing a Stack in CloudFormation Designer]
- CloudFormation -> Lab Stack 클릭 -> template 탭 클릭
- Designer에서 보기 클릭
{
"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"
}
]
}
},
"InternetGateway": {
"Type": "AWS::EC2::InternetGateway",
"Properties": {
"Tags": [
{
"Key": "Name",
"Value": "Lab Internet Gateway"
}
]
}
},
"AttachGateway": {
"Type": "AWS::EC2::VPCGatewayAttachment",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"InternetGatewayId": {
"Ref": "InternetGateway"
}
}
},
"PublicSubnet1": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"CidrBlock": "10.0.0.0/24",
"AvailabilityZone": {
"Fn::Select": [
"0",
{
"Fn::GetAZs": ""
}
]
},
"Tags": [
{
"Key": "Name",
"Value": "Public Subnet 1"
}
]
}
},
"PrivateSubnet1": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"CidrBlock": "10.0.1.0/24",
"AvailabilityZone": {
"Fn::Select": [
"0",
{
"Fn::GetAZs": ""
}
]
},
"Tags": [
{
"Key": "Name",
"Value": "Private Subnet 1"
}
]
}
},
"PublicSubnet2": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"CidrBlock": "10.0.2.0/24",
"AvailabilityZone": {
"Fn::Select": [
"1",
{
"Fn::GetAZs": ""
}
]
},
"Tags": [
{
"Key": "Name",
"Value": "Public Subnet 2"
}
]
}
},
"PrivateSubnet2": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"CidrBlock": "10.0.3.0/24",
"AvailabilityZone": {
"Fn::Select": [
"1",
{
"Fn::GetAZs": ""
}
]
},
"Tags": [
{
"Key": "Name",
"Value": "Private Subnet 2"
}
]
}
},
"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"
}
}
},
"PublicSubnetRouteTableAssociation1": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PublicSubnet1"
},
"RouteTableId": {
"Ref": "PublicRouteTable"
}
}
},
"PublicSubnetRouteTableAssociation2": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PublicSubnet2"
},
"RouteTableId": {
"Ref": "PublicRouteTable"
}
}
},
"PrivateRouteTable": {
"Type": "AWS::EC2::RouteTable",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"Tags": [
{
"Key": "Name",
"Value": "Private Route Table"
}
]
}
},
"PrivateSubnetRouteTableAssociation1": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PrivateSubnet1"
},
"RouteTableId": {
"Ref": "PrivateRouteTable"
}
}
},
"PrivateSubnetRouteTableAssociation2": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PrivateSubnet2"
},
"RouteTableId": {
"Ref": "PrivateRouteTable"
}
}
}
},
"Outputs": {
"VPC": {
"Description": "VPC",
"Value": {
"Ref": "VPC"
}
},
"AZ1": {
"Description": "Availability Zone 1",
"Value": {
"Fn::GetAtt": [
"PublicSubnet1",
"AvailabilityZone"
]
}
},
"AZ2": {
"Description": "Availability Zone 2",
"Value": {
"Fn::GetAtt": [
"PublicSubnet2",
"AvailabilityZone"
]
}
}
}
}
[Task 5: Delete the Stack]
- CloudFormation 삭제로 VPC 삭제 됨을 확인
[결론]
- Amazon VPC를 생성하는 AWS CloudFormation 템플릿 배포
- 템플릿의 구성 요소를 검사
- CloudFormation 스택 업데이트
- AWS CloudFormation Designer를 사용하여 템플릿 검토
- CloudFormation 스택 삭제