Amazon Simple Notification Service 지원 사용자 지정 리소스 - AWS CloudFormation

Amazon Simple Notification Service 지원 사용자 지정 리소스

Amazon SNS 주제를 사용자 지정 리소스와 연결할 때 Amazon SNS 알림을 사용하여 사용자 지정 프로비저닝 로직을 호출합니다. 사용자 지정 리소스와 Amazon SNS를 사용하면 스택에 새로운 리소스를 추가하고 동적 데이터를 스택에 주입하는 것과 같은 시나리오를 활성화할 수 있습니다. 예를 들어, 스택을 생성할 때 AWS CloudFormation은 Amazon Elastic Compute Cloud 인스턴스에서 실행 중인 애플리케이션이 모니터링하는 주제에 create 요청을 전송할 수 있습니다. Amazon SNS 알림은 허용 목록에 있는 탄력적 IP 주소의 풀 가져오기와 같은 추가 프로비저닝 태스크를 수행하도록 애플리케이션을 트리거합니다. 완료된 후 애플리케이션은 AWS CloudFormation에 스택 작업을 계속하도록 알리는 응답(및 출력 데이터)을 전송합니다.

연습: Amazon Simple Notification Service를 사용하여 사용자 지정 리소스 생성

이 연습에서는 사용자 지정 리소스 프로세스를 단계별로 진행하면서 사용자 지정 리소스 스택 생성, 업데이트 및 삭제의 결과로 전송되고 수신되는 이벤트 및 메시지 시퀀스를 설명합니다.

1단계: 스택 생성

  1. 템플릿 개발자는 사용자 지정 리소스가 포함된 AWS CloudFormation 스택을 생성합니다. 아래 템플릿 예제에서는 사용자 지정 리소스 유형 이름 Custom::SeleniumTester를 사용자 지정 리소스 MySeleniumTest에 사용합니다.

    사용자 지정 리소스 유형은 custom resource provider에서 정의되는 서비스 토큰, 선택적 공급자별 속성 및 선택적 Fn::GetAtt 속성을 사용하여 선언됩니다. 이러한 속성은 template developer에서 custom resource provider로 및 반대로 정보를 전달하는 데 사용할 수 있습니다. 사용자 지정 리소스 유형 이름은 영숫자여야 하며 최대 60자 길이일 수 있습니다.

    다음 예제에서는 사용자 지정 속성과 반환 속성이 모두 있는 템플릿을 보여 줍니다.

    { "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "MySeleniumTest" : { "Type": "Custom::SeleniumTester", "Version" : "1.0", "Properties" : { "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest", "seleniumTester" : "SeleniumTest()", "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ], "frequencyOfTestsPerHour" : [ "3", "2", "4" ] } } }, "Outputs" : { "topItem" : { "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] } }, "numRespondents" : { "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] } } } }
    참고

    공급자가 AWS CloudFormation에 응답하는 동안 사용자 지정 리소스 공급자는 Fn::GetAtt를 사용하여 액세스하는 데이터의 이름과 값을 반환합니다. custom resource provider가 타사인 경우 template developer는 custom resource provider에서 이러한 반환 값의 이름을 얻어야 합니다.

  2. AWS CloudFormation은 스택에 대한 정보, 스택 템플릿의 사용자 지정 리소스 속성 및 응답을 위한 S3 URL이 포함된 "RequestType" : "Create"를 사용하여 Amazon SNS 알림을 리소스 제공자에게 전송합니다.

    알림을 전송하는 데 사용되는 SNS 주제는 ServiceToken 속성의 템플릿에 포함됩니다. 하드 코딩된 값을 사용하지 않으려면 템플릿 개발자는 스택이 시작되는 시간에 값이 입력되도록 템플릿 파라미터를 사용할 수 있습니다.

    다음 예제에서는 CreateCustom::SeleniumTester를 사용하여 생성된 사용자 지정 리소스 유형 이름인 LogicalResourceId가 포함되어 있는 사용자 지정 리소스 MySeleniumTester 요청을 보여 줍니다.

    { "RequestType" : "Create", "ResponseURL" : "http://pre-signed-S3-url-for-response", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/stack-name/guid", "RequestId" : "unique id for this create request", "ResourceType" : "Custom::SeleniumTester", "LogicalResourceId" : "MySeleniumTester", "ResourceProperties" : { "seleniumTester" : "SeleniumTest()", "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ], "frequencyOfTestsPerHour" : [ "3", "2", "4" ] } }
  3. custom resource provider는 template developer에서 전송된 데이터를 처리하고 Create 요청이 성공적이었는지 여부를 결정합니다. 그런 다음 리소스 공급자는 AWS CloudFormation에서 전송된 S3 URL을 사용하여 SUCCESS 또는 FAILED의 응답을 전송합니다.

    응답 유형에 따라 다른 응답 필드가 AWS CloudFormation에서 예상됩니다. 처리 중인 RequestType에 대한 참조 주제의 응답 섹션을 참조하세요.

    생성 또는 업데이트 요청에 응답하여 custom resource provider는 응답의 데이터 필드에서 데이터 요소를 반환할 수 있습니다. 이러한 요소는 이름/값 페어이며, 이름은 스택 템플릿에서 사용자 지정 리소스와 함께 사용된 Fn::GetAtt 속성에 해당합니다. 은 템플릿 개발자가 속성 이름을 사용하여 리소스에서 Fn::GetAtt를 호출할 때 반환되는 데이터입니다.

    다음은 사용자 지정 리소스 응답의 예입니다.

    { "Status" : "SUCCESS", "PhysicalResourceId" : "Tester1", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/stack-name/guid", "RequestId" : "unique id for this create request", "LogicalResourceId" : "MySeleniumTester", "Data" : { "resultsPage" : "http://www.myexampledomain/test-results/guid", "lastUpdate" : "2012-11-14T03:30Z", } }

    요청의 StackId, RequestIdLogicalResourceId 필드를 정확히 복사해야 합니다.

  4. AWS CloudFormation은 스택 상태를 CREATE_COMPLETE 또는 CREATE_FAILED로 선언합니다. 스택이 성공적으로 생성된 경우 template developer는 Fn::GetAtt를 통해 생성된 사용자 지정 리소스의 출력 값에 액세스하여 해당 값을 사용할 수 있습니다.

    예를 들어, 그림에 사용된 사용자 지정 리소스 템플릿은 Fn::GetAtt를 사용하여 리소스 출력을 스택 출력에 복사했습니다.

    "Outputs" : { "topItem" : { "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] } }, "numRespondents" : { "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] } } }

