메뉴
AWS CloudFormation
사용 설명서 (API Version 2010-05-15)

시작하기

올바른 템플릿을 사용하면 애플리케이션에 필요한 모든 AWS 리소스를 한 번에 배포할 수 있습니다. 이 단원에서는 WordPress 블로그에 필요한 리소스를 선언하고, WordPress 블로그를 스택으로 생성하고, 스택 생성 프로세스를 모니터링하고, 스택에서 해당 리소스를 검사한 다음 스택을 삭제하는 템플릿에 대해 살펴봅니다. 이러한 작업은 AWS Management Console을 사용하여 완료합니다.

1단계: 템플릿 선택

먼저, 스택에 필요한 리소스를 지정하는 템플릿이 필요합니다. 이 단계에서는 이미 준비된 샘플 템플릿을 사용합니다. 샘플 템플릿은 저장을 위해 로컬 MySQL 데이터베이스가 하나 있는 단일 Amazon EC2 인스턴스를 사용하는 기본 WordPress 블로그를 생성합니다. 또한 이 템플릿은 Amazon EC2 인스턴스에 대한 방화벽 설정을 제어하기 위해 Amazon EC2 보안 그룹도 생성합니다.

중요

AWS CloudFormation은 무료이지만 AWS CloudFormation에서 생성하는 AWS 리소스는 라이브입니다(샌드박스 내에서 실행되지 않음). 이 자습서의 마지막 작업에서 이러한 리소스를 종료하지 않으면 해당 리소스에 대한 표준 사용 요금이 발생합니다. 발생하는 총 요금은 매우 적습니다. 요금을 최소화할 수 있는 방법은 http://aws.amazon.com/free/를 참조하십시오.

템플릿을 보려면

  • JSON 또는 YAML WordPress 샘플 템플릿을 볼 수 있습니다. 이 설명서의 후반부에서는 템플릿 URL을 사용할 것이기 때문에 템플릿을 다운로드할 필요가 없습니다. 템플릿 형식에 대한 자세한 내용은 AWS CloudFormation 템플릿 형식 단원을 참조하십시오.

템플릿은 JSON 또는 YAML 텍스트 파일로, 스택에서 생성하려는 AWS 리소스에 대한 구성 정보가 들어 있습니다. 이 연습을 위해 샘플 템플릿에는 AWSTemplateFormatVersion, Description, Parameters, Mappings, ResourcesOutputs, 이렇게 6개의 최상위 섹션이 포함되어 있지만 Resources 섹션만 필수입니다.

리소스 섹션에는 이 템플릿으로 생성하려는 AWS 리소스에 대한 정의가 포함됩니다. 각 리소스는 개별적으로 나열되며 특정 리소스를 생성하는 데 필수인 속성을 지정합니다. 다음 리소스 선언은 EC2 인스턴스에 대한 구성으로, 이 예에서는 논리적 이름 WebServer을 포함하고 있습니다.

예 JSON

