

# AWS Lambda와 함께 CloudFormation 사용
<a name="services-cloudformation"></a>

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

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

**Example - 사용자 지정 리소스 정의**  

```
Resources:
  primerinvoke:
    Type: [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html)
    Version: "1.0"
    Properties:
      ServiceToken: !GetAtt primer.Arn
      FunctionName: !Ref randomerror
```

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

CloudFormation은 콜백 URL을 포함하는 이벤트와 [비동기적으로](invocation-async.md) Lambda 함수를 간접 호출합니다.

**Example – 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에 대한 응답을 반환할 책임을 집니다. 전체 응답 구문은 [사용자 지정 리소스 응답 객체](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-responses.html)에서 확인할 수 있습니다.

**Example – 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"
}
```

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

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

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

다음 예시 함수는 두 번째 함수를 간접 호출합니다. 호출이 성공한다면, 함수는 성공 응답을 CloudFormation에 전송하고 스택 업데이트가 진행됩니다. 템플릿은 AWS Serverless Application Model에서 제공하는 [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html) 리소스 유형을 사용합니다.

**Example - 사용자 지정 리소스 함수**  

```
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  primer:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    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 모듈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html)에서 `cfn-response`의 소스 코드를 얻을 수 있습니다.

사용자 지정 리소스에 대한 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [사용자 지정 리소스](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html)를 참조하세요.