연습: AWS CloudFormation Designer를 사용하여 기본 웹 서버 생성 - AWS CloudFormation

연습: AWS CloudFormation Designer를 사용하여 기본 웹 서버 생성

AWS CloudFormation Designer는 템플릿의 리소스와 이러한 리소스가 연결된 방식을 쉽게 확인할 수 있도록 템플릿을 그래픽으로 표시합니다. 통합 JSON 및 YAML 편집기를 사용하면 AWS CloudFormation 콘솔에서 직접 템플릿을 쉽게 수정할 수 있습니다. 이러한 두 구성 요소를 사용하는 방법을 보여주기 위해 AWS CloudFormation Designer를 사용하여 VPC에서 기본 웹 서버를 구축해 보려고 합니다. 그런 다음 템플릿을 저장해 CloudFormation 스택을 생성하는 데 사용합니다.

이 연습에서는 다음 단계를 수행합니다.

  1. 리소스를 추가 및 연결합니다.

    AWS CloudFormation Designer를 처음으로 열면 빈 템플릿으로 시작됩니다. AWS CloudFormation Designer에서 리소스(예: VPC 및 EC2 인스턴스)를 템플릿으로 끌어 템플릿을 채우는 것으로 시작합니다. 또한 리소스 간에 링크를 생성합니다. 예를 들어, AWS CloudFormation Designer를 사용하여 인터넷 게이트웨이와 VPC 간에 연결을 생성합니다.

  2. 템플릿 파라미터, 매핑 및 출력을 추가합니다.

    AWS CloudFormation Designer 통합 편집기를 사용하여 다른 템플릿 구성 요소를 추가하여 템플릿을 더욱 유용하게 만듭니다. 예를 들어, 스택을 생성할 때 입력 값을 지정할 수 있도록 템플릿에 파라미터를 추가합니다. 따라서 일반적으로 변경할 수 있는 속성 값에 대해 템플릿을 지속적으로 편집할 필요가 없습니다.

  3. 리소스 속성을 지정합니다.

    통합 편집기를 다시 사용하여 리소스에 대한 구성 설정을 지정합니다.

  4. 리소스를 프로비저닝합니다.

    스택을 생성할 때까지 템플릿 리소스가 실행되지 않습니다. 방금 생성한 템플릿을 사용하여 CloudFormation 스택을 시작합니다. 그러면 템플릿에 정의된 모든 리소스가 프로비저닝됩니다.

    참고

    CloudFormation이 무료 서비스이긴 하지만 스택에 포함시키는 AWS 리소스에 대해서는 리소스별 현재 시세로 요금이 청구됩니다. AWS 요금에 대한 자세한 내용을 알아보려면 http://aws.amazon.com의 제품별 세부 정보 페이지를 참조하세요.

필수 조건

이 연습에서는 여러분에게 Amazon Virtual Private Cloud(Amazon VPC), Amazon Elastic Compute Cloud(Amazon EC2) 및 CloudFormation에 대한 유효한 지식이 있다고 가정합니다. 맥락을 파악할 수 있도록 각 절차에서는 각 리소스에 대한 몇 가지 기본 정보를 제공합니다.

또한 시작하기 전에 스택을 생성하는 리전에 Amazon EC2 키 페어가 있는지 확인합니다. 자세한 내용을 알아보려면 Linux 인스턴스용 Amazon EC2 사용 설명서Amazon EC2 키 페어를 참조하세요.

1단계: 리소스 추가 및 연결

AWS CloudFormation Designer 끌어서 놓기 인터페이스를 사용하여 Amazon EC2 인스턴스 및 네트워크 리소스(예: VPC, 서브넷, 라우팅 테이블 및 인터넷 게이트웨이)를 추가합니다. 모든 리소스를 추가한 후 리소스 간에 연결을 생성합니다. 예를 들어, 인터넷 게이트웨이를 VPC와 연결합니다.

