CloudFormation 템플릿에서 대기 조건 생성
이 주제에서는 템플릿에서 대기 조건을 생성하여 스택 리소스의 생성을 조정하고 구성 프로세스의 진행을 추적하는 방법을 설명합니다. 예를 들어, 애플리케이션 구성이 부분적으로 완료된 후 다른 리소스의 생성을 시작하거나, 설치 및 구성 프로세스 중 신호를 전송하여 진행을 추적할 수 있습니다.
CloudFormation에서 대기 조건이 포함된 스택을 생성하는 경우
-
다른 리소스와 마찬가지로 대기 조건을 생성하고 대기 조건의 상태를
CREATE_IN_PROGRESS
로 설정합니다. -
CloudFormation은 필요한 수의 성공 신호를 수신하거나 대기 조건의 제한 기간이 만료될 때까지 기다립니다.
-
제한 기간이 만료되기 전에 필요한 수의 성공 신호를 수신하는 경우
-
대기 조건 상태가
CREATE_COMPLETE
로 변경됨 -
스택 생성이 계속됨
-
-
제한 시간이 만료되거나 실패 신호가 수신되는 경우
-
대기 조건 상태가
CREATE_FAILED
로 변경됨 -
스택 롤백
-
중요
Amazon EC2 및 Auto Scaling 리소스의 경우 대기 조건 대신 CreationPolicy 속성을 사용하는 것이 좋습니다. 그러한 리소스에 CreationPolicy 속성을 추가하고 cfn-signal 헬퍼 스크립트를 사용하여 인스턴스 생성 프로세스가 완료되면 신호를 보내도록 합니다.
자세한 내용은 CreationPolicy 속성 또는 Amazon EC2에 애플리케이션 배포을 참조하세요.
참고
AWS PrivateLink를 사용하는 경우 대기 조건에 응답하는 VPC의 리소스는 CloudFormation의 Amazon Simple Storage Service(Amazon S3) 버킷에 대해 액세스 권한이 있어야 합니다. 리소스는 미리 서명된 Amazon S3 URL로 대기 조건 응답을 보내야 합니다. Amazon S3에 응답을 보내지 못하면 CloudFormation이 응답을 수신하지 않고 스택 작업이 실패합니다. 자세한 내용은 인터페이스 엔드포인트를 사용하여 CloudFormation 액세스(AWS PrivateLink) 및 버킷 정책을 사용하여 VPC 엔드포인트에서 액세스 제어를 참조하세요.
템플릿에서 대기 조건 생성
1. 대기 조건 핸들
스택의 템플릿에서 AWS::CloudFormation::WaitConditionHandle 리소스를 정의하는 것으로 시작합니다. 이 리소스는 신호를 보내는 데 필요한 미리 서명된 URL을 생성합니다. 이를 사용하면 AWS 자격 증명을 제공할 필요 없이 신호를 전송할 수 있습니다. 예시:
Resources:
MyWaitHandle
: Type: AWS::CloudFormation::WaitConditionHandle
2. 대기 조건
다음으로, 스택의 템플릿에서 AWS::CloudFormation::WaitCondition 리소스를 정의합니다. AWS::CloudFormation::WaitCondition
의 기본 구조는 다음과 같습니다.
MyWaitCondition
: Type: AWS::CloudFormation::WaitCondition Properties: Handle:String
Timeout:String
Count:Integer
AWS::CloudFormation::WaitCondition
리소스에는 2개의 필수 속성과 1개의 선택적 속성이 있습니다.
-
Handle
(필수) - 템플릿에 선언된WaitConditionHandle
에 대한 참조입니다. -
Timeout
(필수) - CloudFormation이 필요한 수의 신호를 수신할 때까지 대기하는 시간(초)입니다.Timeout
은 최소 경계 속성이므로, 제한 시간은 지정한 시간이 되자마자 발생하지만 잠시 후에 발생할 수도 있습니다. 지정할 수 있는 최대 시간은 43,200초(12시간)입니다. -
Count
(선택 사항) - CloudFormation이 해당 대기 조건의 상태를CREATE_COMPLETE
로 설정하고 스택 생성을 재개하기 전에 수신해야 하는 성공 신호 수입니다. 지정하지 않은 경우 기본값은 1입니다.
일반적으로 특정 리소스가 생성된 직후에 대기 조건이 시작되기를 원합니다. DependsOn 속성을 대기 조건에 추가하여 이를 수행할 수 있습니다. 대기 조건에 DependsOn
속성을 추가하면 CloudFormation은 먼저 DependsOn
속성에 리소스를 생성한 다음 대기 조건을 생성합니다.
다음 예제는 다음과 같은 대기 조건을 보여줍니다.
-
MyEC2Instance
리소스가 성공적으로 생성된 후 시작 -
WaitConditionHandle
로MyWaitHandle
리소스 사용 -
제한 시간 4,500초
-
기본
Count
1(Count
속성이 지정되지 않았기 때문)
MyWaitCondition
: Type: AWS::CloudFormation::WaitCondition DependsOn:MyEC2Instance
Properties: Handle:!Ref MyWaitHandle
Timeout:'4500'
3. 신호 전송
CloudFormation에 성공 또는 실패를 알리기 위해 일반적으로 일부 코드 또는 스크립트를 실행합니다. 예를 들어 EC2 인스턴스에서 실행되는 애플리케이션은 몇 가지 추가 구성 태스크를 수행한 다음 CloudFormation에 완료를 나타내는 신호를 전송할 수 있습니다.
대기 조건 핸들에 의해 생성된 미리 서명된 URL로 신호가 전송되어야 합니다. 미리 서명된 URL을 사용하여 성공 또는 실패를 알립니다.
신호를 전송하려면 다음을 수행하세요.
-
템플릿 내에서 미리 서명된 URL을 검색하려면 대기 조건 핸들의 논리명과 함께
Ref
내장 함수를 사용합니다.다음 예제와 같이 템플릿은 Amazon EC2
UserData
속성을 사용하여 Amazon EC2 인스턴스를 선언하고 미리 서명된 URL을 Amazon EC2 인스턴스에 전달할 수 있습니다. 이를 통해 해당 인스턴스에서 실행되는 스크립트 또는 애플리케이션이 CloudFormation에 성공 또는 실패를 알릴 수 있습니다.MyEC2Instance
: Type: AWS::EC2::Instance Properties: InstanceType:t2.micro
# Example instance type ImageId:ami-055e3d4f0bbeb5878
# Change this as needed (Amazon Linux 2023 in us-west-2) UserData: Fn::Base64: Fn::Join: - "" - -"SignalURL="
- { "Ref":"MyWaitHandle"
}결과로 다음과 유사한
UserData
출력이 반환됩니다.SignalURL=https://amzn-s3-demo-bucket.s3.amazonaws.com/....
참고: AWS Management Console 및 명령줄 도구에서 미리 서명된 URL은 대기 조건 핸들 리소스의 물리적 ID로 표시됩니다.
-
(선택 사항) 스택이 대기 조건에 들어가는 시점을 감지하려면 다음 방법 중 하나를 사용합니다.
-
알림이 활성화된 상태로 스택을 생성하면 CloudFormation은 모든 스택 이벤트에 대한 알림을 지정된 주제에 게시합니다. 사용자나 사용자의 애플리케이션이 해당 주제를 구독하는 경우 알림에서 대기 조건 핸들 행성 이벤트를 모니터링하고 알림 메시지에서 미리 서명된 URL을 가져올 수 있습니다.
-
AWS Management Console, AWS CLI 또는 SDK를 사용하여 스택의 이벤트를 모니터링할 수도 있습니다.
-
-
신호를 전송하려면 미리 서명된 URL을 사용하여 HTTP 요청 메시지를 전송합니다. 요청 메서드는
PUT
이어야 하며Content-Type
헤더는 빈 문자열이거나 생략되어야 합니다. 요청 메시지는 대기 조건 신호 구문에 지정된 형식의 JSON 구조여야 합니다.CloudFormation에서 스택 생성을 계속하려면
Count
속성으로 지정된 수의 성공 신호를 전송해야 합니다.Count
이(가) 1보다 큰 경우 특정 대기 조건에 전송된 모든 신호에서 각 신호의UniqueId
값이 고유해야 합니다.UniqueId
은(는) 임의의 영숫자 문자열입니다.curl
명령은 신호를 전송하는 한 가지 방법입니다. 다음 예에서는 대기 조건에 성공 신호를 전송하는curl
명령줄을 보여 줍니다.$
curl -T/tmp/a
\"https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
이때
파일에는 다음과 같은 JSON 구조가 포함되어 있습니다./tmp/a
{ "Status" :
"SUCCESS"
, "Reason" :"Configuration Complete"
, "UniqueId" :"ID1234"
, "Data" :"Application has completed configuration."
}이 예에서는 명령줄에서 JSON 구조를 파라미터로 전송하는 경우를 제외하고 동일한 성공 신호를 전송하는
curl
명령줄을 보여줍니다.$
curl -X PUT \ -H 'Content-Type:' --data-binary'{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}'
\"https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
대기 조건 신호 구문
대기 조건 핸들에 의해 생성된 URL로 신호를 전송할 때는 다음 JSON 형식을 사용해야 합니다.
{ "Status" :
"StatusValue"
, "UniqueId" :"Some UniqueId"
, "Data" :"Some Data"
, "Reason" :"Some Reason"
}
속성
Status
필드는 다음 값 중 하나여야 합니다.
-
SUCCESS
-
FAILURE
UniqueId
필드는 CloudFormation에 대한 신호를 식별합니다. 대기 조건의 Count
속성이 1보다 큰 경우 UniqueId
값은 특정 대기 조건에 대해 전송된 모든 신호에서 고유해야 합니다. 그렇지 않으면 CloudFormation은 신호를 동일한 UniqueId
로 이전에 전송된 신호를 재전송한 것으로 간주하고 무시합니다.
Data
필드에는 신호와 함께 다시 전송하려는 모든 정보가 포함될 수 있습니다. 템플릿 내에서 Fn::GetAtt 함수를 사용하여 Data
값에 액세스할 수 있습니다.
Reason
필드는 콘텐츠에 대해 JSON 규정 이외의 다른 제한 사항이 없는 문자열입니다.
신호 데이터에 액세스
유효한 신호에서 전송된 데이터에 액세스하려면 CloudFormation 템플릿에서 대기 조건에 대한 출력 값을 생성할 수 있습니다. 예시:
Outputs:
WaitConditionData
: Description:The data passed back as part of signalling the WaitCondition
Value: !GetAttMyWaitCondition
.Data
그런 다음 describe-stacks 명령이나 CloudFormation 콘솔의 출력 탭을 사용하여 이 데이터를 볼 수 있습니다.
Fn::GetAtt
함수는 UniqueId
와 Data
를 JSON 구조 내 이름/값 페어로 반환합니다. 예시:
{"Signal1":"Application has completed configuration."}