Amazon SNS 지원 사용자 지정 리소스 - AWS CloudFormation

Amazon SNS 지원 사용자 지정 리소스

다음 주제는 CloudFormation이 요청을 보내는 Amazon SNS 주제를 지정하는 서비스 토큰으로 사용자 지정 리소스를 구성하는 방법을 보여줍니다. 또한 사용자 지정 리소스 스택 생성, 업데이트 및 삭제의 결과로 전송 및 수신되는 이벤트 및 메시지 시퀀스를 학습합니다.

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

Amazon SNS 주제를 사용자 지정 리소스의 대상으로 지정하면 CloudFormation은 사용자 지정 리소스와 연관된 스택 작업 도중 지정된 SNS 주제에 메시지를 전송합니다. 이러한 메시지를 처리하고 필요한 작업을 수행하려면 지원되는 엔드포인트에서 SNS 주제를 구독해야 합니다.

사용자 지정 리소스의 소개와 작동 방식은 사용자 정의 리소스 섹션을 참조하세요. Amazon SNS와 작동 방식에 대한 자세한 설명은 Amazon Simple Notification Service 개발자 안내서를 참조하세요.

Amazon SNS를 사용하여 사용자 지정 리소스 생성

1단계: 스택 생성

  1. 템플릿 개발자는 사용자 지정 리소스가 포함된 CloudFormation 스택을 생성합니다.

    아래 템플릿 예제에서는 논리적 ID가 MySeleniumTest인 사용자 지정 리소스에 대해 사용자 지정 리소스 이름 Custom::SeleniumTester를 사용합니다. 사용자 지정 리소스 유형 이름은 영숫자여야 하며 최대 60자 길이일 수 있습니다.

    사용자 지정 리소스 유형은 사용자 지정 리소스 공급자에서 정의되는 서비스 토큰, 선택적 공급자별 속성 및 선택적 Fn::GetAtt 속성을 사용하여 선언됩니다. 이러한 속성은 template developer에서 custom resource provider로 및 반대로 정보를 전달하는 데 사용할 수 있습니다. 서비스 토큰은 리소스 공급자가 구성한 Amazon SNS 주제를 지정합니다.

    { "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"] } } } }
    참고

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

  2. 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/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "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" ] } }

    Create 요청에 대한 요청 객체에 관한 자세한 내용은 생성 주제를 참조하세요.

  3. custom resource provider는 template developer에서 전송된 데이터를 처리하고 Create 요청이 성공적이었는지 여부를 결정합니다. 그런 다음 리소스 공급자는 CloudFormation에서 전송된 S3 URL을 사용하여 SUCCESS 또는 FAILED의 응답을 전송합니다.

    응답 유형에 따라 다른 응답 필드가 CloudFormation에서 예상됩니다. 특정 요청 유형의 응답 필드에 대한 자세한 내용은 사용자 지정 리소스 요청 유형 섹션에서 해당 요청 유형에 대한 설명서를 참조하세요.

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

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

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

    Create 요청에 대한 응답 객체에 관한 자세한 내용은 생성 주제를 참조하세요.

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

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

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

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

2단계: 스택 업데이트

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

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

참고

사용자 지정 리소스에 변경 사항을 적용하지 않으면 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. 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/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "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" ] } }

    Update 요청에 대한 요청 객체에 관한 자세한 내용은 업데이트 주제를 참조하세요.

  3. 사용자 지정 리소스 공급자는 CloudFormation에서 전송된 데이터를 처리합니다. 사용자 지정 리소스는 업데이트를 수행하고 SUCCESS 또는 FAILED의 응답을 S3 URL에 전송합니다. 그런 다음 CloudFormation은 기존 및 신규 사용자 지정 리소스의 PhysicalResourceIDs를 비교합니다. 값이 다른 경우 CloudFormation은 업데이트에 교체가 필요하다고 인식하고 기존 리소스에 삭제 요청을 전송합니다. 다음 예제에서는 Update 요청에 대한 custom resource provider 응답을 보여줍니다.

    { "Status" : "SUCCESS", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "RequestId" : "uniqueid for this update request", "LogicalResourceId" : "MySeleniumTester", "PhysicalResourceId" : "Tester2" }

    Update 요청에 대한 응답 객체에 관한 자세한 내용은 업데이트 주제를 참조하세요.

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

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

3단계: 스택 삭제

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

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

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

    { "RequestType" : "Delete", "ResponseURL" : "http://pre-signed-S3-url-for-response", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "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" ] } }

    Delete 요청에 대한 요청 객체에 관한 자세한 내용은 삭제 주제를 참조하세요.

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

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

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

    { "Status" : "SUCCESS", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "RequestId" : "unique id for this delete request", "LogicalResourceId" : "MySeleniumTester", "PhysicalResourceId" : "Tester1" }

    Delete 요청에 대한 응답 객체에 관한 자세한 내용은 삭제 주제를 참조하세요.

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

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