템플릿에 리소스를 추가하려면
  1. https://console.aws.amazon.com/cloudformation/designer에서 AWS CloudFormation Designer를 엽니다.

  2. 통합 편집기에서 페이지 하단에 있는 편집( )을 선택합니다.

  3. 템플릿 이름을 BasicWebServerInVPC로 변경한 다음 Enter를 누릅니다.

    현재, 유효하지 않은 빈 템플릿이 있습니다. 다음 단계에서는 리소스를 추가하여 이 템플릿을 유효하게 만듭니다.

  4. 리소스 유형 창의 EC2 범주 내에서 VPC 리소스 유형을 캔버스 창으로 끕니다.

    리소스는 리소스 범주별로 구성됩니다. 현재, 추가 중인 모든 리소스는 EC2 범주에 속합니다.

    AWS CloudFormation Designer에서는 다음 JSON 코드 조각과 유사하게 표시되는 결과와 함께 VPC 리소스를 포함시키도록 템플릿을 즉시 수정합니다.

    "Resources": { "VPC431KO": { "Type": "AWS::EC2::VPC", "Properties": {}, "Metadata": { "AWS::CloudFormation::Designer": { "id": "445730ea-0d11-45ba-b6ac-12345EXAMPLE" } } } }

    YAML 코드 조각은 다음과 비슷합니다.

    Resources: VPC431KO: Type: 'AWS::EC2::VPC' Properties: {} Metadata: 'AWS::CloudFormation::Designer': id: 9430b008-7a03-41ed-b63e-12345EXAMPLE

    계속해서 VPC 속성(예: VPC의 CIDR 블록)을 지정해야 합니다. 이 작업은 나중에 수행하며, 앞으로 추가할 모든 리소스에 대해서도 수행해야 합니다.

  5. VPC의 이름을 바꿉니다.

    참고

    리소스의 이름을 바꾸면 템플릿에서 참조되는 이름인 논리적 ID도 바꿉니다(이 ID는 CloudFormation에서 리소스를 생성할 때 할당되는 이름이 아님). 자세한 내용은 리소스 단원을 참조하십시오.

    1. VPC 리소스를 선택합니다.

    2. 통합 편집기에서 편집 아이콘( )을 선택합니다.

    3. 이름을 VPC로 변경한 다음 Enter를 선택합니다.

    다음으로, VPC에 리소스를 추가합니다.

  6. 여러 추가 리소스에 맞도록 VPC 리소스의 모서리를 끌어 충분히 확장합니다.

    웹 사이트를 호스팅하는 EC2 인스턴스를 VPC; 인스턴스(동일한 서브넷에 있어야 함)에 직접 추가할 수 없기 때문에 서브넷을 추가해야 합니다.

  7. VPC 내에서 Subnet 리소스 유형을 추가하고 이름을 PublicSubnet으로 바꿉니다.

    추가한 서브넷을 사용하여 다른 AWS 리소스(예: Amazon EC2 인스턴스)와 연결할 수 있는 VPC의 IP 주소 범위를 할당합니다.

    VPC 내에서 서브넷을 추가하면 AWS CloudFormation Designer에서는 해당 서브넷을 VPC와 자동으로 연결합니다. 이러한 연결은 컨테이너 모델로, 컨테이너 내의 리소스는 컨테이너 리소스와 자동으로 연결됩니다.

  8. PublicSubnet 리소스 내에서 Instance 리소스 유형을 추가하고 이름을 WebServerInstance로 바꿉니다.

    인스턴스는 기본 웹 사이트를 호스팅하는 가상 컴퓨팅 환경입니다. 서브넷 및 VPC에서 작동하는 방식과 유사하게 서브넷에서 인스턴스를 추가하면 인스턴스가 서브넷과 자동으로 연결됩니다.

  9. VPC 내에서 SecurityGroup 리소스 유형을 추가하고 이름을 WebServerSecurityGroup으로 바꿉니다.

    보안 그룹은 웹 서버 인스턴스의 인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽으로, VPC의 인스턴스에도 필요합니다. 웹 서버 인스턴스를 이 보안 그룹과 연결해야 하는데, 이 작업은 이후에 인스턴스의 속성을 지정할 때 수행합니다.

  10. VPC 외부의 어느 곳에든 InternetGateway 리소스 유형을 추가하고 이름을 InternetGateway로 바꿉니다.

    인터넷 게이트웨이는 VPC 내부의 인스턴스와 인터넷 간의 통신을 활성화합니다. 인터넷 게이트웨이를 사용하지 않으면 어느 누구도 웹 사이트에 액세스할 수 없습니다.

    VPC 내에서 인터넷 게이트웨이를 끌 수 있지만 그렇다고 해도 VPC와의 연결이 생성되지는 않습니다. 인터넷 게이트웨이는 컨테이너 모델을 따르지 않습니다. 대신 다음 단계에서 설명하는 대로 인터넷 게이트웨이에서 VPC로 연결을 끌어야 합니다.

  11. InternetGateway 리소스와 VPC 리소스 간에 연결을 생성합니다.

    1. InternetGateway 리소스에서 인터넷 게이트웨이 연결(AWS::EC2::VPCGatewayAttachment) 위에 마우스 포인터를 올려 놓습니다.

    2. 연결을 VPC로 끕니다.

      유효한 대상 리소스의 경계 색상이 변경됩니다. 이 경우 VPC가 유일하게 유효한 대상 리소스입니다. 이 연결은 인터넷 게이트웨이를 VPC와 연결하는 연결 리소스를 생성합니다.

  12. 다음으로, 라우팅 테이블과 경로를 추가해 서브넷 내에서 네트워크 트래픽을 보내는 방법을 지정해야 합니다. VPC 내에서 RouteTable을 추가하고 이름을 PublicRouteTable로 바꿉니다.

    이렇게 하면 새 라우팅 테이블이 VPC와 연결됩니다.

  13. 라우팅 테이블에 라우팅 규칙을 추가하려면 PublicRouteTable 리소스 내에서 Route 리소스 유형을 추가하고 이름을 PublicRoute로 바꿉니다.

    이 경로를 사용해 트래픽을 보낼 위치를 지정합니다.

  14. 퍼블릭 라우팅의 경우 인터넷 게이트웨이를 목적지 대상으로 지정하려고 합니다. 인터넷 게이트웨이와 VPC 간에 연결을 생성했던 것과 유사한 방식으로 GatewayId를 사용하여 PublicRoute 리소스에서 인터넷 게이트웨이로의 연결을 생성합니다.

    인터넷 게이트웨이를 VPC와 연결할 때까지 CloudFormation에서는 인터넷 게이트웨이와 경로를 연결할 수 없습니다. 즉, 다음 단계에서 설명하는 것처럼 인터넷 게이트웨이-VPC 연결에 대한 명시적 종속성을 생성해야 합니다. 자세한 내용은 DependsOn 속성 단원을 참조하십시오.

  15. PublicRoute 리소스와 인터넷 게이트웨이-VPC 연결 간에 명시적 종속성을 생성합니다.

    1. PublicRoute 리소스에서 DependsOn 점 위에 마우스 포인터를 올려 놓습니다.

    2. 인터넷 게이트웨이-VPC 연결로 연결을 끕니다(AWS::EC2::VPCGatewayAttachment).

      AWS CloudFormation Designer에서는 DependsOn 연결을 사용하여 종속성을 생성합니다(DependsOn 속성). 여기서는 원본 리소스가 대상 리소스에 종속됩니다. 이 경우 AWS CloudFormation Designer에서는 DependsOn 속성을 PublicRoute 리소스에 추가하고 게이트웨이-VPC 연결을 종속성으로 지정합니다.

  16. WebServerInstance 리소스에서 PublicRoute 리소스로의 또 다른 종속성을 생성합니다.

    WebServerInstance 리소스는 퍼블릭 라우팅에 종속되어 트래픽을 인터넷으로 라우팅합니다. 퍼블릭 라우팅이 없으면 인스턴스가 (cfn-signal 헬퍼 스크립트를 사용해) 신호를 전송할 수 없어 인스턴스 구성 및 애플리케이션 배포 완료 시 CloudFormation에 알릴 수 없습니다.

  17. PublicRouteTable 리소스로부터 PublicSubnet 리소스까지의 연결을 끌어 라우팅 테이블 및 서브넷을 연결합니다.

    이제 퍼블릭 서브넷이 퍼블릭 라우팅 테이블을 사용해 트래픽을 보냅니다.

  18. AWS CloudFormation Designer 도구 모음에서 File(파일) 메뉴(파일 아이콘)를 사용하여 템플릿을 로컬에 저장합니다.

    AWS CloudFormation Designer에서는 하드 드라이브에 템플릿을 저장합니다. 나중에 이 템플릿을 사용하여 스택을 만들 수 있습니다. 변경 사항이 손실되지 않도록 템플릿을 정기적으로 저장하는 것이 좋습니다.