Copy
"Resources" : { ... "WebServer": { "Type" : "AWS::EC2::Instance", "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "KeyName" : { "Ref" : "KeyName" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum update -y aws-cfn-bootstrap\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServer ", " --configsets wordpress_install ", " --region ", { "Ref" : "AWS::Region" }, "\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServer ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} }, ... }, ... "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the load balancer + SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"}, {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}} ] } }, ... },

예 YAML

Copy
Resources: ... WebServer: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap [AWSRegionArch2AMI, !Ref 'AWS::Region', !FindInMap [AWSInstanceType2Arch, !Ref InstanceType, Arch]] InstanceType: Ref: InstanceType KeyName: Ref: KeyName SecurityGroups: - Ref: WebServerSecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash -xe yum update -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource WebServer --configsets wordpress_install --region ${AWS::Region} /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource WebServer --region ${AWS::Region} ... ... WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: "Enable HTTP access via port 80 locked down to the load balancer + SSH access" SecurityGroupIngress: - CidrIp: 0.0.0.0/0 FromPort: '80' IpProtocol: tcp ToPort: '80' - CidrIp: !Ref SSHLocation FromPort: '22' IpProtocol: tcp ToPort: '22' ...

이전에 EC2 인스턴스를 만든 경우에는 해당 인스턴스의 구성을 결정하는 ImageId, InstanceTypeKeyName과 같은 속성을 인식할 수 있습니다. 리소스 선언은 한 번에 모든 구성 설정을 지정할 수 있는 효율적인 방법입니다. 템플릿에 리소스 선언을 삽입하면 스택을 생성하는 템플릿을 사용하여 선언된 모든 리소스를 쉽게 생성 및 구성할 수 있습니다. 리소스의 동일한 구성을 시작하려면 동일한 템플릿을 사용하는 새 스택을 생성하기만 하면 됩니다.

리소스 선언은 리소스의 논리적 이름을 지정하는 문자열로 시작합니다. 앞으로 살펴볼 것처럼 논리적 이름은 템플릿 내에서 리소스를 참조할 때 사용할 수 있습니다.

파라미터 섹션을 사용하여 스택을 생성할 때 템플릿으로 전달할 수 있는 값을 선언합니다. 파라미터는 템플릿 자체에 저장하지 않으려는 사용자 이름 및 암호와 같은 민감한 정보를 지정하기 위한 효과적인 방법입니다. 또한 배포 중인 특정 애플리케이션 또는 구성에 고유할 수 있는 정보(예: 도메인 이름 또는 인스턴스 이름)을 지정하는 방법이기도 합니다. 이 단원의 후반부에서 WordPress 스택을 생성하면 템플릿에 선언된 파라미터 세트가 [Create Stack] 마법사의 [Specify Details] 페이지에 표시됩니다. 여기서 스택을 생성하기 전에 파라미터를 지정할 수 있습니다.

다음 파라미터는 템플릿에서 EC2 인스턴스의 속성에 사용되는 값을 지정하기 위해 사용됩니다.

예 JSON

Copy
"Parameters" : { ... "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances", "Type": "AWS::EC2::KeyPair::KeyName", "ConstraintDescription" : "must be the name of an existing EC2 KeyPair." }, "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." }, ...

예 YAML

Copy
Parameters: ... KeyName: ConstraintDescription: must be the name of an existing EC2 KeyPair. Description: Name of an existing EC2 KeyPair to enable SSH access to the instances Type: AWS::EC2::KeyPair::KeyName InstanceType: 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. Default: t2.small Description: WebServer EC2 instance type Type: String ...

WebServer 리소스 선언에는 KeyName 파라미터로 지정된 KeyName 속성이 있습니다.

예 JSON

Copy
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { "KeyName" : { "Ref" : "KeyName" }, ... } },

예 YAML

Copy
WebServer: Type: AWS::EC2::Instance Properties: KeyName: Ref: KeyName ...

중괄호에는 KeyName이 입력인 Ref 함수에 대한 호출이 들어 있습니다. Ref 함수는 자신이 참조하는 객체의 값을 반환합니다. 이 경우, Ref 함수는 스택 생성 시 KeyName에 대해 지정된 값으로 KeyName 속성을 설정합니다.

또한 Ref 함수는 리소스의 속성을 다른 리소스의 값으로 설정할 수도 있습니다. 예를 들어, 리소스 선언 WebServer에는 다음 속성 선언이 포함되어 있습니다.

예 JSON

