시작하기
올바른 템플릿을 사용하면 애플리케이션에 필요한 모든 AWS 리소스를 한 번에 배포할 수 있다. 이 단원에서는 WordPress 블로그에 필요한 리소스를 선언하고, WordPress 블로그를 스택으로 생성하고, 스택 생성 프로세스를 모니터링하고, 스택에서 해당 리소스를 검사한 다음 스택을 삭제하는 템플릿에 대해 살펴본다. 이러한 작업은 을 사용하여 완료한다.
1. 템플릿 선택
먼저, 스택에 필요한 리소스를 지정하는 템플릿이 필요하다. 이 단계에서는 이미 준비된 샘플 템플릿을 사용한다. 샘플 템플릿은 저장을 위해 로컬 MySQL 데이터베이스가 하나 있는 단일 Amazon EC2 인스턴스를 사용하는 기본 WordPress 블로그를 생성한다. 또한 이 템플릿은 Amazon EC2 인스턴스에 대한 방화벽 설정을 제어하기 위해 Amazon EC2 보안 그룹도 생성한다.
Warning
AWS CloudFormation은 무료이지만 CloudFormation에서 생성하는 AWS 리소스는 라이브이다(샌드박스 내에서 실행되지 않음). 이 자습서의 마지막 작업에서 이러한 리소스를 종료하지 않으면 해당 리소스에 대한 표준 사용 요금이 발생한다. 발생하는 총 요금은 매우 적다. 요금을 최소화할 수 있는 방법은 http://aws.amazon.com/free/를 참조한다.
템플릿을 보려면
- JSON 또는 YAML WordPress 샘플 템플릿을 볼 수 있다. 이 설명서의 후반부에서는 템플릿 URL을 사용할 것이기 때문에 템플릿을 다운로드할 필요가 없다. 템플릿 형식에 대한 자세한 내용은 AWS CloudFormation 템플릿 형식 단원을 참조한다.
템플릿은 JSON 또는 YAML 텍스트 파일로, 스택에서 생성하려는 AWS 리소스에 대한 구성 정보가 들어 있다. 이 연습을 위해 샘플 템플릿에는 AWSTemplateFormatVersion
, Description
, Parameters
, Mappings
, Resources
및 Outputs
, 이렇게 6개의 최상위 섹션이 포함되어 있지만 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"}}
]
}
},
...
},
예 YAML
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
, InstanceType
및 KeyName
과 같은 속성을 인식할 수 있다. 리소스 선언은 한 번에 모든 구성 설정을 지정할 수 있는 효율적인 방법이다. 템플릿에 리소스 선언을 삽입하면 스택을 생성하는 템플릿을 사용하여 선언된 모든 리소스를 생성 및 구성할 수 있다. 동일한 템플릿을 사용하여 리소스의 동일한 구성을 시작하는 새 스택을 생성한다.
리소스 선언은 리소스의 논리적 이름을 지정하는 문자열로 시작한다. 앞으로 살펴볼 것처럼 논리적 이름은 템플릿 내에서 리소스를 참조할 때 사용할 수 있다.
파라미터 섹션을 사용하여 스택을 생성할 때 템플릿으로 전달할 수 있는 값을 선언한다. 파라미터는 템플릿 자체에 저장하지 않으려는 사용자 이름 및 암호와 같은 민감한 정보를 지정하기 위한 효과적인 방법이다. 또한 배포 중인 특정 애플리케이션 또는 구성에 고유할 수 있는 정보(예: 도메인 이름 또는 인스턴스 이름)을 지정하는 방법이기도 한다. 이 단원의 후반부에서 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."
},
...
예 YAML
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
"WebServer" : {
"Type": "AWS::EC2::Instance",
"Properties": {
"KeyName" : { "Ref" : "KeyName" },
...
}
},
예 YAML
중괄호에는 KeyName
이 입력인 Ref 함수에 대한 호출이 들어 있다. Ref 함수는 자신이 참조하는 객체의 값을 반환한다. 이 경우, Ref 함수는 스택 생성 시 KeyName
에 대해 지정된 값으로 KeyName
속성을 설정한다.
또한 Ref 함수는 리소스의 속성을 다른 리소스의 값으로 설정할 수도 있다. 예를 들어, 리소스 선언 WebServer
에는 다음 속성 선언이 포함되어 있다.
예 JSON
"WebServer" : {
"Type": "AWS::EC2::Instance",
"Properties": {
...
"SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ],
...
}
},
예 YAML
SecurityGroups
속성은 EC2 보안 그룹의 목록을 가져온다. Ref 함수는 템플릿에서 보안 그룹의 논리적 이름인 WebServerSecurityGroup
의 입력을 포함하고, WebServerSecurityGroup
속성에 SecurityGroups
의 이름을 추가한다.
이 템플릿에는 매핑 섹션도 있다. 매핑을 사용하여 조회 테이블 문과 유사한 방식으로 평가되는 조건 값을 선언한다. 이 템플릿에서는 매핑을 사용하여 인스턴스 유형의 리전 및 아키텍처 유형에 올바른 Amazon 머신 이미지(AMI)를 선택한다. [출력(Outputs)]은 스택 생성 후 aws cloudformation describe-stacks
명령 및 CloudFormation 콘솔의 [출력(Outputs)] 탭을 통해 반환되는 사용자 지정 값을 정의한다. 출력 값을 사용하여 스택 내 리소스의 정보를 반환할 수 있다(예: 템플릿에서 생성된 웹 사이트의 URL). 매핑, 출력 및 템플릿에 대한 기타 항목은 템플릿 기본 사항 알아보기 단원에서 자세히 다룬다.
지금은 템플릿에 대해 이 정도만 알면 충분하다. 그럼, 스택 생성을 시작해 보자.
2. 스택에 필요한 항목을 준비했는지 확인
템플릿에서 스택을 생성하기 전에 템플릿에 필요한 모든 종속 리소스를 사용할 수 있는지 확인해야 한다. 템플릿은 기존 AWS 리소스 및 템플릿 자체에서 선언된 리소스를 둘 다 사용하거나 참조할 수 있다. CloudFormation에서는 템플릿 내 리소스에 대한 참조를 확인하고 기존 리소스에 대한 참조도 확인해 이러한 리소스가 스택을 생성하려는 리전에 존재하는지 확인한다. 템플릿이 존재하지 않는 종속 리소스를 참조하는 경우 스택 생성에 실패한다.
WordPress 예제 템플릿에는 템플릿에서 선언된 Amazon EC2 인스턴스에 사용되는 키 페어를 지정하는 입력 파라미터 KeyName
이 포함되어 있다. 이 템플릿은 템플릿에서 스택을 생성하여 KeyName
파라미터에 유효한 Amazon EC2 키 페어를 제공하는 사용자에게 종속된다. 유효한 키 페어 이름을 제공하면 스택이 성공적으로 생성된다. 유효한 키 페어 이름을 제공하지 못하면 스택이 롤백된다.
스택을 생성하기 전에 유효한 Amazon EC2 키 페어가 있는지 확인하고 해당 키 페어 이름을 기록해 둔다.
키 페어를 보려면 Amazon EC2 콘솔을 연 다음 탐색 창에서 [키 페어(Key Pairs)]를 선택한다.
Note
Amazon EC2 키 페어가 없는 경우 스택을 생성하는 리전과 동일한 리전에서 키 페어를 생성해야 한다. 키 페어를 생성하는 방법에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서의 SSH 키 페어 가져오기를 참조한다.
이제 유효한 키 페어가 있으므로 WordPress 템플릿을 사용해 스택을 생성해 보자.
3. 스택 생성
앞서 언급한 WordPress-1.0.0 파일을 기반으로 스택을 생성한다. 이 템플릿에는 EC2 인스턴스와 같은 여러 AWS 리소스가 들어 있다.
WordPress 스택을 생성하려면
-
AWS Management Console에 로그인한 다음 https://console.aws.amazon.com/cloudformation에서 AWS CloudFormation 콘솔을 연다.
-
새 CloudFormation 계정인 경우 [새 스택 생성(Create New Stack)]을 선택한다. 그렇지 않은 경우 스택 생성을 선택한다.
-
[템플릿(Template)] 섹션에서 [Amazon S3 템플릿 URL 지정(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
Note
S3 버킷에 저장된 AWS CloudFormation 템플릿은 스택을 생성하는 사용자가 액세스할 수 있어야 하며 생성 중인 스택과 동일한 리전에 있어야 한다. 따라서 us-east-2
리전에 S3 버킷이 있다면 해당 스택도 us-east-2
에 생성해야 한다.
-
세부 정보 지정 섹션의 이름 필드에 스택 이름을 입력한다. 이 예에서는
MyWPTestStack
를 사용한다. 스택 이름에는 공백이 있어서는 안 된다. -
파라미터 지정 페이지에 템플릿의 파라미터 섹션에서 가져온 파라미터가 보인다. DBUser, DBPassword, DBRootPassword 및 KeyName을 포함하여 기본값이 없는 모든 파라미터에 값을 제공해야 한다. KeyName 필드에 스택을 생성하는 리전과 동일한 리전에 있는 유효한 Amazon EC2 페어의 이름을 입력한다.
-
[Next]를 선택한다.
-
이 시나리오에서는 어떠한 태그도 추가하지 않는다. [Next]를 선택한다. 태그(키-값 페어임)는 스택을 식별하는 데 도움이 될 수 있다. 자세한 내용은 CloudFormation 스택에 태그 추가를 참조한다.
-
스택에 대한 정보를 검토한다. 설정에 만족하면 [생성(Create)]을 선택한다.
스택이 생성될 때까지 몇 분 가량 소요될 수 있는데 그냥 가만히 앉아서 기다리기에는 답답할 것이다. 따라서 스택 생성이 어떻게 진행되는지 확인하고 싶을 것이다.
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
스택을 선택한다. -
[Delete Stack]을 선택한다.
-
나타나는 확인 메시지에서 [예, 삭제합니다.(Yes, Delete)]를 선택한다.
MyWPTestStack
의 상태를 DELETE_IN_PROGRESS
로 변경한다. 스택 생성을 모니터링했던 것과 같은 방법으로 이벤트 탭을 사용하여 삭제를 모니터링할 수 있다. CloudFormation에서 스택 삭제를 완료하면 목록에서 해당 스택이 제거된다.
성공적으로 템플릿을 선택하고, 스택을 생성하고, 스택의 리소스를 보고 사용하고, 스택과 스택의 리소스를 삭제했다. 뿐만 아니라 CloudFormation 템플릿을 사용하여 WordPress 블로그를 설치할 수 있게 되었다. 기타 템플릿은 AWS CloudFormation 샘플 템플릿 라이브러리에서 찾을 수 있다.