이 단계에서는 템플릿에 리소스를 7개 추가했고 이러한 리소스의 논리적 이름을 기억하기 쉬운 이름으로 바꿨습니다. 또한 대부분의 리소스와의 시각적 연결을 설정해 연결 및 종속성을 생성했습니다. 그러나 이 템플릿으로 스택을 생성하려면 연결(예: 보안 그룹과 인스턴스 연결)을 몇 개 더 생성하고 각 리소스에 대한 속성을 지정해야 합니다. 다음 단계에서는 AWS CloudFormation Designer 통합 편집기를 사용하여 템플릿의 기타 구성 요소(예: 입력 파라미터)를 수정하는 방법을 살펴봅니다.

2단계: 파라미터, 매핑 및 출력 추가

리소스 속성을 지정하기 전에 다른 템플릿 구성 요소를 추가해 여러 환경에서 템플릿을 보다 쉽게 재사용할 수 있도록 해야 합니다. 이 단계에서는 AWS CloudFormation Designer 통합 편집기를 사용하여 파라미터, 매핑 및 출력을 추가합니다. 그런 다음 리소스 속성을 지정할 때 이러한 파라미터 및 매핑을 참조할 수 있습니다. 이 연습에서는 복사해서 통합 편집기에 붙여 넣을 수 있는 샘플 JSON 및 YAML을 제공합니다.