Copy
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { ... "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], ... } },

예 YAML

Copy
WebServer: Type: AWS::EC2::Instance Properties: SecurityGroups: - Ref: WebServerSecurityGroup ...

SecurityGroups 속성은 EC2 보안 그룹의 목록을 가져옵니다. Ref 함수는 템플릿에서 보안 그룹의 논리적 이름인 WebServerSecurityGroup의 입력을 포함하고, SecurityGroups 속성에 WebServerSecurityGroup의 이름을 추가합니다.

이 템플릿에는 매핑 섹션도 있습니다. 매핑을 사용하여 조회 테이블 문과 유사한 방식으로 평가되는 조건 값을 선언합니다. 이 템플릿에서는 매핑을 사용하여 인스턴스 유형의 리전 및 아키텍처 유형에 올바른 Amazon 머신 이미지(AMI)를 선택합니다. 출력은 스택 생성 후 aws cloudformation describe-stacks 명령 및 AWS CloudFormation 콘솔의 [Outputs]를 통해 반환되는 사용자 지정 값을 정의합니다. 출력 값을 사용하여 스택 내 리소스의 정보를 반환할 수 있습니다(예: 템플릿에서 생성된 웹 사이트의 URL). 매핑, 출력 및 템플릿에 대한 기타 항목은 템플릿 기본 사항 알아보기 단원에서 자세히 다룹니다.

지금은 템플릿에 대해 이 정도만 알면 충분합니다. 그럼, 스택 생성을 시작해 보겠습니다.

2단계: 스택에 필요한 항목을 준비했는지 확인

템플릿에서 스택을 생성하기 전에 템플릿에 필요한 모든 종속 리소스를 사용할 수 있는지 확인해야 합니다. 템플릿은 기존 AWS 리소스 및 템플릿 자체에서 선언된 리소스를 둘 다 사용하거나 참조할 수 있습니다. AWS CloudFormation에서는 템플릿 내 리소스에 대한 참조를 확인하고 기존 리소스에 대한 참조도 확인해 이러한 리소스가 스택을 생성하려는 리전에 존재하는지 확인합니다. 템플릿이 존재하지 않는 종속 리소스를 참조하는 경우 스택 생성에 실패합니다.

WordPress 예제 템플릿에는 템플릿에서 선언된 Amazon EC2 인스턴스에 사용되는 키 페어를 지정하는 입력 파라미터 KeyName이 포함되어 있습니다. 이 템플릿은 템플릿에서 스택을 생성하여 KeyName 파라미터에 유효한 Amazon EC2 키 페어를 제공하는 사용자에게 종속됩니다. 유효한 키 페어 이름을 제공하면 스택이 성공적으로 생성됩니다. 유효한 키 페어 이름을 제공하지 못하면 스택이 롤백됩니다.

스택을 생성하기 전에 유효한 Amazon EC2 키 페어가 있는지 확인하고 해당 키 페어 이름을 기록해 둡니다.

키 페어를 보려면 Amazon EC2 콘솔을 연 다음 탐색 창에서 [Key Pairs]를 클릭합니다.

참고

Amazon EC2 키 페어가 없는 경우 스택을 생성하는 리전과 동일한 리전에서 키 페어를 생성해야 합니다. 키 페어를 생성하는 방법에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서SSH 키 페어 가져오기를 참조하십시오.

이제 유효한 키 페어가 있으므로 WordPress 템플릿을 사용해 스택을 생성해 보겠습니다.

3단계: 스택 생성

앞서 언급한 WordPress-1.0.0 파일을 기반으로 스택을 생성합니다. 이 템플릿에는 EC2 인스턴스와 같은 여러 AWS 리소스가 들어 있습니다.

WordPress 스택을 생성하려면

  1. AWS Management Console에 로그인한 다음 https://console.aws.amazon.com/cloudformation에서 AWS CloudFormation 콘솔을 엽니다.

  2. 새 AWS CloudFormation 계정인 경우 [Create New Stack]을 클릭합니다. 그렇지 않으면 [Create Stack]을 클릭합니다.

  3. [Template] 섹션에서 [Specify an Amazon S3 Template URL]을 선택해 샘플 WordPress 템플릿의 URL을 입력하거나 붙여 넣은 후 [Next]를 클릭합니다.

    https://s3-us-west-2.amazonaws.com/cloudformation-templates-us-west-2/WordPress_Single_Instance.template

    참고

    스택을 만드는 사용자로서 생성 중인 스택과 동일한 리전에 있는 사용자는 S3 버킷에 저장된 AWS CloudFormation 템플릿에 액세스할 수 있습니다. 따라서 us-east-2 리전에 S3 버킷이 있다면 해당 스택도 us-east-2에 만들어야 합니다.

  4. [Specify Details] 섹션의 [Name] 필드에 스택 이름을 입력합니다. 예를 들면, MyWPTestStack이라는 이름을 사용합니다. 스택 이름에는 공백이 있어서는 안 됩니다.

  5. [KeyName] 필드에 스택을 생성하는 리전과 동일한 리전에 있는 유효한 Amazon EC2 키 페어의 이름을 입력합니다.

    참고

    [Specify Parameters] 페이지에 템플릿의 파라미터 섹션에서 가져온 파라미터가 보입니다.

  6. [Next]를 클릭합니다.

  7. 이 시나리오에서는 어떠한 태그도 추가하지 않습니다. [Next]를 클릭합니다. 태그(키-값 페어임)는 스택을 식별하는 데 도움이 될 수 있습니다. 자세한 내용은 AWS CloudFormation 스택에 태그 추가를 참조하십시오.

  8. 스택에 대한 정보를 검토합니다. 설정이 적절한 경우 [Create ]을 클릭합니다.

스택이 생성될 때까지 몇 분 가량 소요될 수 있는데 그냥 가만히 앉아서 기다리기에는 답답할 것입니다. 따라서 스택 생성이 어떻게 진행되는지 확인하고 싶을 것입니다.

4단계: 스택 생성 진행 상황 모니터링

[Create Stack] 마법사를 완료하면 AWS CloudFormation에서는 템플릿에 지정된 리소스를 생성하기 시작합니다. CloudFormation 콘솔의 윗부분에 있는 목록에 새로운 스택 MyWPTestStack이 나타납니다. 이 스택의 상태는 CREATE_IN_PROGRESS여야 합니다. 스택의 이벤트를 보고 스택에 대한 자세한 상태를 확인할 수 있습니다.

스택에 대한 이벤트를 보려면

  1. AWS CloudFormation 콘솔의 목록에서 스택 MyWPTestStack을 선택합니다.

  2. 스택 세부 정보 창에서 [Events] 탭을 클릭합니다.

    콘솔은 60초마다 최신 이벤트로 이벤트 목록을 자동으로 새로 고칩니다.

[Events] 탭에는 스택을 생성하는 각 주요 단계가 각 이벤트의 시간 순으로 정렬되어 표시됩니다. 즉, 최신 이벤트가 맨 위에 표시됩니다.

(이벤트 목록의 맨 아래 있는) 첫 번째 이벤트가 스택 생성 프로세스의 시작입니다.

2013-04-24 18:54 UTC-7 CREATE_IN_PROGRESS AWS::CloudFormation::Stack MyWPTestStack User initiated

다음은 각 리소스의 생성 시작 및 완료를 표시하는 이벤트입니다. 예를 들어, EC2 인스턴스가 생성되면 다음 항목이 나타납니다.

2013-04-24 18:59 UTC-7 CREATE_COMPLETE AWS::EC2::Instance...

2013-04-24 18:54 UTC-7 CREATE_IN_PROGRESS AWS::EC2::Instance...

CREATE_IN_PROGRESS 이벤트는 AWS CloudFormation에서 리소스 생성이 시작되었다고 보고할 때 로깅됩니다. CREATE_COMPLETE 이벤트는 리소스를 성공적으로 생성한 경우에 로깅됩니다.

AWS CloudFormation에서 스택을 성공적으로 생성하면 [Events] 탭 맨 위에 다음 이벤트가 표시됩니다.

2013-04-24 19:17 UTC-7 CREATE_COMPLETE AWS::CloudFormation::Stack MyWPTestStack

AWS CloudFormation에서 리소스를 생성할 수 없는 경우 CREATE_FAILED 이벤트를 보고하고 기본적으로 스택을 롤백한 다음 생성된 리소스를 모두 삭제합니다. [Status Reason] 열에는 실패를 일으키는 문제가 표시됩니다.

5단계: 스택 리소스 사용

MyWPTestStack 스택의 상태가 CREATE_COMPLETE이면 AWS CloudFormation에서 스택 생성을 완료한 것이므로 해당 스택의 리소스를 사용할 수 있습니다.

샘플 WordPress 스택은 WordPress 웹 사이트를 생성합니다. WordPress 설치 스크립트를 실행하여 WordPress 설치를 계속해서 진행할 수 있습니다.

WordPress 설치를 완료하려면

  1. [Outputs] 탭의 [WebsiteURL] 행에서 [Value] 열에 있는 링크를 클릭합니다.

    WebsiteURL 출력 값은 이 스택으로 생성한 WordPress 웹 사이트에 대한 설치 스크립트의 URL입니다.

  2. WordPress 설치 웹 페이지에서 화면에 표시되는 지침에 따라 WordPress 설치를 완료합니다. WordPress 설치에 대한 자세한 내용은 http://codex.wordpress.org/Installing_WordPress를 참조하십시오.

    설치를 완료한 다음 로그인하면 대시보드로 연결되는데, 여기서 WordPress 블로그에 대한 추가 옵션을 설정할 수 있습니다. 그런 다음 AWS CloudFormation 템플릿을 사용하여 성공적으로 생성한 블로그에 게시물을 작성할 수 있습니다.

6단계: 정리

AWS CloudFormation 시작하기 작업을 마쳤습니다. 불필요한 서비스에 대해 요금이 청구되지 않도록 하려면 스택 및 리소스를 삭제하려 정리할 수 있습니다.

스택 및 스택의 리소스를 삭제하려면

  1. AWS CloudFormation 콘솔에서 MyWPTestStack 스택을 선택합니다.

  2. [Delete Stack]을 클릭합니다.

  3. 확인 메시지가 표시되면 [Yes, Delete]를 클릭합니다.

MyWPTestStack의 상태를 DELETE_IN_PROGRESS로 변경합니다. 스택 생성을 모니터링했던 것과 같은 방법으로 [Event] 탭을 사용하여 삭제를 모니터링할 수 있습니다. AWS CloudFormation에서 스택 삭제를 완료하면 목록에서 해당 스택이 제거됩니다.

축하합니다! 성공적으로 템플릿을 선택하고, 스택을 생성하고, 스택의 리소스를 보고 사용하고, 스택과 스택의 리소스를 삭제했습니다. 뿐만 아니라 AWS CloudFormation 템플릿을 사용하여 WordPress 블로그를 설치할 수 있게 되었습니다. 기타 템플릿은 AWS CloudFormation 샘플 템플릿 라이브러리에서 찾을 수 있습니다.

이제 쉽게 기존 템플릿을 수정하거나 고유한 템플릿을 생성할 수 있도록 템플릿에 대해 자세히 알아볼 차례입니다. 템플릿 기본 사항 알아보기