[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 삭제 됨을 확인


[결론]

  1. Amazon VPC를 생성하는 AWS CloudFormation 템플릿 배포
  2. 템플릿의 구성 요소를 검사
  3. CloudFormation 스택 업데이트
  4. AWS CloudFormation Designer를 사용하여 템플릿 검토
  5. CloudFormation 스택 삭제


+ Recent posts