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 Application Model에서 제공하는 AWS::Serverless::Function 리소스 유형을 사용합니다.

예 - 사용자 지정 리소스 함수
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 CloudFormation 사용 설명서사용자 지정 리소스를 참조하세요.