CloudFormation 템플릿에서 대기 조건 생성 - AWS CloudFormation

CloudFormation 템플릿에서 대기 조건 생성

중요

Amazon EC2 및 Auto Scaling 리소스의 경우 대기 조건 대신 CreationPolicy 속성을 사용하는 것이 좋습니다. 그러한 리소스에 CreationPolicy 속성을 추가하고 cfn-signal 헬퍼 스크립트를 사용하여 인스턴스 생성 프로세스가 완료되면 신호를 보내도록 합니다.

자세한 내용은 CreationPolicy 속성 또는 Amazon EC2에 애플리케이션 배포을 참조하세요.

AWS::CloudFormation::WaitConditionHandle 리소스와 CreationPolicy 속성 속성을 사용하여 다음을 수행할 수 있습니다.

  • 스택 생성 외부에서 수행되는 다른 구성 작업과 스택 리소스 생성을 조정

  • 구성 프로세스의 상태 추적

예를 들어, 애플리케이션 구성이 부분적으로 완료된 후 다른 리소스의 생성을 시작하거나, 설치 및 구성 프로세스 중 신호를 전송하여 진행을 추적할 수 있습니다.

대기 조건 핸들 사용

참고

VPC 엔드포인트 기능을 사용할 경우 대기 조건에 응답하는 VPC의 리소스가 AWS CloudFormation 고유의 Amazon Simple Storage Service(Amazon S3) 버킷에 액세스할 수 있어야 합니다. 리소스는 미리 서명된 Amazon S3 URL로 대기 조건 응답을 보내야 합니다. 응답을 Amazon S3에 보내지 못하면 AWS CloudFormation은 응답을 수신하지 않으며 스택 작업이 실패합니다. 자세한 내용은 인터페이스 엔드포인트를 사용하여 CloudFormation 액세스(AWS PrivateLink)Amazon S3의 VPC 엔드포인트에 대한 예제 버킷 정책을 참조하세요.

대기 조건 및 대기 조건 핸들을 사용하여 AWS CloudFormation에서 스택 생성을 일시 중지하고 스택 생성을 계속하기 전에 신호를 대기하도록 할 수 있습니다. 예를 들어, 해당 Amazon EC2 인스턴스의 생성을 완료로 간주하기 전에 Amazon EC2 인스턴스에서 애플리케이션을 다운로드하고 구성해야 할 수 있습니다.

다음 목록에서는 대기 조건이 대기 조건 핸들과 함께 작동하는 방식을 요약합니다.

  • AWS CloudFormation은 다른 리소스와 똑같이 대기 조건을 생성합니다. AWS CloudFormation은 대기 조건을 생성할 때 대기 조건의 상태를 CREATE_IN_PROGRESS로 보고하고 필요한 수의 성공 신호를 수신하거나 대기 조건의 제한 시간이 만료될 때까지 대기합니다. 제한 시간이 만료되기 전에 AWS CloudFormation이 필요한 수의 성공 신호를 수신할 경우 스택 생성을 계속합니다. 그렇지 않으면 대기 조건의 상태를 CREATE_FAILED(으)로 설정하고 스택을 롤백합니다.

  • Timeout 속성은 AWS CloudFormation이 필요한 수의 성공 신호를 대기하는 시간을 결정합니다. Timeout은 최소 경계 속성이므로, 제한 시간은 지정한 시간이 되자마자 발생하지만 잠시 후에 발생할 수도 있습니다. 지정할 수 있는 최대 시간은 43,200초(12시간)입니다.

  • 일반적으로 Amazon EC2 인스턴스, RDS DB 인스턴스 또는 Auto Scaling 그룹과 같은 특정 리소스를 생성한 후 즉시 대기 조건을 시작해야 합니다. DependsOn 속성을 대기 조건에 추가하여 이를 수행할 수 있습니다. DependsOn 속성을 대기 조건에 추가할 때는 특정 리소스 생성이 완료된 후에만 대기 조건이 생성되도록 지정합니다. 대기 조건이 생성되면 AWS CloudFormation은 제한 시간을 시작하고 성공 신호를 대기합니다.

  • 다른 리소스에서도 DependsOn 속성을 사용할 수 있습니다. 예를 들어, 먼저 Amazon RDS DB 인스턴스를 생성하고 해당 DB 인스턴스에서 데이터베이스를 구성한 후 해당 데이터베이스를 사용하는 EC2 인스턴스를 생성하려고 할 수 있습니다. 이 경우 DB 인스턴스를 지정하는 DependsOn 속성이 있는 대기 조건을 생성하고, 대기 조건을 지정하는 DependsOn 속성이 있는 EC2 인스턴스 리소스를 생성합니다. 이렇게 하면 DB 인스턴스와 대기 조건이 완료된 직후에만 EC2 인스턴스가 생성됩니다.

  • AWS CloudFormation은(는) 대기 조건에 대해 지정된 수의 성공 신호를 수신한 후에만 해당 대기 조건의 상태를 CREATE_COMPLETE(으)로 설정하여 스택 생성을 계속할 수 있습니다. 대기 조건의 Count 속성은 성공 신호 수를 지정합니다. 아무 값도 설정하지 않을 경우 기본값은 1입니다.

  • 신호 전송 메커니즘으로 사용되는 미리 서명된 URL을 설정하려면 대기 조건에 대기 조건 핸들이 필요합니다. 미리 서명된 URL을 사용하면 AWS 자격 증명을 제공할 필요 없이 신호를 전송할 수 있습니다. 미리 서명된 URL을 사용하여 JSON 문으로 캡슐화된 성공 또는 실패 신호를 전송합니다. 해당 JSON 문의 형식은 대기 조건 신호 JSON 형식 단원을 참조하십시오.

  • 제한 시간이 만료되기 전에 대기 조건이 필요한 수의 성공 신호(Count 속성에 정의됨)를 수신하면 AWS CloudFormation은(는) 대기 조건을 CREATE_COMPLETE(으)로 표시하고 스택 생성을 계속합니다. 그렇지 않으면 AWS CloudFormation은(는) 대기 조건을 실패로 처리하고 스택을 롤백합니다(예: 필요한 성공 신호 없이 제한 시간이 만료되거나 실패 신호가 수신되는 경우).