Create 요청에 관련된 요청 및 응답 객체에 대한 자세한 내용을 알아보려면 사용자 지정 리소스 참조생성을 참조하세요.

2단계: 스택 업데이트

기존 스택을 업데이트하려면 아래 예제와 같이 스택에서 리소스의 속성에 대한 업데이트를 지정하는 템플릿을 제출해야 합니다. AWS CloudFormation은 템플릿에 지정된 변경 사항이 있는 리소스만 업데이트합니다. 스택 업데이트에 대한 자세한 내용은 AWS CloudFormation 스택 업데이트 단원을 참조하십시오.

기본 물리적 리소스를 교체해야 하는 사용자 지정 리소스를 업데이트할 수 있습니다. AWS CloudFormation 템플릿에서 사용자 지정 리소스를 업데이트할 경우 AWS CloudFormation에서 해당 사용자 지정 리소스에 업데이트 요청을 전송합니다. 사용자 지정 리소스에 교체가 필요한 경우, 새 사용자 지정 리소스는 새 물리적 ID로 응답을 전송해야 합니다. 응답을 수신한 AWS CloudFormation은 기존 및 신규 사용자 지정 리소스의 PhysicalResourceId를 비교합니다. 3단계: 스택 삭제 섹션에서 설명한 바와 같이, 두 값이 다른 경우 AWS CloudFormation은 업데이트를 교체로 인식하고 기존 리소스에 삭제 요청을 전송합니다.

참고