파라미터를 추가하려면

파라미터는 스택 생성 시 지정하는 입력 값으로, 값을 전달하는 데 유용하기 때문에 템플릿에서 값을 하드 코딩할 필요가 없습니다. 예를 들어 템플릿에 웹 서버의 인스턴스 유형을 하드 코딩할 필요 없이 스택 생성 시 파라미터를 사용하여 인스턴스 유형을 지정할 수 있습니다. 이러한 방식으로 동일한 템플릿을 사용하여 인스턴스 유형이 다른 웹 서버를 여러 개 생성할 수 있습니다. 자세한 내용은 파라미터 단원을 참조하십시오.

  1. AWS CloudFormation Designer 캔버스에서 사용 가능한 공간을 클릭합니다.

    선택한 항목에 따라 통합 편집기에는 편집할 수 있는 템플릿 수준 또는 리소스 수준 구성 요소가 표시됩니다. 템플릿 수준에서는 리소스 섹션을 제외하고 템플릿의 기타 모든 섹션(예: 템플릿 파라미터, 매핑 및 출력)을 편집할 수 있습니다. 리소스 수준에서는 리소스 속성을 편집할 수 있습니다.

    캔버스에서 사용 가능한 영역을 클릭하면 템플릿 수준 구성 요소를 편집할 수 있습니다. 리소스 수준 구성 요소를 편집하려면 리소스를 선택합니다.

  2. 통합 편집기 창의 Components(구성 요소) 보기에서 Parameters(파라미터) 탭을 선택합니다.

  3. 다음 코드 조각에서 파라미터를 복사해 통합 편집기에 붙여 넣습니다.

    다음 JSON 코드 조각에서는 웹 서버의 인스턴스 유형, 웹 서버에 대한 SSH 액세스를 위한 Amazon EC2 키-페어 이름과 SSH를 사용해 웹 서버에 액세스하는 데 사용할 수 있는 IP 주소 범위를 지정하기 위한 파라미터를 추가합니다.

    { "Parameters": { "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." }, "KeyName": { "Description": "Name of an EC2 KeyPair to enable SSH access to the instance.", "Type": "AWS::EC2::KeyPair::KeyName", "ConstraintDescription": "must be the name of an existing EC2 KeyPair." }, "SSHLocation": { "Description": " The IP address range that can be used to access the web server using SSH.", "Type": "String", "MinLength": "9", "MaxLength": "18", "Default": "0.0.0.0/0", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." } } }

    다음은 YAML 형식의 동일한 코드 조각입니다.

    Parameters: InstanceType: Description: WebServer EC2 instance type Type: String Default: t2.small AllowedValues: - t1.micro - t2.nano - t2.micro - t2.small - t2.medium - t2.large - m1.small - m1.medium - m1.large - m1.xlarge - m2.xlarge - m2.2xlarge - m2.4xlarge - m3.medium - m3.large - m3.xlarge - m3.2xlarge - m4.large - m4.xlarge - m4.2xlarge - m4.4xlarge - m4.10xlarge - c1.medium - c1.xlarge - c3.large - c3.xlarge - c3.2xlarge - c3.4xlarge - c3.8xlarge - c4.large - c4.xlarge - c4.2xlarge - c4.4xlarge - c4.8xlarge - g2.2xlarge - g2.8xlarge - r3.large - r3.xlarge - r3.2xlarge - r3.4xlarge - r3.8xlarge - i2.xlarge - i2.2xlarge - i2.4xlarge - i2.8xlarge - d2.xlarge - d2.2xlarge - d2.4xlarge - d2.8xlarge - hi1.4xlarge - hs1.8xlarge - cr1.8xlarge - cc2.8xlarge - cg1.4xlarge ConstraintDescription: must be a valid EC2 instance type. KeyName: Description: Name of an EC2 KeyPair to enable SSH access to the instance. Type: 'AWS::EC2::KeyPair::KeyName' ConstraintDescription: must be the name of an existing EC2 KeyPair. SSHLocation: Description: ' The IP address range that can be used to access the web server using SSH.' Type: String MinLength: '9' MaxLength: '18' Default: 0.0.0.0/0 AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
매핑을 추가하려면

매핑은 이름-값 페어 세트와 연결되는 키 세트로, 입력 파라미터 값을 기반으로 값을 지정하는 데 유용합니다. 이 연습의 경우 매핑을 사용하여 스택을 생성한 인스턴스 유형 및 리전을 기반으로 EC2 인스턴스에 대한 AMI ID를 지정합니다. 자세한 내용은 매핑 단원을 참조하십시오.

  1. 통합 편집기 창에서 매핑 탭을 선택합니다.

  2. 다음 JSON 매핑을 복사해 통합 편집기에 붙여 넣습니다.

    { "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } } }

    다음은 YAML 형식의 동일한 매핑입니다.

    Mappings: AWSInstanceType2Arch: t1.micro: Arch: HVM64 t2.nano: Arch: HVM64 t2.micro: Arch: HVM64 t2.small: Arch: HVM64 t2.medium: Arch: HVM64 t2.large: Arch: HVM64 m1.small: Arch: HVM64 m1.medium: Arch: HVM64 m1.large: Arch: HVM64 m1.xlarge: Arch: HVM64 m2.xlarge: Arch: HVM64 m2.2xlarge: Arch: HVM64 m2.4xlarge: Arch: HVM64 m3.medium: Arch: HVM64 m3.large: Arch: HVM64 m3.xlarge: Arch: HVM64 m3.2xlarge: Arch: HVM64 m4.large: Arch: HVM64 m4.xlarge: Arch: HVM64 m4.2xlarge: Arch: HVM64 m4.4xlarge: Arch: HVM64 m4.10xlarge: Arch: HVM64 c1.medium: Arch: HVM64 c1.xlarge: Arch: HVM64 c3.large: Arch: HVM64 c3.xlarge: Arch: HVM64 c3.2xlarge: Arch: HVM64 c3.4xlarge: Arch: HVM64 c3.8xlarge: Arch: HVM64 c4.large: Arch: HVM64 c4.xlarge: Arch: HVM64 c4.2xlarge: Arch: HVM64 c4.4xlarge: Arch: HVM64 c4.8xlarge: Arch: HVM64 g2.2xlarge: Arch: HVMG2 g2.8xlarge: Arch: HVMG2 r3.large: Arch: HVM64 r3.xlarge: Arch: HVM64 r3.2xlarge: Arch: HVM64 r3.4xlarge: Arch: HVM64 r3.8xlarge: Arch: HVM64 i2.xlarge: Arch: HVM64 i2.2xlarge: Arch: HVM64 i2.4xlarge: Arch: HVM64 i2.8xlarge: Arch: HVM64 d2.xlarge: Arch: HVM64 d2.2xlarge: Arch: HVM64 d2.4xlarge: Arch: HVM64 d2.8xlarge: Arch: HVM64 hi1.4xlarge: Arch: HVM64 hs1.8xlarge: Arch: HVM64 cr1.8xlarge: Arch: HVM64 cc2.8xlarge: Arch: HVM64 AWSRegionArch2AMI: us-east-1: HVM64: ami-0ff8a91507f77f867 HVMG2: ami-0a584ac55a7631c0c us-west-2: HVM64: ami-a0cfeed8 HVMG2: ami-0e09505bc235aa82d us-west-1: HVM64: ami-0bdb828fd58c52235 HVMG2: ami-066ee5fd4a9ef77f1 eu-west-1: HVM64: ami-047bb4163c506cd98 HVMG2: ami-0a7c483d527806435 eu-west-2: HVM64: ami-f976839e HVMG2: NOT_SUPPORTED eu-west-3: HVM64: ami-0ebc281c20e89ba4b HVMG2: NOT_SUPPORTED eu-central-1: HVM64: ami-0233214e13e500f77 HVMG2: ami-06223d46a6d0661c7 ap-northeast-1: HVM64: ami-06cd52961ce9f0d85 HVMG2: ami-053cdd503598e4a9d ap-northeast-2: HVM64: ami-0a10b2721688ce9d2 HVMG2: NOT_SUPPORTED ap-northeast-3: HVM64: ami-0d98120a9fb693f07 HVMG2: NOT_SUPPORTED ap-southeast-1: HVM64: ami-08569b978cc4dfa10 HVMG2: ami-0be9df32ae9f92309 ap-southeast-2: HVM64: ami-09b42976632b27e9b HVMG2: ami-0a9ce9fecc3d1daf8 ap-south-1: HVM64: ami-0912f71e06545ad88 HVMG2: ami-097b15e89dbdcfcf4 us-east-2: HVM64: ami-0b59bfac6be064b78 HVMG2: NOT_SUPPORTED ca-central-1: HVM64: ami-0b18956f HVMG2: NOT_SUPPORTED sa-east-1: HVM64: ami-07b14488da8ea02a0 HVMG2: NOT_SUPPORTED cn-north-1: HVM64: ami-0a4eaf6c4454eda75 HVMG2: NOT_SUPPORTED cn-northwest-1: HVM64: ami-6b6a7d09 HVMG2: NOT_SUPPORTED
출력을 추가하려면

출력은 describe stacks API 호출에 대해 또는 CloudFormation 콘솔 스택 출력 탭을 통해 사용 가능하게 하려는 값을 선언합니다. 이 연습에서는 웹 사이트를 생성한 후 쉽게 볼 수 있도록 웹 사이트 URL을 출력합니다. 자세한 내용은 결과 단원을 참조하십시오.

  1. 통합 편집기 창에서 출력 탭을 선택합니다.

  2. 다음 JSON 출력을 복사해 통합 편집기에 붙여 넣습니다.

    이 출력은 Fn::GetAtt 내장 함수를 사용하여 웹 서버 인스턴스의 퍼블릭 IP를 가져옵니다.

    { "Outputs": { "URL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "WebServerInstance", "PublicIp" ] } ] ] }, "Description": "Newly created application URL" } } }

    다음은 YAML 형식의 동일한 출력입니다.

    Outputs: URL: Value: !Join - '' - - 'http://' - !GetAtt - WebServerInstance - PublicIp Description: Newly created application URL
  3. 변경 사항이 손실되지 않도록 템플릿을 다시 저장합니다. 이전 단원에서 생성한 동일한 파일에 대한 변경 사항을 안전하게 저장할 수 있습니다.

템플릿 파라미터, 매핑 및 출력이 준비되었으므로 이제 리소스 속성을 지정할 수 있습니다.

3단계: 리소스 속성 지정

많은 수의 리소스에는 리소스의 구성 또는 설정(예: 웹 서버에 사용할 인스턴스 유형)을 정의하는 필수 속성이 있습니다. 이전 단계에서 수행한 것과 유사한 방식으로 AWS CloudFormation Designer 통합 편집기를 사용하여 리소스 속성을 지정합니다. 복사해서 통합 편집기에 붙여 넣을 수 있는 샘플 JSON 및 YAML을 제공합니다.

리소스 속성을 지정하려면
  1. AWS CloudFormation Designer 캔버스에서 VPC 리소스를 선택합니다.

    통합 편집기는 편집할 수 있는 리소스 수준 구성 요소(예: 리소스 속성 및 속성)를 보여줍니다.

  2. 통합 편집기 창에서 속성 탭을 선택합니다.

  3. 다음 JSON 코드 조각을 복사해 통합 편집기에서 속성 중괄호({}) 사이에 붙여 넣습니다.

    이 코드 조각은 VPC의 DNS 설정과 CIDR 블록을 지정합니다.

    "EnableDnsSupport": "true", "EnableDnsHostnames": "true", "CidrBlock": "10.0.0.0/16"

    YAML의 경우 Properties: 뒤에 새 줄을 입력하고 다음 코드 조각을 붙여 넣습니다.

    EnableDnsSupport: 'true' EnableDnsHostnames: 'true' CidrBlock: 10.0.0.0/16
    참고

    효율적으로 진행할 수 있도록 복사해 붙여 넣을 수 있는 JSON 및 YAML 코드 조각을 제공합니다. 그러나 편집기에는 각 속성을 수동으로 지정하는 데 사용할 수 있는 자동 완성 기능이 있습니다. 자세한 내용은 통합 JSON 및 YAML 편집기 단원을 참조하십시오.

  4. 다음 리소스에 대해 이 절차를 반복합니다.

    PublicSubnet

    VPC ID 속성 뒤에 다음 CIDR 블록 속성을 추가합니다. AWS CloudFormation Designer는 VPC 내부에서 서브넷을 드래그할 때 VPC ID 속성을 자동으로 추가했습니다.

    참고

    AWS CloudFormation Designer에서 자동으로 생성된 기타 연결 몇 개가 보입니다. 새 속성을 추가합니다. 이러한 속성은 굵게 표시됩니다.

    JSON

    "VpcId": { "Ref": "VPC" }, "CidrBlock": "10.0.0.0/24"

    YAML

    VpcId: !Ref VPC CidrBlock: 10.0.0.0/24
    PublicRoute

    모든 트래픽을 인터넷 게이트웨이로 보내는 다음 대상 CIDR 블록 속성을 추가합니다.

    JSON

    "DestinationCidrBlock": "0.0.0.0/0", "RouteTableId": { "Ref": "PublicRouteTable" }, "GatewayId": { "Ref": "InternetGateway" }

    YAML

    DestinationCidrBlock: 0.0.0.0/0 RouteTableId: !Ref PublicRouteTable GatewayId: !Ref InternetGateway
    WebServerSecurityGroup

    웹 서버 인스턴스에 도달할 수 있는 트래픽을 결정하는 다음 인바운드 규칙을 추가합니다. 이 규칙은 스택 생성 시 파라미터 값으로 지정한 모든 HTTP 트래픽과 특정 SSH 트래픽을 허용합니다.

    JSON

    "VpcId": { "Ref": "VPC" }, "GroupDescription" : "Allow access from HTTP and SSH traffic", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" }, { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } } ]

    YAML

    VpcId: !Ref VPC GroupDescription: Allow access from HTTP and SSH traffic SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation
    WebServerInstance

    웹 서버 인스턴스에 대한 여러 속성을 지정해야 하는데 시연을 위해 몇 가지 속성을 중심으로 설명해 보겠습니다. InstanceTypeImageId 속성은 이전 단원에서 지정한 파라미터와 매핑 값을 사용합니다. 스택 생성 시 인스턴스 유형을 파라미터 값으로 지정합니다. ImageId 값은 지정한 스택의 리전과 인스턴스 유형.을 기반으로 하는 매핑입니다.

    NetworkInterfaces 속성은 웹 서버 인스턴스에 대한 네트워크 설정을 지정합니다. 이 속성을 사용하면 보안 그룹 및 서브넷을 인스턴스와 연결할 수 있습니다. AWS CloudFormation Designer에서 SubnetId 속성을 사용하여 인스턴스를 서브넷과 연결했지만 웹 서버에 퍼블릭 IP를 제공하는 유일한 방법이기 때문에 NetworkInterfaces 속성을 사용해야 합니다. NetworkInterfaces 속성을 지정할 때 해당 속성 내에서 서브넷과 보안 그룹을 지정해야 합니다.

    UserData 속성에서는 인스턴스가 실행된 후 실행할 구성 스크립트를 지정합니다. 모든 구성 정보는 인스턴스의 메타데이터에 정의되며 이 메타데이터는 다음 단계에서 추가합니다.

    모든 속성을 다음 코드 조각으로 대체합니다.

    중요

    이 코드 조각을 기존 속성에 추가하지 마십시오.

    JSON

    "InstanceType": { "Ref": "InstanceType" }, "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ] } ] }, "KeyName": { "Ref": "KeyName" }, "NetworkInterfaces": [ { "GroupSet": [ { "Ref": "WebServerSecurityGroup" } ], "AssociatePublicIpAddress": "true", "DeviceIndex": "0", "DeleteOnTermination": "true", "SubnetId": { "Ref": "PublicSubnet" } } ], "UserData": { "Fn::Base64": { "Fn::Join": [ "", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerInstance ", " --configsets All ", " --region ", { "Ref": "AWS::Region" }, "\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref": "AWS::Region" }, "\n" ] ] } }

    YAML

    InstanceType: !Ref InstanceType ImageId: !FindInMap - AWSRegionArch2AMI - !Ref 'AWS::Region' - !FindInMap - AWSInstanceType2Arch - !Ref InstanceType - Arch KeyName: !Ref KeyName NetworkInterfaces: - GroupSet: - !Ref WebServerSecurityGroup AssociatePublicIpAddress: 'true' DeviceIndex: '0' DeleteOnTermination: 'true' SubnetId: !Ref PublicSubnet UserData: !Base64 'Fn::Join': - '' - - | #!/bin/bash -xe - | yum install -y aws-cfn-bootstrap - | # Install the files and packages from the metadata - '/opt/aws/bin/cfn-init -v ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerInstance ' - ' --configsets All ' - ' --region ' - !Ref 'AWS::Region' - |+ - | # Signal the status from cfn-init - '/opt/aws/bin/cfn-signal -e $? ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerInstance ' - ' --region ' - !Ref 'AWS::Region' - |+
  5. WebServerInstance 리소스에 웹 서버 구성 메타데이터를 추가합니다.

    1. WebServerInstance 리소스를 선택한 다음 통합 편집기 창에서 메타데이터 탭을 선택합니다.

    2. 템플릿을 JSON 형식으로 작성하는 경우: Metadata 중괄호({}) 내와 AWS::CloudFormation::Designer 닫는 중괄호 뒤에 쉼표(,)를 추가합니다.

    3. AWS::CloudFormation::Designer 속성 뒤에 다음 코드 조각을 추가하여 cfn-init 헬퍼 스크립트가 웹 서버를 시작하고 기본 웹 페이지를 생성하도록 지시합니다.

      JSON

      "AWS::CloudFormation::Init" : { "configSets" : { "All" : [ "ConfigureSampleApp" ] }, "ConfigureSampleApp" : { "packages" : { "yum" : { "httpd" : [] } }, "files" : { "/var/www/html/index.html" : { "content" : { "Fn::Join" : ["\n", [ "<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>" ]]}, "mode" : "000644", "owner" : "root", "group" : "root" } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" } } } } }

      YAML

      'AWS::CloudFormation::Init': configSets: All: - ConfigureSampleApp ConfigureSampleApp: packages: yum: httpd: [] files: /var/www/html/index.html: content: !Join - |+ - - >- <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> mode: '000644' owner: root group: root services: sysvinit: httpd: enabled: 'true' ensureRunning: 'true'
  6. AWS CloudFormation Designer 도구 모음에서 Validate template(템플릿 확인)( )을 선택하여 템플릿의 구문 오류를 검사합니다.

    메시지 창에서 오류를 확인해 수정한 다음 템플릿을 다시 확인합니다. 오류가 보이지 않으면 템플릿이 구문상 유효한 것입니다.

  7. 완성된 템플릿을 저장해 모든 변경 사항을 보존합니다.

이제 VPC에서 기본 웹 서버를 생성하는 데 사용할 수 있는 전체 CloudFormation 템플릿이 생겼습니다. 템플릿을 생성하기 위해 먼저, AWS CloudFormation Designer 캔버스 창을 사용하여 템플릿 리소스를 추가하고 연결했습니다. 그런 다음 통합 편집기를 사용해 다른 템플릿 구성 요소를 추가하고 리소스 속성을 추가했습니다. 다음 단계에서는 이렇게 만든 템플릿을 사용해 스택을 생성해 보겠습니다.

4단계: 리소스 프로비저닝

스택을 생성하려면 AWS CloudFormation Designer에서 CloudFormation 스택 생성 마법사(Create Stack Wizard)를 시작합니다. 이전 단계에서 만든 템플릿을 사용해 CloudFormation 스택을 만듭니다. CloudFormation에서 리소스를 모두 프로비저닝하면 실행 중인 기본 웹 사이트가 생깁니다.

스택을 생성하는 방법
  1. AWS CloudFormation Designer 도구 모음에서 Create Stack(스택 생성)(구름 아이콘)을 선택합니다.

    AWS CloudFormation Designer에서는 열려 있는 템플릿을 S3 버킷에 저장한 다음 CloudFormation Create Stack Wizard(스택 생성 마법사)를 시작합니다. CloudFormation은 템플릿을 업로드할 때마다 생성되는 것과 동일한 S3 버킷을 사용합니다.

  2. CloudFormation에서는 템플릿 URL을 자동으로 채웁니다. [다음(Next)]을 선택합니다.

  3. 세부 정보 지정 섹션의 스택 이름 필드에 스택 이름을 입력합니다. 이 예에서는 BasicWebServerStack을 사용합니다.

  4. 파라미터 섹션의 KeyName 필드에 스택을 생성하는 리전과 동일한 리전에 있는 유효한 Amazon EC2 키 페어의 이름을 입력합니다.

  5. 기타 기본 파라미터 값은 유지하고 다음을 선택합니다.

  6. 이 연습에서는 태그를 추가하거나 고급 설정을 지정할 필요가 없으므로 다음을 선택합니다.

  7. 스택 이름과 Amazon EC2 키-페어 이름이 올바른지 확인한 다음 생성을 선택합니다.

AWS CloudFormation에서 스택을 생성하는 데 몇 분 정도 걸릴 수 있습니다. 진행 상황을 모니터링하려면 스택 이벤트를 확인합니다. 스택 이벤트 보기에 대한 자세한 내용은 AWS Management Console에서 AWS CloudFormation 스택 데이터 및 리소스 보기 단원을 참조하십시오. 스택이 생성되면 스택 출력을 보고 샘플 웹 사이트 URL로 이동해 웹 사이트가 실행 중인지 확인합니다. 자세한 내용은 AWS Management Console에서 AWS CloudFormation 스택 데이터 및 리소스 보기 단원을 참조하십시오.

이제 AWS CloudFormation Designer를 사용해 성공적으로 템플릿을 생성하고 스택을 시작했습니다. 따라서 다음 연습: 연습: AWS CloudFormation Designer를 사용하여 스택의 템플릿 수정에서 이 스택을 사용할 수 있습니다. 이 연습에서는 확장 가능한 웹 서버를 생성하기 위해 템플릿을 수정합니다.