스택에서 대기 조건을 사용하려면:
  1. 스택의 템플릿에서 AWS::CloudFormation::WaitConditionHandle 리소스를 선언합니다. 대기 조건 핸들에는 속성이 없습니다. 하지만 WaitConditionHandle 리소스에 대한 참조는 WaitCondition에 성공 또는 실패 신호를 전송하는 데 사용할 수 있는 미리 서명된 URL로 확인됩니다. 예:

    "myWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle", "Properties" : { } }
  2. 스택의 템플릿에서 AWS::CloudFormation::WaitCondition 리소스를 선언합니다. WaitCondition 리소스에는 두 가지 필수 속성이 있습니다. Handle은(는) 템플릿에서 선언된 WaitConditionHandle에 대한 참조이고 Timeout은(는) AWS CloudFormation이(가) 대기할 시간(초)입니다. 선택적으로 Count 속성을 설정할 수 있습니다. 이 속성은 AWS CloudFormation이(가) 스택 생성을 다시 시작하기 전에 대기 조건이 수신해야 하는 성공 신호 수를 결정합니다.

    대기 조건이 트리거되는 시기를 제어하려면 대기 조건에서 DependsOn 속성을 설정합니다. DependsOn 절은 리소스를 대기 조건과 연결합니다. AWS CloudFormation은(는) DependsOn 리소스를 생성한 후 다음 이벤트 중 하나가 발생할 때까지 추가 스택 리소스 생성을 차단합니다. a) 제한 시간이 만료됨 b) 필요한 수의 성공 신호가 수신됨 c) 실패 신호가 수신됨.

    다음은 Ec2Instance 리소스를 성공적으로 생성한 후 시작되며, myWaitHandle 리소스를 WaitConditionHandle(으)로 사용하고, 제한 시간이 4,500초이며, 기본 Count이(가) 1인(Count 속성이 지정되지 않았기 때문) 대기 조건의 예입니다.

    "myWaitCondition" : { "Type" : "AWS::CloudFormation::WaitCondition", "DependsOn" : "Ec2Instance", "Properties" : { "Handle" : { "Ref" : "myWaitHandle" }, "Timeout" : "4500" } }
  3. 신호 전송에 사용할 미리 서명된 URL을 가져옵니다.

    템플릿에서 AWS::CloudFormation::WaitConditionHandle 리소스의 논리명을 Ref 내장 함수에 전달하여 미리 서명된 URL을 가져올 수 있습니다. 예를 들어 AWS::EC2::Instance 리소스의 UserData 속성을 사용하여 미리 서명된 URL을 Amazon EC2 인스턴스에 전달하여 해당 인스턴스에서 실행되는 스크립트나 애플리케이션이 AWS CloudFormation에 성공 또는 실패 신호를 전송할 수 있습니다.

    "UserData" : { "Fn::Base64" : { "Fn::Join" : [ "", ["SignalURL=", { "Ref" : "myWaitHandle" } ] ] } }

    참고: AWS Management Console 또는 AWS CloudFormation 명령줄 도구에서 미리 서명된 URL은 대기 조건 핸들 리소스의 물리적 ID로 표시됩니다.

  4. 스택이 대기 조건으로 전환되는 시간을 감지하기 위한 메서드를 선택합니다.

    알림이 활성화된 상태로 스택을 생성하면 AWS CloudFormation은 모든 스택 이벤트에 대한 알림을 지정된 주제에 게시합니다. 사용자나 사용자의 애플리케이션이 해당 주제를 구독하는 경우 알림에서 대기 조건 핸들 행성 이벤트를 모니터링하고 알림 메시지에서 미리 서명된 URL을 가져올 수 있습니다.

    또한 AWS Management Console, AWS CloudFormation 명령줄 도구 또는 AWS CloudFormation API를 사용하여 스택의 이벤트를 모니터링할 수도 있습니다.

  5. 미리 서명된 URL을 사용하여 성공 또는 실패 신호를 전송합니다.

    신호를 전송하려면 미리 서명된 URL을 사용하여 HTTP 요청 메시지를 전송합니다. 요청 메서드는 PUT이어야 하며 Content-Type 헤더는 빈 문자열이거나 생략되어야 합니다. 요청 메시지는 대기 조건 신호 JSON 형식에 지정된 형식의 JSON 구조여야 합니다.

    AWS CloudFormation이(가) 스택 생성을 계속하려면 Count 속성으로 지정된 수의 성공 신호를 전송해야 합니다. Count이(가) 1보다 큰 경우 특정 대기 조건에 전송된 모든 신호에서 각 신호의 UniqueId 값이 고유해야 합니다. UniqueId은(는) 임의의 영숫자 문자열입니다.

    curl 명령은 신호를 전송하는 한 가지 방법입니다. 다음 예에서는 대기 조건에 성공 신호를 전송하는 curl 명령줄을 보여 줍니다.

    $ curl -T /tmp/a \ "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aaws-region%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"

    이때 file /tmp/a에는 다음과 같은 JSON 구조가 포함되어 있습니다.

    { "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://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aaws-region%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"

대기 조건 신호 JSON 형식

대기 조건에 신호를 전송할 때는 다음 JSON 형식을 사용해야 합니다.

{ "Status" : "StatusValue", "UniqueId" : "Some UniqueId", "Data" : "Some Data", "Reason" : "Some Reason" }

위치:

StatusValue는 다음 값 중 하나여야 합니다.

  • SUCCESS는 성공 신호를 나타냅니다.

  • FAILURE는 실패 신호를 나타내며 실패한 대기 조건과 스택 롤백을 트리거합니다.

UniqueId는 AWS CloudFormation으로 전송되는 신호를 식별합니다. 대기 조건의 Count 속성이 1보다 큰 경우 UniqueId 값은 특정 대기 조건에 대해 전송된 모든 신호에서 고유해야 합니다. 그렇지 않으면 AWS CloudFormation은(는) 신호를 동일한 UniqueId을(를) 사용하여 이전에 전송한 신호의 재전송으로 간주하고 신호를 무시합니다.

Data은(는) 신호와 함께 다시 전송하려는 모든 정보입니다. 템플릿 내에서 Fn::GetAtt 함수를 호출하여 Data 값에 액세스할 수 있습니다. 예를 들어 대기 조건 mywaitcondition에 대해 다음 출력값을 생성하는 경우 aws cloudformation describe-stacks 명령, DescribeStacks 작업 또는 AWS CloudFormation 콘솔의 출력 탭을 사용하여 AWS CloudFormation에 전송된 유효한 신호별로 전송된 Data를 확인할 수 있습니다.

"WaitConditionData" : { "Value" : { "Fn::GetAtt" : [ "mywaitcondition", "Data" ]}, "Description" : "The data passed back as part of signalling the WaitCondition" },

Fn::GetAtt 함수UniqueId와(과) Data을(를) JSON 구조 내 이름/값 쌍으로 반환합니다. 다음은 위에서 정의한 WaitConditionData 출력값으로 반환되는 Data 속성의 예입니다.

{"Signal1":"Application has completed configuration."}

Reason은 콘텐츠에 대해 JSON 규정 이외의 다른 제한 사항이 없는 문자열입니다.