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단계: 스택 생성
-
템플릿 개발자는 사용자 지정 리소스가 포함된 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에 응답하는 동안 사용자 지정 리소스 공급자는
를 사용하여 액세스하는 데이터의 이름과 값을 반환합니다. custom resource provider가 타사인 경우 template developer는 custom resource provider에서 이러한 반환 값의 이름을 얻어야 합니다.Fn::GetAtt
-
AWS CloudFormation은 스택에 대한 정보, 스택 템플릿의 사용자 지정 리소스 속성 및 응답을 위한 S3 URL이 포함된
"RequestType" : "Create"
를 사용하여 Amazon SNS 알림을 리소스 제공자에게 전송합니다.알림을 전송하는 데 사용되는 SNS 주제는
ServiceToken
속성의 템플릿에 포함됩니다. 하드 코딩된 값을 사용하지 않으려면 템플릿 개발자는 스택이 시작되는 시간에 값이 입력되도록 템플릿 파라미터를 사용할 수 있습니다.다음 예제에서는
Create
의Custom::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" ] } }
-
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
,RequestId
및LogicalResourceId
필드를 정확히 복사해야 합니다. -
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은 스택 업데이트 중 리소스에 요청을 전송하지 않습니다.
-
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"] } } } }
-
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" ] } }
-
사용자 지정 리소스 공급자는 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
,RequestId
및LogicalResourceId
필드를 정확히 복사해야 합니다. -
AWS CloudFormation은 스택 상태를
UPDATE_COMPLETE
또는UPDATE_FAILED
로 선언합니다. 업데이트가 실패하면 스택은 롤백합니다. 스택이 성공적으로 업데이트된 경우 template developer는
를 사용하여 생성된 사용자 지정 리소스의 새로운 출력 값에 액세스할 수 있습니다.Fn::GetAtt
Update
요청에 관련된 요청 및 응답 객체에 대한 자세한 내용을 알아보려면 사용자 지정 리소스 참조의 업데이트를 참조하세요.
3단계: 스택 삭제
-
템플릿 개발자는 사용자 지정 리소스가 포함된 스택을 삭제합니다. AWS CloudFormation은 SNS 주제와 함께 스택 템플릿에 지정된 현재 속성을 가져오고, 사용자 지정 리소스 공급자에게 요청하기 위해 준비합니다.
-
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
,DescribeStackResources
및ListStackResources
는 지정된 경우 사용자 정의 이름을 표시합니다. -
사용자 지정 리소스 공급자는 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
,RequestId
및LogicalResourceId
필드를 정확히 복사해야 합니다. -
AWS CloudFormation은 스택 상태를
DELETE_COMPLETE
또는DELETE_FAILED
로 선언합니다.
Delete
요청에 관련된 요청 및 응답 객체에 대한 자세한 내용을 알아보려면 사용자 지정 리소스 참조의 삭제를 참조하세요.