사용자 지정 리소스를 변경하지 않았으면 AWS CloudFormation은 스택 업데이트 중 리소스에 요청을 전송하지 않습니다.

  1. template developer는 사용자 지정 리소스가 포함된 스택에 대한 업데이트를 시작합니다. 업데이트 중 template developer는 스택 템플릿에서 새로운 속성을 지정할 수 있습니다.

    다음은 사용자 지정 리소스 유형을 사용하는 스택 템플릿에 대한 Update의 예입니다.

    { "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "MySeleniumTest" : { "Type": "Custom::SeleniumTester", "Version" : "1.0", "Properties" : { "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest", "seleniumTester" : "SeleniumTest()", "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com", "http://mynewsite.com" ], "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ] } } }, "Outputs" : { "topItem" : { "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] } }, "numRespondents" : { "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] } } } }
  2. AWS CloudFormation은 OldResourceProperties 필드에 기존 리소스 속성이 포함되고 ResourceProperties에 업데이트된(있는 경우) 리소스 속성이 포함된다는 점을 제외하고 Create 호출과 비슷한 정보가 포함되는 "RequestType" : "Update"를 사용하여 Amazon SNS 알림을 리소스 제공자에게 전송합니다.

    다음은 Update 요청의 예입니다.

    { "RequestType" : "Update", "ResponseURL" : "http://pre-signed-S3-url-for-response", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/stack-name/guid", "RequestId" : "uniqueid for this update request", "LogicalResourceId" : "MySeleniumTester", "ResourceType" : "Custom::SeleniumTester", "PhysicalResourceId" : "Tester1", "ResourceProperties" : { "seleniumTester" : "SeleniumTest()", "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com", "http://mynewsite.com" ], "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ] }, "OldResourceProperties" : { "seleniumTester" : "SeleniumTest()", "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ], "frequencyOfTestsPerHour" : [ "3", "2", "4" ] } }
  3. 사용자 지정 리소스 공급자는 AWS CloudFormation에서 전송된 데이터를 처리합니다. 사용자 지정 리소스는 업데이트를 수행하고 SUCCESS 또는 FAILED의 응답을 S3 URL에 전송합니다. 그런 다음 AWS CloudFormation은 기존 및 신규 사용자 지정 리소스의 PhysicalResourceIDs를 비교합니다. 값이 다른 경우 AWS CloudFormation은 업데이트에 교체가 필요하다고 인식하고 기존 리소스에 삭제 요청을 전송합니다. 다음 예제에서는 Update 요청에 대한 custom resource provider 응답을 보여줍니다.

    { "Status" : "SUCCESS", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/stack-name/guid", "RequestId" : "uniqueid for this update request", "LogicalResourceId" : "MySeleniumTester", "PhysicalResourceId" : "Tester2" }

    요청의 StackId, RequestIdLogicalResourceId 필드를 정확히 복사해야 합니다.

  4. AWS CloudFormation은 스택 상태를 UPDATE_COMPLETE 또는 UPDATE_FAILED로 선언합니다. 업데이트가 실패하면 스택은 롤백합니다. 스택이 성공적으로 업데이트된 경우 template developer는 Fn::GetAtt를 사용하여 생성된 사용자 지정 리소스의 새로운 출력 값에 액세스할 수 있습니다.

Update 요청에 관련된 요청 및 응답 객체에 대한 자세한 내용을 알아보려면 사용자 지정 리소스 참조업데이트를 참조하세요.

3단계: 스택 삭제

  1. 템플릿 개발자는 사용자 지정 리소스가 포함된 스택을 삭제합니다. AWS CloudFormation은 SNS 주제와 함께 스택 템플릿에 지정된 현재 속성을 가져오고, 사용자 지정 리소스 공급자에게 요청하기 위해 준비합니다.

  2. AWS CloudFormation은 스택에 대한 현재 정보, 스택 템플릿의 사용자 지정 리소스 속성 및 응답을 위한 S3 URL이 포함된 Amazon SNS를 사용하여 "RequestType" : "Delete" 알림을 리소스 제공자에게 전송합니다.

    스택을 삭제하거나 사용자 지정 리소스를 제거하거나 교체하는 업데이트를 수행할 때마다 AWS CloudFormation은 기존 및 신규 사용자 지정 리소스 간에 PhysicalResourceId를 비교합니다. 값이 다른 경우 다음 Delete 요청 예제와 같이 AWS CloudFormation은 업데이트를 교체로 인식하고 기존 리소스(OldPhysicalResource)에 대한 삭제 요청을 전송합니다.

    { "RequestType" : "Delete", "ResponseURL" : "http://pre-signed-S3-url-for-response", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/stack-name/guid", "RequestId" : "unique id for this delete request", "ResourceType" : "Custom::SeleniumTester", "LogicalResourceId" : "MySeleniumTester", "PhysicalResourceId" : "Tester1", "ResourceProperties" : { "seleniumTester" : "SeleniumTest()", "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com", "http://mynewsite.com" ], "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ] } }

    DescribeStackResource, DescribeStackResourcesListStackResources는 지정된 경우 사용자 정의 이름을 표시합니다.

  3. 사용자 지정 리소스 공급자는 AWS CloudFormation에서 전송된 데이터를 처리하고 Delete 요청이 성공적이었는지 여부를 결정합니다. 그런 다음 리소스 공급자는 AWS CloudFormation에서 전송된 S3 URL을 사용하여 SUCCESS 또는 FAILED의 응답을 전송합니다. 사용자 지정 리소스가 포함된 스택을 성공적으로 삭제하려면 custom resource provider에서 삭제 요청에 성공적으로 응답해야 합니다.

    다음은 Delete 요청에 대한 custom resource provider 응답의 예입니다.

    { "Status" : "SUCCESS", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/stack-name/guid", "RequestId" : "unique id for this delete request", "LogicalResourceId" : "MySeleniumTester", "PhysicalResourceId" : "Tester1" }

    요청의 StackId, RequestIdLogicalResourceId 필드를 정확히 복사해야 합니다.

  4. AWS CloudFormation은 스택 상태를 DELETE_COMPLETE 또는 DELETE_FAILED로 선언합니다.

Delete 요청에 관련된 요청 및 응답 객체에 대한 자세한 내용을 알아보려면 사용자 지정 리소스 참조삭제를 참조하세요.

다음 사항도 참조하십시오.