사용자 지정 리소스를 사용하여 사용자 지정 프로비저닝 로직 생성 - AWS CloudFormation

사용자 지정 리소스를 사용하여 사용자 지정 프로비저닝 로직 생성

사용자 지정 리소스는 CloudFormation 템플릿에 사용자 지정 프로비저닝 로직을 작성하고 스택을 생성, 업데이트(사용자 지정 리소스를 변경하는 경우) 또는 삭제할 때마다 CloudFormation이 실행되도록 하는 방법을 제공합니다. 이는 프로비저닝 요구 사항이 CloudFormation의 기본 제공 리소스 유형으로 표현할 수 없는 복잡한 로직 또는 워크플로와 관련된 경우 유용할 수 있습니다.

예를 들어 CloudFormation 리소스 유형으로 사용할 수 없는 리소스를 포함하려고 할 수 있습니다. 이러한 리소스는 사용자 지정 리소스를 사용하여 포함할 수 있습니다. 이러한 방식으로 단일 스택에서 관련 리소스를 모두 관리할 수 있습니다.

CloudFormation 템플릿에서 사용자 지정 리소스를 정의하려면 AWS::CloudFormation::CustomResource 또는 Custom::MyCustomResourceTypeName 리소스 유형을 사용합니다. 사용자 지정 리소스에는 하나의 속성 즉, 서비스 토큰이 필요합니다. 서비스 토큰은 CloudFormation에서 요청을 보내는 위치(예: Amazon SNS 주제 또는 Lambda 함수)를 지정합니다.

다음 주제는 사용자 지정 리소스 사용 방법에 관한 정보를 제공합니다.

참고

CloudFormation 레지스트리와 사용자 지정 리소스에는 각각 고유한 이점이 있습니다. 사용자 지정 리소스는 다음과 같은 이점을 제공합니다.

  • 리소스를 등록할 필요는 없습니다.

  • 등록하지 않고도 전체 리소스를 템플릿의 일부로 포함할 수 있습니다.

  • Create, UpdateDelete 작업을 지원합니다.

레지스트리 기반 리소스가 제공하는 이점은 다음과 같습니다.

  • 서드 파티 애플리케이션 리소스의 모델링, 프로비저닝 및 관리 지원

  • Create, Read, Update, DeleteList(CRUDL) 작업 지원

  • 프라이빗 및 서드 파티 리소스 유형에 대한 드리프트 감지 지원

사용자 지정 리소스와 달리 레지스트리 기반 리소스의 경우 CRUDL 작업을 수행하기 위해 Amazon SNS 주제 또는 Lambda 함수를 연결할 필요가 없습니다. 자세한 내용은 CloudFormation 레지스트리를 통해 익스텐션 관리 단원을 참조하십시오.

사용자 지정 리소스가 작동하는 방식

새 사용자 지정 리소스를 설정하는 일반적인 프로세스에는 다음 단계가 포함됩니다. 이러한 단계에는 사용자 지정 리소스를 소유하는 사용자 지정 리소스 공급자와 사용자 지정 리소스 유형이 포함된 템플릿을 생성하는 템플릿 개발자라는 두 가지 역할이 포함됩니다. 한 사람이 두 역할을 모두 수행할 수도 있지만, 그렇지 않은 경우 사용자 지정 리소스 공급자와 템플릿 개발자가 협력해야 합니다.

  1. 사용자 지정 리소스 공급자는 CloudFormation의 요청을 처리하고 사용자 지정 리소스에서 작업을 수행하는 방법을 결정하는 로직을 작성합니다.

  2. 사용자 지정 리소스 공급자는 CloudFormation이 요청을 전송할 수 있는 Amazon SNS 주제 또는 Lambda 함수를 생성합니다. Amazon SNS 주제 또는 Lambda 함수는 스택이 생성될 리전과 동일한 리전에 있어야 합니다.

  3. 사용자 지정 리소스 공급자가 템플릿 개발자에게 Amazon SNS 주제 ARN 또는 Lambda 함수 ARN을 제공합니다.

  4. 템플릿 개발자는 자신의 CloudFormation 템플릿에서 사용자 지정 리소스를 정의합니다. 여기에는 서비스 토큰 및 모든 입력 데이터 파라미터가 포함됩니다. 서비스 토큰 및 입력 데이터 구조는 사용자 지정 리소스 공급자가 정의합니다. 서비스 토큰은 Amazon SNS 주제 ARN 또는 Lambda 함수 ARN을 지정하며 항상 필요하지만 입력 데이터는 사용자 지정 리소스에 따르는 선택 사항입니다.

이제 사용자가 템플릿을 사용하여 사용자 지정 리소스를 생성, 업데이트 또는 삭제할 때마다 CloudFormation에서 지정된 서비스 토큰에 대한 요청을 보낸 다음 스택 작업을 진행하기 전에 응답을 기다립니다.

