연습: 첫 번째 스택 생성
이 연습에서는 EC2 인스턴스에서 WordPress 블로그 사이트를 호스팅하기 위한 리소스를 생성하는 샘플 템플릿을 사용하여 CloudFormation 스택을 생성합니다.
이 샘플 템플릿은 EC2 인스턴스를 생성합니다. AWS CloudFormation은 무료이지만 CloudFormation에서 생성하는 AWS 리소스는 라이브이며 샌드박스에서 실행되지 않습니다. 따라서 유휴 상태로 유지되더라도 인스턴스를 시작하는 시점부터 스택을 삭제하고 인스턴스를 종료할 때까지(이 연습의 최종 작업) 스탠다드 Amazon EC2 사용료가 발생합니다. Amazon EC2 요금에 대한 자세한 내용은 Amazon EC2 요금
1단계: 템플릿 보기
JSON
샘플 템플릿은 저장을 위해 로컬 MySQL 데이터베이스가 하나 있는 단일 Amazon EC2 인스턴스를 사용하는 기본 WordPress 블로그를 생성합니다. 또한 Amazon EC2 인스턴스에 대한 방화벽 설정을 제어하기 위해 Amazon EC2 보안 그룹을 생성합니다.
샘플 템플릿에는 AWSTemplateFormatVersion
, Description
, Parameters
, Mappings
, Resources
, Outputs
라는 6개의 최상위 섹션이 포함되어 있습니다. 하지만 Resources
섹션만 필요합니다.
Resources
섹션에는 이 템플릿으로 생성하려는 AWS 리소스에 대한 정의가 포함됩니다. 각 리소스는 개별적으로 나열되며 특정 리소스를 생성하는 데 필수인 속성을 지정합니다. 다음 리소스 선언은 EC2 인스턴스에 대한 구성으로, 이 예에서는 논리적 이름 WebServer
을 포함하고 있습니다.
예 JSON
"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"}} ] } }, ... },
이전에 EC2 인스턴스를 만든 경우에는 해당 인스턴스의 구성을 결정하는 ImageId
, InstanceType
및 KeyName
과 같은 속성을 인식할 수 있습니다. 리소스 선언은 한 번에 모든 구성 설정을 지정할 수 있는 효율적인 방법입니다. 템플릿에 리소스 선언을 삽입하면 스택을 생성하는 템플릿을 사용하여 선언된 모든 리소스를 생성 및 구성할 수 있습니다. 동일한 템플릿을 사용하여 리소스의 동일한 구성을 시작하는 새 스택을 생성합니다.
리소스 선언은 리소스의 논리적 이름을 지정하는 문자열로 시작합니다. 앞으로 살펴볼 것처럼 논리적 이름은 템플릿 내에서 리소스를 참조할 때 사용할 수 있습니다.
Parameters
섹션을 사용하여 스택을 생성할 때 템플릿으로 전달할 수 있는 값을 선언합니다. 파라미터는 템플릿 자체에 저장하지 않으려는 사용자 이름 및 암호와 같은 민감한 정보를 지정하기 위한 효과적인 방법입니다. 또한 배포 중인 특정 애플리케이션 또는 구성에 고유할 수 있는 정보(예: 도메인 이름 또는 인스턴스 이름)을 지정하는 방법이기도 합니다. 이 섹션의 후반부에서 WordPress 스택을 생성하면 템플릿에 선언된 파라미터 세트가 스택 생성 마법사의 스택 세부 정보 지정 페이지에 표시됩니다. 여기서 스택을 생성하기 전에 파라미터를 지정할 수 있습니다.
다음 파라미터는 템플릿에서 EC2 인스턴스의 속성에 사용되는 값을 지정하기 위해 사용됩니다.
예 JSON
"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." }, ...
WebServer
리소스 선언에는 KeyName
파라미터로 지정된 KeyName
속성이 있습니다.
예 JSON
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { "KeyName" : { "Ref" : "KeyName" }, ... } },
중괄호에는 KeyName
이 입력인 Ref
내장 함수에 대한 호출이 들어 있습니다. Ref
함수는 자신이 참조하는 객체의 값을 반환합니다. 이 경우 Ref
함수는 스택 생성 시 KeyName
에 대해 지정된 값으로 KeyName
속성을 설정합니다.
또한 Ref
함수는 리소스의 속성을 다른 리소스의 값으로 설정할 수도 있습니다. 예를 들어, 리소스 선언 WebServer
에는 다음 속성 선언이 포함되어 있습니다.
예 JSON
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { ... "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], ... } },
SecurityGroups
속성은 EC2 보안 그룹의 목록을 가져옵니다. Ref
함수는 템플릿에서 보안 그룹의 논리명인 WebServerSecurityGroup
의 입력을 포함하고, SecurityGroups
속성에 WebServerSecurityGroup
의 이름을 추가합니다.
이 템플릿에는 Mappings
섹션도 있습니다. 매핑을 사용하여 조회 테이블 문과 유사한 방식으로 평가되는 조건 값을 선언합니다. 템플릿은 매핑을 사용하여 리전에 맞는 올바른 Amazon Machine Image(AMI)와 인스턴스 유형에 맞는 아키텍처 유형을 선택합니다. Outputs
는 describe-stacks CLI 명령과 스택 생성 후 CloudFormation 콘솔 출력 탭에서 반환되는 사용자 지정 값을 정의합니다. 출력 값을 사용하여 스택 내 리소스의 정보를 반환할 수 있습니다(예: 템플릿에서 생성된 웹 사이트의 URL). 매핑, 출력 및 템플릿에 대한 기타 항목은 CloudFormation 템플릿 섹션 단원에서 자세히 다룹니다.
지금은 템플릿에 대해 이 정도만 알면 충분합니다. 그럼, 스택 생성을 시작해 보겠습니다.
2단계: 스택 시작 준비
템플릿에서 스택을 생성하기 전에 템플릿에 필요한 모든 종속 리소스를 사용할 수 있는지 확인해야 합니다. 템플릿은 기존의 AWS 리소스와 템플릿 자체에 선언된 리소스를 모두 사용하거나 참조할 수 있습니다. CloudFormation에서는 템플릿 내 리소스에 대한 참조를 확인하고 기존 리소스에 대한 참조도 확인해 이러한 리소스가 스택을 생성하려는 AWS 리전에 존재하는지 확인합니다. 템플릿이 존재하지 않는 종속 리소스를 참조하는 경우 스택 생성에 실패합니다.
WordPress 예제 템플릿에는 템플릿에서 선언된 Amazon EC2 인스턴스에 사용되는 키 페어를 지정하는 입력 파라미터 KeyName
이 포함되어 있습니다. 이 템플릿은 템플릿에서 스택을 생성하여 KeyName
파라미터에 유효한 Amazon EC2 키 페어를 제공하는 사용자에게 종속됩니다. 유효한 키 페어 이름을 제공하면 스택이 성공적으로 생성됩니다. 유효한 키 페어 이름을 제공하지 못하면 스택이 롤백됩니다.
스택을 생성하기 전에 유효한 Amazon EC2 키 페어가 있는지 확인하고 해당 키 페어 이름을 기록해 둡니다.
키 페어를 보려면 Amazon EC2 콘솔을 연 다음 탐색 창에서 [키 페어(Key Pairs)]를 선택합니다. Amazon EC2 키 페어가 없는 경우 스택을 생성하는 AWS 리전과 동일한 리전에서 키 페어를 생성해야 합니다. 키 페어를 생성하는 방법에 대한 자세한 내용은 Amazon EC2 사용 설명서의 Amazon EC2 인스턴스에 대한 키 페어 생성을 참조하세요.
3단계: 스택 생성
앞서 언급한 WordPress-1.0.0 파일을 기반으로 스택을 생성합니다. 이 템플릿에는 EC2 인스턴스와 같은 여러 AWS 리소스가 들어 있습니다.
WordPress 스택을 생성하려면
AWS Management Console에 로그인하여 https://console.aws.amazon.com/cloudformation
에서 AWS CloudFormation 콘솔을 엽니다. -
스택 생성을 선택합니다.
-
템플릿 섹션에서 Amazon S3 템플릿 URL을 선택해 샘플 WordPress 템플릿의 URL을 입력하거나 붙여 넣은 후 다음을 선택합니다.
https://s3.us-west-2.amazonaws.com/cloudformation-templates-us-west-2/WordPress_Single_Instance.template
참고
S3 버킷에 저장된 CloudFormation 템플릿은 스택을 생성하는 사용자가 액세스할 수 있습니다.
-
스택 세부 정보 지정 섹션의 스택 이름 필드에 이름을 입력합니다.
MyWPTestStack
를 입력하세요. 스택 이름에는 공백이 있어서는 안 됩니다. -
파라미터 섹션에서 DBUser, DBPassword, DBRootPassword, KeyName을 포함하여 기본값이 없는 모든 파라미터에 대한 값을 제공해야 합니다. KeyName 필드에 스택을 생성하는 AWS 리전과 동일한 리전에 있는 유효한 Amazon EC2 페어의 이름을 입력합니다.
-
Next(다음)를 선택합니다.
-
이 시나리오에서는 어떠한 태그도 추가하지 않습니다. Next(다음)를 선택합니다. 태그(키-값 페어임)는 스택을 식별하는 데 도움이 될 수 있습니다. 자세한 내용은 스택 옵션 구성 단원을 참조하십시오.
-
스택에 대한 정보를 검토합니다. 설정에 만족하면 제출을 클릭합니다.
스택이 생성될 때까지 몇 분 가량 소요될 수 있는데 그냥 가만히 앉아서 기다리기에는 답답할 것입니다. 따라서 스택 생성이 어떻게 진행되는지 확인하고 싶을 것입니다.
4단계: 스택 생성 진행 상황 모니터링
[스택 생성(Create Stack)] 마법사를 완료하면 CloudFormation에서는 템플릿에 지정된 리소스를 생성하기 시작합니다. CloudFormation 콘솔의 윗부분에 있는 목록에 새로운 스택 MyWPTestStack이 나타납니다. 이 스택의 상태는 CREATE_IN_PROGRESS여야 합니다. 스택의 이벤트를 보고 스택에 대한 자세한 상태를 확인할 수 있습니다.
스택에 대한 이벤트를 보려면
-
CloudFormation 콘솔의 목록에서 MyWPTestStack 스택을 선택합니다.
-
스택 세부 정보 창에서 [이벤트(Events)] 탭을 선택합니다.
콘솔은 60초마다 최신 이벤트로 이벤트 목록을 자동으로 새로 고칩니다.
이벤트 탭에는 스택을 생성하는 각 주요 단계가 각 이벤트의 시간 순으로 정렬되어 표시됩니다. 즉, 최신 이벤트가 맨 위에 표시됩니다.
(이벤트 목록의 맨 아래 있는) 첫 번째 이벤트가 스택 생성 프로세스의 시작입니다.
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 이벤트는 CloudFormation에서 리소스 생성이 시작되었다고 보고할 때 로깅됩니다. CREATE_COMPLETE 이벤트는 리소스를 성공적으로 생성한 경우에 로깅됩니다.
CloudFormation에서 스택을 성공적으로 생성하면 [이벤트(Events)] 탭 맨 위에 다음 이벤트가 표시됩니다.
2013-04-24 19:17 UTC-7 CREATE_COMPLETE AWS::CloudFormation::Stack
MyWPTestStack
CloudFormation에서 리소스를 생성할 수 없는 경우 CREATE_FAILED 이벤트를 보고하고 기본적으로 스택을 롤백한 다음 생성된 리소스를 모두 삭제합니다. 상태 사유 열에는 실패를 일으키는 문제가 표시됩니다.
5단계: 스택 리소스 사용
MyWPTestStack 스택의 상태가 CREATE_COMPLETE이면 CloudFormation에서 스택 생성을 완료한 것이므로 해당 스택의 리소스를 사용할 수 있습니다.
샘플 WordPress 스택은 WordPress 웹 사이트를 생성합니다. WordPress 설치 스크립트를 실행하여 WordPress 설치를 계속해서 진행할 수 있습니다.
WordPress 설치를 완료하려면
-
[출력(Outputs)] 탭의 [WebsiteURL] 행에서 [값(Value)] 열에 있는 링크를 선택합니다.
WebsiteURL 출력 값은 이 스택으로 생성한 WordPress 웹 사이트에 대한 설치 스크립트의 URL입니다.
-
WordPress 설치 웹 페이지에서 화면에 표시되는 지침에 따라 WordPress 설치를 완료합니다. WordPress 설치에 대한 자세한 내용은 https://wordpress.org/support/article/how-to-install-wordpress/
를 참조하세요. 설치를 완료한 다음 로그인하면 대시보드로 연결되는데, 여기서 WordPress 블로그에 대한 추가 옵션을 설정할 수 있습니다. 그런 다음 CloudFormation 템플릿을 사용하여 성공적으로 생성한 블로그에 게시물을 작성할 수 있습니다.
6단계: 정리
CloudFormation 시작하기 작업을 마쳤습니다. 불필요한 서비스에 대해 요금이 청구되지 않도록 하려면 스택 및 리소스를 삭제하려 정리할 수 있습니다.
스택 및 스택의 리소스를 삭제하려면
-
CloudFormation 콘솔에서 MyWPTestStack 스택을 선택합니다.
-
[스택 삭제]를 선택합니다.
-
나타나는 확인 메시지에서 [예, 삭제합니다.(Yes, Delete)]를 선택합니다.
그러면 MyWPTestStack의 상태가 DELETE_IN_PROGRESS로 변경됩니다. 스택 생성을 모니터링했던 것과 같은 방법으로 이벤트 탭을 사용하여 삭제를 모니터링할 수 있습니다. CloudFormation에서 스택 삭제를 완료하면 목록에서 해당 스택이 제거됩니다.
축하합니다! 성공적으로 템플릿을 선택하고, 스택을 생성하고, 스택의 리소스를 보고 사용하고, 스택과 스택의 리소스를 삭제했습니다. 이제 기존 템플릿을 수정하거나 고유한 템플릿을 생성할 수 있도록 템플릿에 대해 자세히 알아볼 차례입니다. CloudFormation 템플릿 작업