AWS Lambda와 함께 AWS CloudFormation 사용 - AWS Lambda

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS Lambda와 함께 AWS CloudFormation 사용

AWS CloudFormation 템플릿에서는 사용자 지정 리소스의 대상으로 Lambda 함수를 지정할 수 있습니다. 사용자 지정 리소스를 사용하여 파라미터를 처리하고, 설정 값을 검색하거나, 스택 수명 주기 이벤트 도중 다른 AWS 서비스를 호출할 수 있습니다.

다음 예시는 템플릿에 정의된 함수를 호출합니다.

예 - 사용자 지정 리소스 정의
Resources: primerinvoke: Type: AWS::CloudFormation::CustomResource Version: "1.0" Properties: ServiceToken: !GetAtt primer.Arn FunctionName: !Ref randomerror

서비스 토큰은 스택 생성, 업데이트 또는 삭제 시 AWS CloudFormation이 호출한 함수의 ARN(Amazon Resource Name)입니다. FunctionName이 원형 그대로 함수로 전달하는, AWS CloudFormation 같은 추가 속성을 포함할 수도 있습니다.

AWS CloudFormation은 콜백 URL을 포함하는 이벤트와 비동기적으로 Lambda 함수를 호출합니다.

예 – AWS CloudFormation 메시지 이벤트
{ "RequestType": "Create", "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66", "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3-us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A123456789012%3Astack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456%7Cprimerinvoke%7C5d478078-13e9-baf0-464a-7ef285ecc786?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1555451971&Signature=28UijZePE5I4dvukKQqM%2F9Rf1o4%3D", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456", "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786", "LogicalResourceId": "primerinvoke", "ResourceType": "AWS::CloudFormation::CustomResource", "ResourceProperties": { "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66", "FunctionName": "lambda-error-processor-randomerror-ZWUC391MQAJK" } }

함수는 성공 또는 실패를 나타내는 콜백 URL에 대한 응답을 반환할 책임을 집니다. 전체 응답 구문은 사용자 지정 리소스 응답 객체에서 확인할 수 있습니다.

예 – AWS CloudFormation 사용자 지정 리소스 응답
{ "Status": "SUCCESS", "PhysicalResourceId": "2019/04/18/[$LATEST]b3d1bfc65f19ec610654e4d9b9de47a0", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456", "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786", "LogicalResourceId": "primerinvoke" }

AWS CloudFormation은 응답 전송을 처리하는 cfn-response라는 라이브러리를 제공합니다. 템플릿 내에서 함수를 정의하려면, 함수를 이름으로 요청하면 됩니다. 그러면 AWS CloudFormation이 함수를 위해 생성된 배포 패키지에 라이브러리를 추가합니다.

사용자 지정 리소스에서 사용하는 함수에 탄력적 네트워크 인터페이스가 연결된 경우 다음 리소스를 VPC 정책에 추가합니다. 여기서 region은 함수가 있는 리전(대시 없음)입니다. 예를 들어 us-east-1useast1입니다. 이렇게 하면 Custom Resource가 AWS CloudFormation 스택으로 신호를 다시 보내는 콜백 URL에 응답할 수 있습니다.

arn:aws:s3:::cloudformation-custom-resource-response-region", "arn:aws:s3:::cloudformation-custom-resource-response-region/*",

다음 예시 함수는 두 번째 함수를 호출합니다. 호출이 성공한다면, 함수는 성공 응답을 AWS CloudFormation에 전송하고 스택 업데이트가 진행됩니다. 템플릿은 에서 제공한 AWS::Serverless::Function리소스 유형을 사용합니다AWS Serverless Application Model.

error-processor/template.yml – 사용자 지정 리소스 함수
Transform: 'AWS::Serverless-2016-10-31' Resources: primer: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs16.x InlineCode: | var aws = require('aws-sdk'); var response = require('cfn-response'); exports.handler = function(event, context) { // For Delete requests, immediately send a SUCCESS response. if (event.RequestType == "Delete") { response.send(event, context, "SUCCESS"); return; } var responseStatus = "FAILED"; var responseData = {}; var functionName = event.ResourceProperties.FunctionName var lambda = new aws.Lambda(); lambda.invoke({ FunctionName: functionName }, function(err, invokeResult) { if (err) { responseData = {Error: "Invoke call failed"}; console.log(responseData.Error + ":\n", err); } else responseStatus = "SUCCESS"; response.send(event, context, responseStatus, responseData); }); }; Description: Invoke a function to create a log stream. MemorySize: 128 Timeout: 8 Role: !GetAtt role.Arn Tracing: Active

사용자 지정 리소스가 호출하는 함수가 템플릿에 정의되어 있지 않다면, AWS CloudFormation 사용 설명서의 cfn-response 모듈에서 cfn-response의 소스 코드를 얻을 수 있습니다.

사용자 지정 리소스를 사용하여 함수의 로그 그룹이 해당 그룹을 의존하는 다른 리소스보다 먼저 생성되도록 하는 샘플 애플리케이션에 대해서는 AWS Lambda용 오류 처리자 샘플 애플리케이션 단원을 참조하세요.

사용자 지정 리소스에 대한 자세한 내용은 AWS CloudFormation 사용 설명서사용자 지정 리소스를 참조하세요.