다음은 템플릿에서 스택을 생성하는 흐름을 요약한 것입니다.

  1. CloudFormation은 지정된 서비스 토큰에 대한 요청을 보냅니다. 이 요청에는 요청 유형, 미리 서명된 Amazon Simple Storage Service URL, 사용자 지정 리소스가 응답을 보내는 위치 등과 같은 정보가 포함됩니다. 요청에 포함되는 정보에 대한 자세한 내용은 사용자 지정 리소스 요청 객체 단원을 참조하십시오.

    다음 샘플 데이터는 CloudFormation에서 Create 요청에 포함하는 정보를 보여줍니다. 이 예제에서 ResourceProperties는 CloudFormation이 Lambda 함수로 보낼 사용자 지정 페이로드를 생성하도록 합니다.

    { "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::TestResource", "LogicalResourceId" : "MyTestResource", "ResourceProperties" : { "Name" : "Value", "List" : [ "1", "2", "3" ] } }
  2. 사용자 지정 리소스 공급자는 CloudFormation 요청을 처리하고 미리 서명된 URL에 SUCCESS 또는 FAILED의 응답을 반환합니다. custom resource provider는 JSON 형식 파일로 응답을 제공하고 미리 서명된 S3 URL에 업로드합니다. 자세한 내용을 알아보려면 Amazon Simple Storage Service 사용 설명서미리 서명된 URL을 사용하여 객체 업로드를 참조하세요.

    또한 custom resource provider는 응답에 template developer가 액세스할 수 있는 이름-값 페어를 포함할 수 있습니다. 예를 들어, 응답에는 요청에 성공한 경우에는 출력 데이터를, 요청에 실패한 경우에는 오류 메시지를 포함할 수 있습니다. 응답에 대한 자세한 내용은 사용자 지정 리소스 응답 객체 단원을 참조하십시오.

    중요

    이름-값 페어에 중요한 정보가 들어 있는 경우 NoEcho 필드를 사용하여 사용자 지정 리소스의 출력을 마스킹해야 합니다. 그러지 않으면 속성값(예: DescribeStackEvents)을 드러내는 API를 통해 값이 표시될 수 있습니다.

    NoEcho를 사용하여 민감한 정보를 마스킹 처리하는 방법에 대한 자세한 내용은 템플릿에 자격 증명을 포함하지 않음 모범 사례를 참조하세요.

    custom resource provider는 요청 수신 및 요청에 대한 응답을 담당합니다. 예를 들어 Amazon SNS 알림의 경우 사용자 지정 리소스 공급자는 특정 주제 ARN으로 전송된 알림을 수신하고 해당 알림에 응답해야 합니다. CloudFormation은 미리 서명된 URL 위치에서 응답을 대기해 수신합니다.

    다음 샘플 데이터는 사용자 지정 리소스가 응답에 포함할 수 있는 정보를 보여줍니다.

    { "Status" : "SUCCESS", "PhysicalResourceId" : "TestResource1", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "RequestId" : "unique id for this create request", "LogicalResourceId" : "MyTestResource", "Data" : { "OutputName1" : "Value1", "OutputName2" : "Value2", } }
  3. SUCCESS 응답을 수신한 후 CloudFormation에서는 스택 작업을 진행합니다. FAILED 응답 또는 응답 없음이 반환되면 작업에 실패합니다. 사용자 지정 리소스의 모든 출력 데이터는 미리 서명된 URL 위치에 저장됩니다. template developer는 Fn::GetAtt 함수를 사용하여 해당 데이터를 검색할 수 있습니다.

참고

VPC 엔드포인트 기능을 사용할 경우 VPC의 사용자 지정 리소스는 CloudFormation 고유의 S3 버킷에 액세스할 수 있어야 합니다. 사용자 지정 리소스는 미리 서명된 Amazon S3 URL로 응답을 전송해야 합니다. Amazon S3에 응답을 보내지 못하면 CloudFormation이 응답을 수신하지 않고 스택 작업이 실패합니다. 자세한 내용은 인터페이스 엔드포인트를 사용하여 CloudFormation 액세스(AWS PrivateLink) 단원을 참조하십시오.

응답 제한 시간

사용자 지정 리소스의 기본 제한 시간은 3600초(1시간)입니다. 이 시간 동안 응답이 수신되지 않으면 스택 작업이 실패합니다.

사용자 지정 리소스의 응답에 소요될 것으로 예상되는 시간에 따라 제한 시간 값을 조정할 수 있습니다. 예를 들어 5분 이내에 응답할 것으로 예상되는 Lambda 함수를 호출하는 사용자 지정 리소스를 프로비저닝하는 경우 ServiceTimeout 속성을 지정하여 스택 템플릿에서 시간 제한을 5분으로 설정할 수 있습니다. 자세한 내용은 사용자 지정 리소스 요청 객체 단원을 참조하십시오. 이렇게 하면 Lambda 함수에서 오류가 발생하여 중단되는 경우 CloudFormation이 전체 시간 동안 기다리지 않고 5분 후에 스택 작업이 실패합니다.

하지만 시간 제한 값을 너무 작게 설정하지 않도록 주의하세요. 예상치 못한 시간 제한을 피하려면 사용자 지정 리소스에 필요한 작업을 수행하고 응답을 반환할 수 있는 충분한 시간이 있는지 확인하세요.