

# Lambda 함수 간접 호출 방법 이해
<a name="lambda-invocation"></a>

Lambda 함수를 배포한 후에는 여러 가지 방법으로 함수를 간접적으로 간접 호출할 수 있습니다.
+ [Lambda 콘솔](testing-functions.md) - Lambda 콘솔을 사용하여 함수를 간접적으로 간접 호출하는 테스트 이벤트를 빠르게 생성합니다.
+ [AWS SDK](https://aws.amazon.com/developer/tools/) - AWS SDK를 사용하여 프로그래밍 방식으로 함수를 간접적으로 간접 호출합니다.
+ [간접 호출](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) API - Lambda 간접 호출 API를 사용하여 함수를 직접 간접 호출할 수 있습니다.
+ [AWS Command Line Interface(AWS CLI)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html) – `aws lambda invoke` AWS CLI 명령을 사용하여 명령줄에서 직접 함수를 간접적으로 간접 호출합니다.
+ [함수 URL HTTP(S) 엔드포인트](urls-configuration.md) - 함수 URL을 사용하여 함수를 간접적으로 간접 호출하는 데 사용할 수 있는 전용 HTTP(S) 엔드포인트를 생성합니다.

이러한 모든 메서드는 함수를 *직접* 간접 호출하는 방법입니다. Lambda에서 일반적인 사용 사례는 애플리케이션의 다른 곳에서 발생하는 이벤트를 기반으로 함수를 간접적으로 간접 호출하는 것입니다. 일부 서비스는 새로운 이벤트가 발생할 때마다 Lambda 함수를 간접적으로 간접 호출할 수 있습니다. 이를 [트리거](lambda-services.md)라고 합니다. 스트림 및 대기열 기반 서비스의 경우 Lambda는 레코드 배치와 함께 함수를 간접적으로 간접 호출합니다. 이를 [이벤트 소스 매핑](invocation-eventsourcemapping.md)이라고 합니다.

함수를 간접 호출할 때 동기식으로 간접 호출할 것인지 비동기식으로 간접 호출할 것인지 선택할 수 있습니다. [동기식 간접 호출](invocation-sync.md)의 경우 함수가 이벤트를 처리하여 응답을 반환하기를 기다립니다. [비동기식 간접 호출](invocation-async.md)의 경우, Lambda는 처리를 위해 이벤트를 대기열에 저장하고 즉시 응답을 반환합니다. [간접 호출 API의 `InvocationType` 요청 파라미터](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html#API_Invoke_RequestParameters)에 따라 Lambda가 함수를 간접적으로 간접 호출하는 방식이 결정됩니다. `RequestResponse` 값은 동기식 간접 호출을 나타내고 `Event` 값은 비동기식 간접 호출을 나타냅니다.

IPv6를 통해 함수를 간접 호출하려면 Lambda의 퍼블릭 [듀얼 스택 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#dual-stack-endpoints)를 사용하세요. IPv4 및 IPv6를 모두 지원하는 듀얼 스택 엔드포인트입니다. Lambda 듀얼 스택 엔드포인트는 다음 구문을 사용합니다.

```
protocol://lambda.us-east-1.api.aws
```

[Lambda 함수 URL](urls-configuration.md)을 사용하여 IPv6를 통해 함수를 간접 호출할 수도 있습니다. 함수 URL 엔드포인트는 다음 형식을 취합니다.

```
https://url-id.lambda-url.us-east-1.on.aws
```

함수 간접 호출에서 오류가 발생하는 경우 동기식 간접 호출의 경우에는 응답에서 오류 메시지를 확인하고 간접 호출을 수동으로 다시 시도합니다. 비동기식 간접 호출의 경우 Lambda는 재시도를 자동으로 처리하고 간접 호출 레코드를 [대상](invocation-async-retain-records.md#invocation-async-destinations)에 보낼 수 있습니다.

# Lambda 함수의 동기식 간접 호출
<a name="invocation-sync"></a>

함수를 동기식으로 간접 호출하는 경우 Lambda는 함수를 실행하고 응답을 기다립니다. 함수가 완료되면 Lambda는 간접 호출된 함수의 버전과 같은 추가 데이터가 포함된 응답을 함수의 코드에서 반환합니다. AWS CLI를 사용해 동기식으로 함수를 간접 호출하려면 `invoke` 명령을 사용하세요.

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload '{ "key": "value" }' response.json
```

**cli-binary-format** 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 `aws configure set cli-binary-format raw-in-base64-out`을(를) 실행하세요. 자세한 내용은 [AWS CLI 지원되는 글로벌 명령줄 옵션](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)을 AWS Command Line Interface 사용 설명서 버전 2에서 참조하세요.

다음 결과가 표시됩니다.

```
{
    "ExecutedVersion": "$LATEST",
    "StatusCode": 200
}
```

다음 다이어그램은 Lambda 함수를 동기적으로 호출하는 클라이언트를 보여줍니다. Lambda는 이벤트를 함수로 직접 보내고 간접 호출자에게 함수의 응답을 다시 보냅니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/invocation-sync.png)


`payload`은 JSON 형식의 이벤트를 포함하는 문자열입니다. AWS CLI가 함수에서 응답을 기록하는 파일의 이름은 `response.json`입니다 . 함수가 객체 또는 오류를 반환하는 경우, 응답 본문은 JSON 형식의 객체 또는 오류입니다. 함수가 오류 없이 종료되는 경우 응답 본문은 `null`입니다.

**참고**  
Lambda는 응답을 전송하기 전에 외부 확장이 완료되는 것을 기다리지 않습니다. 외부 확장은 실행 환경에서 독립 프로세스로 실행되며 함수 호출이 완료된 후에도 계속 실행됩니다. 자세한 내용은 [Lambda 확장을 사용하여 Lambda 함수 보강](lambda-extensions.md) 단원을 참조하십시오.

명령의 출력은 터미널에 표시되며 Lambda의 응답에 있는 헤더의 정보를 포함합니다. 여기에는 이벤트를 처리한 버전([별칭](configuration-aliases.md) 사용 시 유용)과 Lambda가 반환한 상태 코드가 들어 있습니다. Lambda가 함수를 실행할 수 있었다면 함수가 오류를 반환한 경우에도 상태 코드는 200입니다.

**참고**  
제한 시간이 긴 함수의 경우 클라이언트는 응답을 기다릴 때 동기식 호출 중 연결이 해제될 수 있습니다. HTTP 클라이언트, SDK, 방화벽, 프록시 또는 운영 체제에서 제한 시간과의 장시간 연결 또는 연결 유지 설정을 감안하도록 구성합니다.

Lambda가 함수를 실행할 수 없는 경우 출력에 오류가 표시됩니다.

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload value response.json
```

다음 결과가 표시됩니다:

```
An error occurred (InvalidRequestContentException) when calling the Invoke operation: Could not parse request body into json: Unrecognized token 'value': was expecting ('true', 'false' or 'null')
 at [Source: (byte[])"value"; line: 1, column: 11]
```

AWS CLI은(는) 명령줄 셸의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다. 이 섹션의 단계를 완료하려면 [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)가 필요합니다.

[AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 사용하면 `--log-type` 명령 옵션을 통해 호출에 대한 로그를 검색할 수 있습니다. 호출에서 base64로 인코딩된 로그를 최대 4KB까지 포함하는 `LogResult` 필드가 응답에 포함됩니다.

**Example 로그 ID 검색**  
다음 예제에서는 `LogResult`이라는 함수의 `my-function` 필드에서 *로그 ID*를 검색하는 방법을 보여줍니다.  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
다음 결과가 표시됩니다:  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example decode the logs**  
동일한 명령 프롬프트에서 `base64` 유틸리티를 사용하여 로그를 디코딩합니다. 다음 예제에서는 `my-function`에 대한 base64로 인코딩된 로그를 검색하는 방법을 보여줍니다.  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
**cli-binary-format** 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 `aws configure set cli-binary-format raw-in-base64-out`을(를) 실행하세요. 자세한 내용은 [AWS CLI 지원되는 글로벌 명령줄 옵션](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)을 AWS Command Line Interface 사용 설명서 버전 2에서 참조하세요.  
다음 결과가 표시됩니다.  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
`base64` 유틸리티는 Linux, macOS 및 [Ubuntu on Windows](https://docs.microsoft.com/en-us/windows/wsl/install-win10)에서 사용할 수 있습니다. macOS 사용자는 `base64 -D`를 사용해야 할 수도 있습니다.

파라미터, 헤더 및 오류의 전체 목록을 포함한 `Invoke` API에 대한 자세한 내용은 [간접 호출](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) 단원을 참조하세요.

함수를 직접 간접 호출하는 경우 오류 및 재시도에 대한 응답을 확인할 수 있습니다. AWS CLI 및 AWS SDK 역시 클라이언트 제한 시간, 조절 및 서비스 오류의 경우 자동으로 재시도합니다. 자세한 내용은 [Lambda의 재시도 동작 이해](invocation-retries.md) 섹션을 참조하세요.

# Lambda 함수를 비동기 호출합니다.
<a name="invocation-async"></a>

Amazon Simple Storage Service(S3), Amazon Simple Notification Service(SNS)와 같은 여러 AWS 서비스에서 함수를 비동기적으로 간접 호출하여 이벤트를 처리합니다. AWS Command Line Interface(AWS CLI) 또는 AWS SDK 중 하나를 사용하여 Lambda 함수를 비동기적으로 간접 호출할 수도 있습니다. 비동기적으로 함수를 간접 호출하면 함수 코드에서 응답을 기다리지 않습니다. 이벤트를 Lambda에 전달하면 Lambda가 나머지를 처리합니다. Lambda가 오류를 처리하는 방법을 구성하고, 호출 레코드를 Amazon Simple Queue Service(Amazon SQS) 또는 Amazon EventBridge(EventBridge)와 같은 다운스트림 리소스로 전송하여 애플리케이션의 구성 요소를 하나로 연결할 수 있습니다.

다음 다이어그램은 Lambda 함수를 비동기적으로 호출하는 클라이언트를 보여줍니다. Lambda는 이벤트를 함수로 보내기 전에 대기열에 넣습니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/features-async.png)


비동기식 호출의 경우 Lambda는 이벤트를 대기열에 배치하고 추가 정보 없이 성공 응답을 반환합니다. 별도의 프로세스를 통해 대기열에서 이벤트를 읽은 후 함수로 보냅니다.

 AWS Command Line Interface(AWS CLI) 또는 AWS SDK 중 하나를 사용하여 Lambda 함수를 비동기적으로 간접 호출하려면 [InvocationType](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html#lambda-Invoke-request-InvocationType) 파라미터를 `Event`로 설정합니다. 다음 예제는 함수를 간접적으로 간접 호출하는 AWS CLI 명령을 보여줍니다.

```
aws lambda invoke \
  --function-name my-function  \
  --invocation-type Event \
  --cli-binary-format raw-in-base64-out \
  --payload '{ "key": "value" }' response.json
```

다음 결과가 표시됩니다.

```
{
    "StatusCode": 202
}
```

**cli-binary-format** 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 `aws configure set cli-binary-format raw-in-base64-out`을(를) 실행하세요. 자세한 내용은 [AWS CLI 지원되는 글로벌 명령줄 옵션](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)을 AWS Command Line Interface 사용 설명서 버전 2에서 참조하세요.

출력 파일(`response.json`)에는 아무런 정보도 포함되어 있지 않지만 이 명령을 실행하면 여전히 생성됩니다. Lambda가 이벤트를 대기열에 추가할 수 없는 경우 명령 출력에 오류 메시지가 나타납니다.

# Lambda가 비동기 호출을 통해 오류 및 재시도를 처리하는 방법
<a name="invocation-async-error-handling"></a>

Lambda는 함수의 비동기 이벤트 대기열을 관리하고 오류를 다시 시도합니다. 함수가 오류를 반환하면 Lambda는 기본적으로 함수를 두 번 더 실행하려 합니다. 이때 첫 두 시도 간에는 1분의 대기 시간이 있으며, 두 번째와 세 번째 시도 간에는 2분의 대기 시간이 있습니다. 함수 오류에는 함수의 코드가 반환하는 오류와 제한 시간과 같이 함수의 런타임에서 반환하는 오류가 포함되어 있습니다.

함수에 모든 이벤트를 처리하는 데 사용할 수 있을 정도로 동시성이 충분하지 않은 경우 추가 요청은 제한됩니다. 제한 오류(429) 및 시스템 오류(500 시리즈)의 경우 Lambda는 이벤트를 대기열로 반환하고 기본적으로 최대 6시간 동안 함수 재실행을 시도합니다. 재시도 간격은 첫 번째 시도 후 1초에서 최대 5분까지 기하급수적으로 증가합니다. 대기열에 많은 항목이 있는 경우 Lambda는 재시도 간격을 늘리고 대기열에서 이벤트를 읽는 속도를 줄입니다.

함수가 오류를 반환하지 않는다 하더라도 대기열 자체가 최종적으로 일관성을 갖기 때문에 Lambda에서 동일한 이벤트를 여러 번 수신할 수 있습니다. 함수가 수신 이벤트를 따라잡을 수 없는 경우 이벤트는 함수로 전송되지 않고 대기열에서 삭제될 수도 있습니다. 함수 코드가 중복 이벤트를 정상적으로 처리하는지, 모든 호출을 처리할 수 있을 만큼의 가용 동시성이 있는지 확인하세요.

대기열이 매우 길면 Lambda가 새 이벤트를 함수로 전송하기 전에 해당 이벤트가 만료될 수 있습니다. 이벤트가 만료되거나 모든 처리 시도에 실패하면 Lambda는 이벤트를 삭제합니다. 함수에 대한 [오류 처리를 구성](invocation-async-configuring.md)하여 Lambda가 수행하는 재시도 횟수를 줄이거나, 처리되지 않은 이벤트를 더 빠르게 폐기할 수 있습니다. 폐기된 이벤트를 캡처하려면 함수에 대한 [Dead Letter Queue(DLQ)를 구성](invocation-async-retain-records.md#invocation-dlq)합니다. 실패한 간접 호출(제한 시간 또는 런타임 오류 등)의 레코드를 캡처하려면 [실패 시 대상을 생성](invocation-async-retain-records.md#invocation-async-destinations)합니다.

# Lambda 비동기 호출에 대한 오류 처리 설정 구성
<a name="invocation-async-configuring"></a>

다음 설정을 사용하여 Lambda가 오류를 처리하고 비동기 함수 호출을 재시도하는 방법을 구성하세요.
+ [MaximumEventAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html#lambda-PutFunctionEventInvokeConfig-request-MaximumEventAgeInSeconds): Lambda가 이벤트를 삭제하기 전에 비동기 이벤트 대기열에서 이벤트를 유지하는 최대 시간(초)입니다.
+ [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html#lambda-PutFunctionEventInvokeConfig-request-MaximumRetryAttempts): 함수가 오류를 반환할 때 Lambda에서 이벤트를 재시도하는 최대 횟수입니다.

Lambda 콘솔 또는 AWS CLI를 사용하여 함수, 버전 또는 별칭에 대한 오류 처리 설정을 구성합니다.

------
#### [ Console ]

**오류 처리를 구성하려면**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수를 선택합니다.

1. **구성(Configuration)**을 선택한 다음 **비동기식 호출(Asynchronous invocation)**을 선택합니다.

1. **비동기식 호출**에서 **편집**을 선택합니다.

1. 다음 설정을 구성합니다.
   + **최대 이벤트 기간** - Lambda가 비동기 이벤트 대기열에서 이벤트를 유지하는 최대 시간입니다(최대 6시간).
   + **재시도 시도** - 함수가 오류를 반환할 때 Lambda 재시도 횟수입니다(0\$12 사이).

1. **Save**(저장)를 선택합니다.

------
#### [ AWS CLI ]

AWS CLI를 사용하여 비동기 간접 호출을 구성하려면 [put-function-event-간접 호출-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/put-function-event-invoke-config.html) 명령을 사용합니다. 다음 예제에서는 최대 이벤트 기간이 1시간이고 재시도가 없는 함수를 구성합니다.

```
aws lambda put-function-event-invoke-config \ 
  --function-name error \
  --maximum-event-age-in-seconds 3600 \
  --maximum-retry-attempts 0
```

이 `put-function-event-invoke-config` 명령은 함수, 버전 또는 별칭의 기존 구성을 덮어씁니다. 다른 옵션을 재설정하지 않고 옵션을 구성하려면 [update-function-event-간접 호출-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-event-invoke-config.html)를 사용합니다. 다음 예제에서는 이벤트를 처리할 수 없을 때 `destination`이라는 표준 SQS 대기열로 레코드를 전송하도록 Lambda를 구성합니다.

```
aws lambda update-function-event-invoke-config \
  --function-name my-function \
  --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-1:123456789012:destination"}}'
```

------

다음 결과가 표시됩니다.

```
{
    "LastModified": 1573686021.479,
    "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
    "MaximumRetryAttempts": 0,
    "MaximumEventAgeInSeconds": 3600,
    "DestinationConfig": {
        "OnSuccess": {},
        "OnFailure": {}
    }
}
```

호출 이벤트가 최대 기간을 초과하거나 모든 재시도 시도에 실패하면 Lambda는 해당 이벤트를 폐기합니다. 취소된 이벤트의 복사본을 유지하려면 실패한 이벤트 [대상](invocation-async-retain-records.md#invocation-async-destinations)을 구성합니다.

# Lambda 비동기식 간접 호출 레코드 캡처
<a name="invocation-async-retain-records"></a>

Lambda는 비동기식 간접 호출 레코드를 다음 중 하나로 전송할 수 있습니다. AWS 서비스 
+ **Amazon SQS** - 표준 SQS 대기열
+ **Amazon SNS** - 표준 SNS 주제
+ **Amazon S3** - Amazon S3 버킷(실패한 경우에만)
+ **AWS Lambda** - Lambda 함수
+ **Amazon EventBridge** - EventBridge 이벤트 버스

호출 레코드에는 JSON 형식의 요청 및 응답에 대한 세부 정보가 포함되어 있습니다. 처리에 성공한 이벤트와 모든 처리 시도에서 실패한 이벤트에 대해 별도의 대상을 구성할 수 있습니다. 또는 삭제된 이벤트에 대해 표준 Amazon SQS 대기열 또는 표준 Amazon SNS 주제를 Dead Letter Queue(DLQ)로 구성할 수 있습니다. Dead Letter Queue(DLQ)의 경우 Lambda는 응답에 대한 세부 정보 없이 이벤트의 콘텐츠만 전송합니다.

Lambda에서 구성한 대상으로 레코드를 전송할 수 없는 경우 Amazon CloudWatch로 `DestinationDeliveryFailures` 지표를 전송합니다. 이는 구성에 Amazon SQS FIFO 대기열 또는 Amazon SNS FIFO 주제와 같이 지원되지 않는 대상 유형이 포함된 경우 발생할 수 있습니다. 전송 오류는 권한 오류 및 크기 제한으로 인해 발생할 수도 있습니다. Lambda 호출 지표에 대한 자세한 내용은 [호출 지표](monitoring-metrics-types.md#invocation-metrics)의 내용을 참조하세요.

**참고**  
함수가 트리거되지 않도록 함수에 예약된 동시성을 0으로 설정할 수 있습니다. 비동기적으로 간접 호출된 함수에 대해 예약된 동시성을 0으로 설정하면 Lambda는 모든 이벤트를 구성된 [Dead Letter Queue(DLQ)](#invocation-dlq) 또는 실패 시 [이벤트 대상](#invocation-async-destinations)으로 새 이벤트를 보내기 시작합니다. 예약된 동시성이 0으로 설정된 상태에서 전송된 이벤트를 처리하려면 Dead Letter Queue(DLQ) 또는 실패 시 이벤트 대상에서 이벤트를 반드시 사용해야 합니다.

## 대상 추가
<a name="invocation-async-destinations"></a>

비동기식 간접 호출 레코드를 유지하려면 함수에 대상을 추가합니다. 성공한 또는 실패한 간접 호출을 대상으로 전송하도록 선택할 수 있습니다. 각 함수에는 여러 대상이 있을 수 있으므로 성공 및 실패한 이벤트에 대해 별도의 대상을 구성할 수 있습니다. 대상으로 전송되는 각 레코드는 간접 호출에 대한 세부 정보가 포함된 JSON 문서입니다. 오류 처리 설정과 마찬가지로 함수, 함수의 버전 또는 별칭에 대상을 구성할 수 있습니다.

**작은 정보**  
[Amazon Kinesis](kinesis-on-failure-destination.md#kinesis-on-failure-destination-console), [Amazon DynamoDB](services-dynamodb-errors.md), [Apache Kafka(Amazon MSK 및 자체 관리형 Apache Kafka)](kafka-on-failure.md#kafka-onfailure-destination)와 같은 이벤트 소스 매핑 유형에 대해 실패한 간접 호출 기록을 유지할 수도 있습니다.<a name="destinations-permissions"></a>

다음 표는 비동기식 간접 호출 레코드를 위해 지원되는 대상을 나열합니다. Lambda가 선택한 목적지로 레코드를 성공적으로 전송하려면 함수의 [실행 역할](lambda-intro-execution-role.md)에도 관련 권한이 포함되어야 합니다. 또한 표에는 각 대상 유형이 JSON 간접 호출 레코드를 수신하는 방법도 설명되어 있습니다.


| 대상 유형 | 필수 권한 | 대상별 JSON 형식 | 
| --- | --- | --- | 
|  Amazon SQS 대기열  |  [sqs:SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)  |  Lambda는 간접 호출 레코드를 `Message`로 목적지에 전달합니다.  | 
|  Amazon SNS 주제  |  [sns:Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)  |  Lambda는 간접 호출 레코드를 `Message`로 목적지에 전달합니다.  | 
|  Amazon S3 버킷(실패한 경우에만)  |  [s3:PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) [s3:ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/invocation-async-retain-records.html)  | 
|  Lambda 함수  |  [lambda:InvokeFunction](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Lambda는 간접 호출 레코드를 페이로드로 함수에 전달합니다.  | 
|  EventBridge  |  [events:PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/invocation-async-retain-records.html)  | 

**참고**  
Amazon S3 대상의 경우 KMS 키를 사용하여 버킷에서 암호화를 활성화하면 함수에 [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 권한도 필요합니다.

**중요**  
Amazon SNS를 대상으로 사용하는 경우 Amazon SNS의 최대 메시지 크기 제한은 256KB입니다. 비동기식 간접 호출 페이로드가 1MB에 근접하면 간접 호출 레코드(원본 페이로드 및 추가 메타데이터 포함)가 Amazon SNS 제한을 초과하여 전송 실패를 일으킬 수 있습니다. 페이로드가 더 큰 경우에는 Amazon SQS 또는 Amazon S3 대상을 사용하는 것이 좋습니다.

다음 단계에서는 Lambda 콘솔과 AWS CLI를 사용하여 함수의 대상을 구성하는 방법을 설명합니다.

------
#### [ Console ]

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수를 선택합니다.

1. **함수 개요(Function overview)**에서 **대상 추가(Add destination)**를 선택합니다.

1. **소스**에서 **비동기식 간접 호출**을 선택합니다.

1. **Condition(조건)**에서 다음 옵션 중에 선택합니다.
   + **실패 시** – 이벤트가 모든 처리 시도에 실패하거나 최대 기간을 초과할 때 레코드를 전송합니다.
   + **성공 시** – 함수가 비동기식 간접 호출을 성공적으로 처리할 때 레코드를 전송합니다.

1. **Destination type(대상 유형)**에서 호출 레코드를 수신하는 리소스 유형을 선택합니다.

1. **Destination(대상)**에서 리소스를 선택합니다.

1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

AWS CLI를 사용하여 대상을 구성하려면 [update-function-event-간접 호출-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-event-invoke-config.html) 명령을 실행합니다. 다음 예제에서는 이벤트를 처리할 수 없을 때 `destination`이라는 표준 SQS 대기열로 레코드를 전송하도록 Lambda를 구성합니다.

```
aws lambda update-function-event-invoke-config \
  --function-name my-function \
  --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-1:123456789012:destination"}}'
```

------

### Amazon S3에 대한 보안 모범 사례
<a name="s3-destination-security"></a>

함수 구성에서 대상을 제거하지 않고 대상으로 구성된 S3 버킷을 삭제하면 보안 위험이 초래될 수 있습니다. 사용자의 대상 버킷 이름을 다른 사용자가 알고 있는 경우 AWS 계정에서 버킷을 다시 생성할 수 있습니다. 실패한 간접 호출에 대한 레코드가 해당 버킷으로 전송되어 함수의 데이터가 공개될 수 있습니다.

**주의**  
함수의 간접 호출 레코드를 다른 AWS 계정의 S3 버킷으로 전송할 수 없도록 하려면 계정의 버킷에 대한 `s3:PutObject` 권한을 제한하는 조건을 함수의 실행 역할에 추가합니다.

다음 예제에서는 함수의 `s3:PutObject` 권한을 계정의 버킷으로 제한하는 IAM 정책을 보여줍니다. 또한 이 정책에서는 Lambda가 S3 버킷을 대상으로 사용하는 데 필요한 `s3:ListBucket` 권한도 부여합니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

AWS Management Console 또는 AWS CLI를 사용하여 함수의 실행 역할에 권한 정책을 추가하려면 다음 절차의 지침을 참조하세요.

------
#### [ Console ]

**함수의 실행 역할에 권한 정책을 추가하는 방법(콘솔)**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 실행 역할을 수정하려는 Lambda 함수를 선택하세요.

1. **구성** 탭을 선택한 다음 **사용 권한**을 선택합니다.

1. **실행 역할** 탭에서 함수의 **역할 이름**을 선택하여 역할의 IAM 콘솔 페이지를 여세요.

1. 다음을 수행하여 역할에 기본 권한 정책을 추가하세요.

   1. **권한** 창에서 **권한 추가**를 선택하고 **인라인 정책 생성**을 선택하세요.

   1. **정책 편집기**에서 **JSON**을 선택하세요.

   1. 추가하려는 정책을 편집기에 붙여넣고(이때 기존 JSON 대체) **다음**을 선택하세요.

   1. **정책 세부 정보** 아래에 **정책 이름**을 입력하세요.

   1. **정책 생성**을 선택합니다.

------
#### [ AWS CLI ]

**함수의 실행 역할에 권한 정책을 추가하는 방법(CLI)**

1. 필요한 권한이 있는 JSON 정책 문서를 생성하고 로컬 디렉터리에 저장하세요.

1. IAM `put-role-policy` CLI 명령을 사용하여 함수의 실행 역할에 권한을 추가하세요. JSON 정책 문서를 저장한 디렉터리에서 다음 명령을 실행하고 역할 이름, 정책 이름 및 정책 문서를 고유한 값으로 바꾸세요.

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### 간접 호출 레코드 예제
<a name="destination-example-record"></a>

호출이 조건과 일치하면 Lambda는 호출에 대한 세부 정보가 포함된 [JSON 문서](#destinations-permissions)를 대상으로 전송합니다. 다음 예제에서는 함수 오류로 인해 처리에 연속 3회 실패한 이벤트에 대한 호출 레코드를 보여 줍니다.

**Example**  

```
{
    "version": "1.0",
    "timestamp": "2019-11-14T18:16:05.568Z",
    "requestContext": {
        "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e",
        "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
        "condition": "RetriesExhausted",
        "approximateInvokeCount": 3
    },
    "requestPayload": {
        "ORDER_IDS": [
            "9e07af03-ce31-4ff3-xmpl-36dce652cb4f",
            "637de236-e7b2-464e-xmpl-baf57f86bb53",
            "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15"
        ]
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "responsePayload": {
        "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request"
    }
}
```

호출 레코드에는 이벤트, 응답 및 레코드가 전송된 이유에 대한 세부 정보가 포함되어 있습니다.

### 목적지로 향하는 요청 추적
<a name="destinations-tracing"></a>

AWS X-Ray을 사용하면 대기열에 추가되고, Lambda 함수에서 처리되고, 대상 서비스로 전달되는 각 요청의 연결된 보기를 볼 수 있습니다. 함수 또는 함수를 간접 호출하는 서비스에 대해 X-Ray 추적을 활성화하면 Lambda는 요청에 X-Ray 헤더를 추가하고 헤더를 대상 서비스에 전달합니다. 업스트림 서비스의 추적은 다운스트림 Lambda 함수 및 대상 서비스의 추적과 자동으로 연결되므로 전체 애플리케이션을 종합적으로 파악할 수 있습니다. 추적에 대한 자세한 내용은 [AWS X-Ray로 Lambda 함수 간접 호출 시각화](services-xray.md)의 내용을 참조하세요.

## Dead Letter Queue(DLQ) 추가
<a name="invocation-dlq"></a>

[on-failure 대상](#invocation-async-destinations)의 대안으로, 이후 처리를 위해 폐기된 이벤트를 저장하기 위해 Dead Letter Queue(DLQ)을 사용하여 함수를 구성할 수 있습니다. Dead Letter Queue(DLQ)은 이벤트가 모든 처리 시도에 실패하거나 처리되지 않고 만료될 때 사용된다는 점에서 on-failure 대상과 동일하게 작동합니다. 그러나 Dead Letter Queue(DLQ)는 함수 수준에서만 추가하거나 제거할 수 있습니다. 함수 버전은 게시되지 않은 버전(\$1LATEST)과 동일한 Dead Letter Queue(DLQ) 설정을 사용합니다. On-failure 대상은 추가 대상도 지원하며, 호출 레코드에 함수의 응답에 관한 세부 정보를 포함합니다.

Dead Letter Queue(DLQ)의 이벤트를 다시 처리하려면 Lambda 함수의 [이벤트 소스](invocation-eventsourcemapping.md)로 설정하면 됩니다. 또는 수동으로 이벤트를 검색할 수도 있습니다.

Dead Letter Queue(DLQ)에 대한 Amazon SQS 표준 대기열 또는 Amazon SNS 표준 주제를 선택할 수 있습니다. FIFO 대기열과 Amazon SNS FIFO 주제는 지원되지 않습니다.
+ [Amazon SQS 대기열](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html) – 대기열은 실패한 이벤트를 검색될 때까지 보관합니다. Lambda 함수 또는 CloudWatch 경보와 같은 단일 엔터티가 실패한 이벤트를 처리해야 하는 경우 Amazon SQS 표준 대기열을 선택합니다. 자세한 내용은 [Amazon SQS에서 Lambda 사용](with-sqs.md) 섹션을 참조하세요.
+ [Amazon SNS 주제](https://docs.aws.amazon.com/sns/latest/gsg/CreateTopic.html) – 주제는 실패한 이벤트를 한 개 이상의 대상으로 전달합니다. 실패한 이벤트에 대해 여러 엔터티가 작동할 것으로 예상되는 경우 Amazon SNS 표준 주제를 선택합니다. 예를 들어 이벤트를 이메일 주소, Lambda 함수 및/또는 HTTP 엔드포인트로 전송하도록 주제를 구성할 수 있습니다. 자세한 내용은 [Amazon SNS 알림을 사용하여 Lambda 함수 간접 호출](with-sns.md) 섹션을 참조하세요.

대기열 또는 주제로 이벤트를 전송하려면 함수에 추가 권한이 필요합니다. 함수의 [실행 역할](lambda-intro-execution-role.md)에 [필요한 권한](#destinations-permissions)이 있는 정책을 추가합니다. 대상 대기열 또는 주제가 고객 관리형 AWS KMS 키로 암호화된 경우 함수의 실행 역할과 키의 [리소스 기반 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) 모두에 관련 권한이 포함되어 있는지 확인합니다.

대상을 생성하고 함수의 실행 역할을 업데이트한 후 Dead Letter Queue(DLQ)를 함수에 추가합니다. 여러 함수에서 동일한 대상으로 이벤트를 전송하도록 구성할 수 있습니다.

------
#### [ Console ]

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수를 선택합니다.

1. **구성**을 선택한 다음 **비동기식 간접 호출**을 선택합니다.

1. **비동기식 간접 호출**에서 **편집**을 선택합니다.

1. **Dead Letter Queue(DLQ) 서비스**를 **Amazon SQS** 또는 **Amazon SNS**로 설정합니다.

1. 대상 대기열 또는 주제를 선택합니다.

1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

AWS CLI로 Dead Letter Queue(DLQ)를 구성하려면 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 명령을 사용합니다.

```
aws lambda update-function-configuration \
  --function-name my-function \
  --dead-letter-config TargetArn=arn:aws:sns:us-east-1:123456789012:my-topic
```

------

Lambda는 이벤트를 속성 관련 추가 정보와 함께 Dead Letter Queue(DLQ)에 있는 그대로 보냅니다. 이 정보를 사용해 함수가 반환한 오류를 식별하거나 이벤트와 로그 또는 AWS X-Ray 트레이스의 상관 관계를 알 수 있습니다.

**Dead Letter Queue(DLQ) 메시지 속성**
+ **RequestID**(문자열) – 호출 요청의 ID입니다. 요청 ID는 함수 로그에 표시됩니다. X-Ray SDK를 사용하여 트레이스의 속성에 대한 요청 ID를 기록할 수도 있습니다. 그런 다음 X-Ray 콘솔에서 요청 ID로 트레이스를 검색할 수 있습니다.
+ **ErrorCode**(숫자) – HTTP 상태 코드입니다.
+ **ErrorMessage**(문자열) – 오류 메시지의 첫 1KB입니다.

Lambda는 Dead Letter Queue(DLQ)로 메시지를 전송할 수 없는 경우 이벤트를 삭제하고 [DeadLetterErrors](monitoring-metrics-types.md) 지표를 내보냅니다. 이것은 권한이 없는 경우나 메시지 총 크기가 대상 대기열이나 주제의 한도를 초과하는 경우에 발생할 수 있습니다. 예를 들어 본문의 크기가 1MB에 가까운 Amazon SNS 알림이 함수를 트리거하여 오류가 발생한다고 가정합니다. 이 경우 Amazon SNS가 추가하는 이벤트 데이터가 Lambda가 추가하는 속성과 결합되어 메시지가 Dead Letter Queue(DLQ)에서 허용하는 최대 크기를 초과하게 될 수 있습니다.

Amazon SQS를 이벤트 소스로 사용하는 경우, Lambda 함수가 아닌 Amazon SQS 대기열 자체에 Dead Letter Queue(DLQ)를 구성합니다. 자세한 내용은 [Amazon SQS에서 Lambda 사용](with-sqs.md) 섹션을 참조하세요.

# 지속성 Lambda 함수 간접 호출
<a name="durable-invocation"></a>

지속성 Lambda 함수는 기본 Lambda 함수와 동일한 방법을 사용하여 호출할 수 있지만 장기 실행에는 중요한 고려 사항이 있습니다. 이 섹션에서는 간접 호출 패턴, 실행 관리 및 지속성 함수에 대한 모범 사례를 다룹니다.

## 동기식 간접 호출 제한
<a name="synchronous-invocation-limits"></a>

지속성 Lambda 함수의 동기식 간접 호출은 기본 Lambda 함수와 동일하게 15분으로 제한됩니다. 지속성 함수를 15분 이상 실행해야 하는 경우 비동기식으로 간접 호출해야 합니다.

**동기식 간접 호출을 사용하는 경우:** 15분 이내에 완료되고 빠른 승인 워크플로 또는 짧은 데이터 처리 태스크와 같이 즉각적인 결과가 필요한 지속성 함수에 사용합니다.

## 장기 실행 워크플로를 위한 비동기식 간접 호출
<a name="asynchronous-invocation"></a>

15분 넘게 실행될 수 있는 지속성 함수의 경우 비동기식 간접 호출을 사용합니다. 이렇게 하면 클라이언트가 즉시 승인을 받는 동안 함수가 계속 실행될 수 있습니다.

------
#### [ TypeScript ]

```
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";

const client = new LambdaClient({});

// Asynchronous invocation
const command = new InvokeCommand({
  FunctionName: "my-durable-function",
  InvocationType: "Event", // Asynchronous
  Payload: JSON.stringify({ orderId: "12345" })
});

await client.send(command);
```

------
#### [ Python ]

```
import boto3
import json

client = boto3.client('lambda')

# Asynchronous invocation
response = client.invoke(
    FunctionName='my-durable-function',
    InvocationType='Event',  # Asynchronous
    Payload=json.dumps({'order_id': '12345'})
)
```

------

## 실행 관리 API
<a name="execution-management-apis"></a>

Lambda는 실행 나열, 실행 상태 가져오기, 실행 중지 등 지속성 함수 실행을 관리하고 모니터링하는 API를 제공합니다.

------
#### [ TypeScript ]

```
// Get execution status
const statusCommand = new InvokeCommand({
  FunctionName: "my-durable-function",
  InvocationType: "RequestResponse",
  Payload: JSON.stringify({ 
    action: "getStatus", 
    executionId: "exec-123" 
  })
});

const result = await client.send(statusCommand);
```

------
#### [ Python ]

```
# Get execution status
response = client.invoke(
    FunctionName='my-durable-function',
    InvocationType='RequestResponse',
    Payload=json.dumps({
        'action': 'get_status',
        'execution_id': 'exec-123'
    })
)
```

------

# Lambda가 스트림 및 대기열 기반 이벤트 소스의 레코드를 처리하는 방법
<a name="invocation-eventsourcemapping"></a>

**이벤트 소스 매핑은 스트림 및 대기열 기반 서비스에서 항목을 읽고 레코드 배치로 함수를 간접적으로 간접 호출하는 Lambda 리소스입니다. 이벤트 소스 매핑 내에서 *이벤트 폴러*라고 하는 리소스는 새 메시지를 적극적으로 폴링하고 함수를 간접 호출합니다. 기본적으로 Lambda는 이벤트 폴러 크기를 자동으로 조정하지만 특정 이벤트 소스 유형의 경우 [프로비저닝된 모드](#invocation-eventsourcemapping-provisioned-mode)를 사용하여 이벤트 소스 매핑 전용 이벤트 폴러의 최소 및 최대 수를 제어할 수 있습니다.

다음 서비스는 이벤트 소스 매핑을 사용하여 Lambda 함수를 간접적으로 간접 호출합니다.
+ [Amazon DocumentDB(MongoDB 호환) (Amazon DocumentDB)](with-documentdb.md)
+ [Amazon DynamoDB](with-ddb.md)
+ [Amazon Kinesis](with-kinesis.md)
+ [Amazon MQ](with-mq.md)
+ [Amazon Managed Streaming for Apache Kafka(Amazon MSK)](with-msk.md)
+ [자체 관리형 Apache Kafka](with-kafka.md)
+ [Amazon Simple Queue Service(Amazon SQS)](with-sqs.md)

**주의**  
Lambda 이벤트 소스 매핑은 각 이벤트를 한 번 이상 처리하므로 레코드가 중복될 수 있습니다. 중복 이벤트와 관련된 잠재적 문제를 방지하려면 함수 코드를 멱등성으로 만드는 것이 좋습니다. 자세한 내용은 AWS 지식 센터의 [함수를 멱등성 Lambda 함수로 만들려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/lambda-function-idempotent)를 참조하세요.

## 이벤트 소스 매핑과 직접 트리거의 차이점
<a name="eventsourcemapping-trigger-difference"></a>

일부 AWS 서비스에서는 *트리거*를 사용하여 바로 Lambda 함수를 간접 호출할 수 있습니다. 이러한 서비스는 Lambda로 이벤트를 푸시하고, 지정된 이벤트가 발생하면 함수가 즉시 간접적으로 간접 호출됩니다. 트리거는 개별 이벤트와 실시간 처리에 적합합니다. [Lambda 콘솔을 사용하여 트리거를 생성](lambda-services.md#lambda-invocation-trigger)하면 콘솔은 해당 AWS 서비스와 상호 작용하여 서비스에 대한 이벤트 알림을 구성합니다. 트리거는 실제로 Lambda가 아니라 이벤트를 생성하는 서비스에 의해 저장되고 관리됩니다. 다음은 트리거를 사용하여 Lambda 함수를 간접적으로 간접 호출하는 서비스의 몇 가지 예입니다.
+ **Amazon Simple Storage Service(Amazon S3)**: 버킷에서 객체가 생성, 삭제 또는 수정될 때 함수를 간접적으로 호출합니다. 자세한 내용은 [자습서: Amazon S3 트리거를 사용하여 Lambda 함수 간접 호출](with-s3-example.md) 섹션을 참조하세요.
+ **Amazon Simple Notification Service(Amazon SNS)**: SNS 주제에 메시지가 게시될 때 함수를 간접적으로 간접 호출합니다. 자세한 내용은 [자습서: Amazon Simple Notification Service에서 AWS Lambda 사용](with-sns-example.md) 섹션을 참조하세요.
+ **Amazon API Gateway:** 특정 엔드포인트에 대한 API 요청 시 함수를 간접적으로 간접 호출합니다. 자세한 내용은 [Amazon API Gateway 엔드포인트를 사용하여 간접적으로 Lambda 함수 호출](services-apigateway.md) 섹션을 참조하세요.

이벤트 소스 매핑은 Lambda 서비스 내에서 생성되고 관리되는 Lambda 리소스입니다. 이벤트 소스 매핑은 대기열의 대용량 스트리밍 데이터 또는 메시지를 처리하도록 설계되었습니다. 스트림이나 대기열의 레코드를 일괄적으로 처리하는 것이 레코드를 개별적으로 처리하는 것보다 더 효율적입니다.

## 일괄 처리 동작
<a name="invocation-eventsourcemapping-batching"></a>

기본적으로 이벤트 소스 매핑은 레코드를 일괄 처리하고 Lambda는 이를 단일 페이로드로 함수에 전송합니다. 일괄 처리 동작을 미세 조정하려면 배치 기간([MaximumBatchingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumBatchingWindowInSeconds))과 배치 크기([BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-response-BatchSize))를 구성합니다. 일괄 처리 기간은 레코드를 단일 페이로드로 수집할 최대 기간입니다. 배치 크기는 단일 배치의 최대 레코드 수입니다. Lambda는 다음 세 가지 기준 중 하나에 부합할 때 함수를 간접 호출합니다.
+ **일괄 처리 기간이 최댓값에 도달합니다.** 기본 일괄 처리 기간 동작은 특정 이벤트 소스에 따라 다릅니다.
  + **Kinesis, DynamoDB 및 Amazon SQS 이벤트 소스의 경우:** 기본 일괄 처리 기간은 0초입니다. 즉, Lambda는 레코드가 사용 가능하게 되는 즉시 함수를 간접 호출합니다. 배치 작업 기간을 설정하려면 `MaximumBatchingWindowInSeconds`를 구성합니다. 이 파라미터를 0\$1300초 범위에서 초 단위로 설정할 수 있습니다. 일괄 처리 기간을 구성하는 경우, 이전 함수 간접 호출이 완료되는 즉시 다음 기간이 시작됩니다.
  + **Amazon MSK, 자체 관리형 Apache Kafka 및 Amazon MQ, Amazon DocumentDB 이벤트 소스의 경우** 기본 일괄 처리 시간은 500ms입니다. `MaximumBatchingWindowInSeconds`는 0초에서 300초 사이의 값을 초 단위로 구성할 수 있습니다. Kafka 이벤트 소스 매핑에 대한 프로비저닝 모드에서 배치 기간을 구성하면 이전 배치가 완료되는 즉시 다음 기간이 시작됩니다. 프로비저닝되지 않은 Kafka 이벤트 소스 매핑에서 배치 기간을 구성하면 이전 함수 간접 호출이 완료되는 즉시 다음 기간이 시작됩니다. 프로비저닝 모드에서 Kafka 이벤트 소스 매핑을 사용할 때 지연 시간을 최소화하려면 `MaximumBatchingWindowInSeconds`를 0으로 설정합니다. 이 설정을 사용하면 Lambda가 현재 함수 간접 호출을 완료한 직후 다음 배치 처리를 시작할 수 있습니다. 저지연 처리에 대한 자세한 내용은 [지연 시간이 짧은 Apache Kafka](with-kafka-low-latency.md) 섹션을 참조하세요.
  + **Amazon MQ 및 Amazon DocumentDB 이벤트 소스의 경우** 기본 배치 시간은 500ms입니다. `MaximumBatchingWindowInSeconds`는 0초에서 300초 사이의 값을 초 단위로 구성할 수 있습니다. 일괄 처리 기간은 첫 번째 레코드가 도착하는 즉시 시작됩니다.
**참고**  
`MaximumBatchingWindowInSeconds`는 초 단위로만 변경할 수 있기 때문에 변경한 후에는 500ms 기본 배치 기간으로 되돌릴 수 없습니다. 기본 일괄 처리 기간을 복원하려면 새 이벤트 소스 매핑을 생성해야 합니다.
+ **배치 크기가 충족됩니다.** 최소 배치 크기는 1입니다. 기본 및 최대 배치 크기는 이벤트 소스에 따라 다릅니다. 이러한 값에 대한 자세한 내용은 `CreateEventSourceMapping` API 작업에 대한 [BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-BatchSize) 사양을 참조하세요.
+ **페이로드 크기가 [6MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)에 도달합니다.** 이 한도는 수정할 수 없습니다.

다음 다이어그램은 이 세 가지 조건을 보여줍니다. 일괄 처리 기간이 `t = 7`초에서 시작한다고 가정합니다. 첫 번째 시나리오에서는 5개의 레코드를 누적한 후 일괄 처리 기간이 `t = 47`초로 2차 최댓값인 40에 도달합니다. 두 번째 시나리오에서는 일괄 처리 기간이 만료되기 전에 배치 크기가 10에 도달하므로 일괄 처리 기간이 일찍 종료됩니다. 세 번째 시나리오에서는 일괄 처리 기간이 만료되기 전에 최대 페이로드 크기에 도달하므로 일괄 처리 기간이 일찍 종료됩니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/batching-window.png)


각 이벤트 소스의 폴링 빈도를 함수가 작업을 완료할 수 있는 속도에 맞게 조정할 수 있도록 다양한 배치 및 레코드 크기로 테스트하는 것이 좋습니다. [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) `BatchSize` 파라미터는 각 간접 호출에서 함수로 보낼 수 있는 최대 레코드 수를 제어합니다. 배치 크기가 클수록 더 큰 레코드 세트에서 간접 호출 오버헤드를 더 효율적으로 수용하여 처리량을 늘릴 수 있습니다.

Lambda는 처리를 위해 다음 배치를 전송하기 전에 구성된 [확장](lambda-extensions.md)이 완료될 때까지 기다리지 않습니다. 즉, Lambda가 다음 레코드 배치를 처리할 때 확장이 계속 실행될 수 있습니다. 이로 인해 계정의 [동시성](lambda-concurrency.md) 설정 또는 스로틀링을 위반하는 경우 제한 문제가 발생할 수 있습니다. 이것이 잠재적인 문제인지 여부를 탐지하려면 함수를 모니터링하고 이벤트 소스 매핑에 대해 예상보다 높은 [동시성 지표](monitoring-concurrency.md#general-concurrency-metrics)가 표시되는지 확인하세요. 간접 호출 간격이 짧기 때문에 Lambda는 일시적으로 동시성 사용량을 샤드 수보다 더 높게 보고할 수 있습니다. 확장이 없는 Lambda 함수에서도 마찬가지입니다.

기본적으로, 함수가 오류를 반환하는 경우 이벤트 소스 매핑은 함수가 성공할 때까지 또는 배치에 있는 항목이 만료될 때까지 전체 배치를 다시 처리합니다. 순차적 처리를 위해 이벤트 소스 매핑은 오류가 해결될 때까지 영향을 받은 샤드에 대한 처리를 일시 중지합니다. 스트림 소스(DynamoDB 및 Kinesis)의 경우, 함수에서 오류가 반환될 때 Lambda가 재시도하는 최대 횟수를 구성할 수 있습니다. 배치가 함수에 도달하지 않는 서비스 오류 또는 제한은 재시도 횟수에 반영되지 않습니다. 이벤트 배치를 삭제할 때 간접 호출 레코드를 [대상](invocation-async-retain-records.md#invocation-async-destinations)으로 보내도록 이벤트 소스 매핑을 구성할 수도 있습니다.

## 프로비저닝된 모드
<a name="invocation-eventsourcemapping-provisioned-mode"></a>

Lambda 이벤트 소스 매핑은 이벤트 폴러를 사용하여 새 메시지에 대해 이벤트 소스를 폴링합니다. 기본적으로 Lambda에서 메시지 볼륨에 따라 이러한 폴러의 자동 규모 조정을 관리합니다. 메시지 트래픽이 증가하면 Lambda는 로드를 처리할 이벤트 폴러 수를 자동으로 늘리고 트래픽이 감소하면 줄입니다.

프로비저닝 모드에서는 예상 트래픽 패턴의 처리 준비 상태가 유지되는 전용 폴링 리소스에 대한 최소 및 최대 제한을 정의하여 이벤트 소스 매핑의 처리량을 미세 조정할 수 있습니다. 이러한 리소스는 이벤트 트래픽의 갑작스러운 급증을 처리하기 위해 3배 더 빠른 속도로 자동 조정되며 수백만 개의 이벤트를 처리하기 위해 16배 더 많은 용량을 제공합니다. 이를 통해 엄격한 성능 요구 사항을 충족하는 응답성이 뛰어난 이벤트 기반 워크로드를 구축할 수 있습니다.

Lambda에서 이벤트 폴러는 이벤트 소스 유형에 따라 처리량 기능이 다른 컴퓨팅 유닛입니다. Amazon MSK 및 자체 관리형 Apache Kafka의 경우 각 이벤트 폴러는 최대 5MB/s의 처리량 또는 최대 5개의 동시 간접 호출을 처리할 수 있습니다. 예를 들어 이벤트 소스가 1MB의 평균 페이로드를 생성하고 함수의 평균 기간이 1초인 경우 단일 Kafka 이벤트 폴러는 5MB/초 처리량과 5개의 동시 Lambda 간접 호출을 지원할 수 있습니다(페이로드 변환은 없다고 가정). Amazon SQS의 경우 각 이벤트 폴러는 최대 1MB/s의 처리량 또는 최대 10개의 동시 간접 호출을 처리할 수 있습니다. 프로비저닝 모드를 사용하면 이벤트 폴러 사용량에 따라 추가 비용이 발생합니다. 요금에 대한 자세한 내용은 [AWS Lambda 요금](https://aws.amazon.com/lambda/pricing/)을 참조하세요.

프로비저닝 모드는 Amazon MSK, 자체 관리형 Apache Kafka 및 Amazon SQS 이벤트 소스에서만 이용할 수 있습니다. 동시성 설정을 통해 함수 규모 조정을 제어할 수 있지만 프로비저닝된 모드를 사용하면 이벤트 소스 매핑의 처리량을 제어할 수 있습니다. 성능을 극대화하기 위해 두 설정을 독립적으로 조정해야 할 수도 있습니다.

프로비저닝 모드는 시장 데이터 피드를 처리하는 금융 서비스 회사, 실시간 맞춤형 추천을 제공하는 전자 상거래 플랫폼, 라이브 플레이어 상호 작용을 관리하는 게임 회사 등 이벤트 처리 지연 시간이 일관적이어야 하는 실시간 애플리케이션에 적합합니다.

각 이벤트 폴러는 서로 다른 처리량 용량을 지원합니다.
+ Amazon MSK 및 자체 관리형 Apache Kafka: 최대 5MB/s의 처리량 또는 최대 5개의 동시 간접 호출
+ Amazon SQS: 초당 최대 1MB/s의 처리량 또는 최대 10개의 동시 간접 호출 또는 초당 최대 10개의 SQS 폴링 API 직접 호출.

Amazon SQS 이벤트 소스 매핑의 경우 최소 폴러 수를 2\$1200개로(기본값은 2개), 최대 폴러 수를 2\$12,000개(기본값은 200개)로 설정할 수 있습니다. Lambda는 구성된 최소 및 최대 이벤트 폴러 수를 조정하여 분당 최대 1,000개의 동시성을 빠르게 추가하면서 이벤트를 일관적이면서 지연 시간이 짧은 방식으로 처리합니다.

Kafka SQS 이벤트 소스 매핑의 경우 최소 폴러 수를 1\$1200개로(기본값은 1개), 최대 폴러 수를 1\$12,000개(기본값은 200개)로 설정할 수 있습니다. Lambda는 주제의 이벤트 백로그를 기반으로 구성된 최소 및 최대 설정 간에 이벤트 폴러 수를 조정하여 짧은 지연 시간으로 이벤트를 처리합니다.

Amazon SQS 이벤트 소스의 경우 프로비저닝 모드에서 최대 동시성 설정을 사용할 수 없습니다. 프로비저닝 모드를 사용하는 경우 최대 이벤트 폴러 설정을 통해 동시성을 제어합니다.

프로비저닝된 모드 구성에 대한 자세한 내용은 다음 섹션을 참조하세요.
+ [Amazon MSK 이벤트 소스 매핑에 대한 프로비저닝된 모드 구성](kafka-scaling-modes.md)
+ [자체 관리형 Apache Kafka 이벤트 소스 매핑에 대한 프로비저닝된 모드 구성](kafka-scaling-modes.md#kafka-provisioned-mode)
+ [Amazon SQS 이벤트 소스 매핑에서 프로비저닝 모드 사용](with-sqs.md#sqs-provisioned-mode)

프로비저닝 모드에서 지연 시간을 최소화하려면 `MaximumBatchingWindowInSeconds`를 0으로 설정합니다. 이 설정을 사용하면 Lambda가 현재 함수 간접 호출을 완료한 직후 다음 배치 처리를 시작할 수 있습니다. 저지연 처리에 대한 자세한 내용은 [지연 시간이 짧은 Apache Kafka](with-kafka-low-latency.md) 섹션을 참조하세요.

프로비저닝된 모드를 구성한 후 `ProvisionedPollers` 지표를 모니터링하여 워크로드에 대한 이벤트 폴러 사용량을 관찰할 수 있습니다. 자세한 내용은 [이벤트 소스 매핑 지표](monitoring-metrics-types.md#event-source-mapping-metrics) 섹션을 참조하세요.

## 이벤트 소스 매핑 API
<a name="event-source-mapping-api"></a>

[AWS Command Line Interface(AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 또는 [AWS SDK](https://aws.amazon.com/getting-started/tools-sdks/)를 사용하여 이벤트 소스를 관리하려면 다음 API 작업을 사용할 수 있습니다.
+ [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)
+ [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html)
+ [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html)
+ [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)
+ [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html)

# 이벤트 소스 매핑에 태그 사용
<a name="tags-esm"></a>

이벤트 소스 매핑에 태그를 지정하여 리소스를 구성하고 관리할 수 있습니다. 태그는 AWS 서비스 전반에서 지원되는 리소스와 연결된 자유 형식의 키-값 페어입니다. 태그 사용 사례에 대한 자세한 내용은 *AWS 리소스에 태그 지정 및 Tag Editor 사용 설명서*의 [일반적인 태그 지정 전략](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#tag-strategies)을 참조하세요.

이벤트 소스 매핑은 자체 태그를 가질 수 있는 함수와 연결됩니다. 이벤트 소스 매핑은 함수에서 태그를 자동으로 상속하지 않습니다. AWS Lambda API를 사용하여 태그를 보고 업데이트할 수 있습니다. Lambda 콘솔에서 특정 이벤트 소스 매핑을 관리하면서 태그를 보고 업데이트할 수도 있습니다(Amazon SQS에 프로비저닝 모드를 사용하는 태그 포함).

## 태그 작업에 필요한 권한
<a name="esm-tags-required-permissions"></a>

AWS Identity and Access Management(IAM) ID(사용자, 그룹 또는 역할)가 리소스의 태그를 읽거나 설정할 수 있도록 허용하려면 해당 권한을 부여합니다.
+ **lambda:ListTags** - 리소스에 태그가 있는 경우 리소스에서 `ListTags`를 직접적으로 호출해야 하는 모든 사람에게 이 권한을 부여합니다. 태그가 지정된 함수의 경우 `GetFunction`에도 이 권한이 필요합니다.
+ **lambda:TagResource** - `TagResource`를 직접적으로 호출하거나 생성 시 태그를 수행해야 하는 모든 사람에게 이 권한을 부여합니다.

선택적으로 리소스에 대한 `UntagResource` 직접 호출을 허용하도록 **lambda:UntagResource** 권한 부여를 고려하세요.

자세한 내용은 [Lambda에 대한 자격 증명 기반 IAM 정책](access-control-identity-based.md) 섹션을 참조하세요.

## Lambda 콘솔에서 태그 사용
<a name="tags-esm-console"></a>

Lambda 콘솔을 사용하여 태그가 있는 이벤트 소스 매핑을 생성하고, 기존 이벤트 소스 매핑에 태그를 추가하고, 태그로 이벤트 소스 매핑을 필터링할 수 있습니다(Amazon SQS에 프로비저닝 모드로 구성된 태그 포함).

Lambda 콘솔을 사용하여 지원되는 스트림 및 대기열 기반 서비스에 대한 트리거를 추가하면 Lambda가 자동으로 이벤트 소스 매핑을 생성합니다. 이러한 이벤트 소스에 대한 자세한 내용은 [Lambda가 스트림 및 대기열 기반 이벤트 소스의 레코드를 처리하는 방법](invocation-eventsourcemapping.md) 섹션을 참조하세요. 콘솔에서 이벤트 소스 매핑을 생성하려면 다음 사전 요구 사항이 필요합니다.
+ 함수.
+ 영향을 받는 서비스의 이벤트 소스.

트리거를 생성하거나 업데이트하는 데 사용하는 것과 동일한 사용자 인터페이스의 일부로 태그를 추가할 수 있습니다.

**이벤트 소스 매핑을 생성할 때 태그를 추가하려면 다음을 수행하세요.**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수의 이름을 선택합니다.

1. **함수 개요(Function overview)**에서 **트리거 추가(Add trigger)**를 선택합니다.

1. **트리거 구성** 아래의 드롭다운 목록에서 이벤트 소스의 출처 서비스 이름을 선택합니다.

1. 이벤트 소스의 핵심 구성을 제공합니다. 이벤트 소스 구성에 대한 자세한 내용은 [다른 AWS 서비스의 이벤트로 Lambda 간접 호출](lambda-services.md)의 관련 서비스 섹션을 참조하세요.

1. **이벤트 소스 매핑 구성**에서 **추가 설정**을 선택합니다.

1. **태그** 아래에서 **새 태그 추가**를 선택합니다.

1. **키** 필드에 태그 키를 입력합니다. 태그 지정 제한에 대한 자세한 내용은 *AWS 리소스에 태그 지정 및 Tag Editor 사용 설명서*의 [태그 이름 지정 제한 및 요구 사항](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices)을 참조하세요.

1. **추가**를 선택합니다.

**기존 이벤트 소스 매핑에 태그를 추가하려면 다음을 수행하세요.**

1. Lambda 콘솔에서 [이벤트 소스 매핑](https://console.aws.amazon.com/lambda/home#/event-source-mappings)을 엽니다.

1. 리소스 목록에서 **함수**와 **이벤트 소스 ARN**에 해당하는 이벤트 소스 매핑의 **UUID**를 선택합니다.

1. **일반 구성 창** 아래의 탭 목록에서 **태그**를 선택합니다.

1. **태그 관리**를 선택합니다.

1. **새 태그 추가**를 선택합니다.

1. **키** 필드에 태그 키를 입력합니다. 태그 지정 제한에 대한 자세한 내용은 *AWS 리소스에 태그 지정 및 Tag Editor 사용 설명서*의 [태그 이름 지정 제한 및 요구 사항](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices)을 참조하세요.

1. **저장**을 선택합니다.

**태그로 이벤트 소스 매핑을 필터링하려면 다음을 수행하세요.**

1. Lambda 콘솔에서 [이벤트 소스 매핑](https://console.aws.amazon.com/lambda/home#/event-source-mappings)을 엽니다.

1. 검색 창을 선택합니다.

1. 드롭다운 목록에서 **태그** 부제목 아래에서 태그 키를 선택합니다.

1. **용도: “tag-name”**을 선택하여 이 키로 태그가 지정된 모든 이벤트 소스 매핑을 보거나 **연산자**를 선택하여 값으로 추가 필터링할 수 있습니다.

1. 태그 키와 값의 조합으로 필터링하려면 태그 값을 선택합니다.

검색 상자는 태그 키 검색도 지원합니다. 목록에서 찾을 키의 이름을 입력합니다.

## AWS CLI에서 태그 사용
<a name="tags-esm-cli"></a>

이벤트 소스 매핑을 포함하여 기존 Lambda 리소스에 Lambda API로 태그를 추가하고 제거할 수 있습니다. 또한 이벤트 소스 매핑을 생성할 때 태그를 추가하여 리소스의 전체 수명 주기 동안 태그를 유지할 수 있습니다.

### Lambda 태그 API를 사용하여 태그 업데이트
<a name="tags-esm-api-config"></a>

[TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html) 및 [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html) API 작업을 통해 지원되는 Lambda 리소스에 대한 태그를 추가하고 제거할 수 있습니다.

AWS CLI를 사용하여 이러한 작업을 직접적으로 호출할 수 있습니다. 기존 리소스에 태그를 추가하려면 `tag-resource` 명령을 사용합니다. 이 예에서는 두 개의 태그를 추가합니다. 하나는 *Department*라는 키를 갖는 태그이고 다른 하나는 *CostCenter*라는 키를 갖는 태그입니다.

```
aws lambda tag-resource \
--resource arn:aws:lambda:us-east-2:123456789012:resource-type:my-resource \
--tags Department=Marketing,CostCenter=1234ABCD
```

태그를 제거하려면 `untag-resource` 명령을 사용합니다. 이 예에서는 *Department*라는 키가 있는 태그를 제거합니다.

```
aws lambda untag-resource --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier \
--tag-keys Department
```

### 이벤트 소스 매핑을 생성할 때 태그 추가
<a name="tags-esm-on-create"></a>

태그를 사용하여 새로운 Lambda 이벤트 소스 매핑을 생성하려면 [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) API 작업을 사용합니다. `Tags` 파라미터를 지정합니다. `create-event-source-mapping` AWS CLI 명령과 `--tags` 옵션을 사용하여 이 작업을 직접적으로 호출할 수 있습니다. CLI 명령에 대한 자세한 내용은 *AWS CLI Command Reference*의 [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)을 참조하세요.

`CreateEventSourceMapping`와 함께 `Tags` 파라미터를 사용하기 전에 역할에 이 작업에 필요한 일반적인 권한과 함께 리소스에 태그를 지정할 수 있는 권한이 있는지 확인하세요. 태그 지정 권한에 대한 자세한 내용은 [태그 작업에 필요한 권한](#esm-tags-required-permissions) 섹션을 참조하세요.

### Lambda 태그 API를 사용하여 태그 보기
<a name="tags-esm-api-view"></a>

특정 Lambda 리소스에 적용된 태그를 보려면 `ListTags` API 작업을 사용합니다. 자세한 내용은 [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)를 참조하세요.

Amazon 리소스 이름(ARN)을 제공하여 `list-tags` AWS CLI 명령으로 이 작업을 직접적으로 호출할 수 있습니다.

```
aws lambda list-tags --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier
```

### 태그로 리소스 필터링
<a name="tags-esm-filtering"></a>

AWS Resource Groups Tagging API [GetResources](https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html) API 작업을 사용하여 태그를 기준으로 리소스를 필터링할 수 있습니다. `GetResources` 작업은 최대 10개의 필터를 수신하며 각 필터는 태그 키와 최대 10개의 태그 값을 포함합니다. `GetResources`에 `ResourceType`을 지정하면 특정 리소스 유형별로 필터링할 수 있습니다.

`get-resources` AWS CLI 명령을 사용하여 이 작업을 직접적으로 호출할 수 있습니다. `get-resources` 사용 예는 *AWS CLI Command Reference*의 [get-resources](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/resourcegroupstaggingapi/get-resources.html#examples)를 참조하세요.

# Lambda가 함수로 보내는 이벤트에 대한 제어
<a name="invocation-eventfiltering"></a>

이벤트 필터링을 사용하여 Lambda가 함수로 전송하는 스트림 또는 대기열의 레코드를 제어할 수 있습니다. 예를 들어 함수에서 특정 데이터 파라미터가 포함된 Amazon SQS 메시지만 처리하도록 필터를 추가할 수 있습니다. 이벤트 필터링은 특정 이벤트 소스 매핑에서만 작동합니다. 다음 AWS 서비스에 대한 이벤트 소스 매핑에 필터를 추가할 수 있습니다.
+ Amazon DynamoDB
+ Amazon Kinesis Data Streams
+ Amazon MQ
+ Amazon Managed Streaming for Apache Kafka(Amazon MSK)
+ 자체 관리형 Apache Kafka
+ Amazon Simple Queue Service(Amazon SQS)

특정 이벤트 소스를 사용한 필터링에 대한 자세한 내용은 [서로 다른 AWS 서비스에서 필터 사용](#filtering-by-service)을 참조하세요. Lambda는 Amazon DocumentDB에 대한 이벤트 필터링을 지원하지 않습니다.

기본적으로 단일 이벤트 소스 매핑에 대해 최대 5개의 필터를 정의할 수 있습니다. 필터는 논리적으로 OR로 결합됩니다. 이벤트 소스의 레코드가 하나 이상의 필터를 충족하는 경우 Lambda는 함수로 전송하는 다음 이벤트에 해당 레코드를 포함합니다. 충족되는 필터가 없으면 Lambda는 레코드를 삭제합니다.

**참고**  
이벤트 소스에 대해 5개가 넘는 필터를 정의해야 하는 경우, 각 이벤트 소스에 대해 최대 10개의 필터에 대한 할당량 증가를 요청할 수 있습니다. 현재 할당량이 허용하는 것보다 더 많은 필터를 추가하려고 하면, 이벤트 소스를 생성하려고 할 때 Lambda에서 오류를 반환합니다.

**Topics**
+ [

## 이벤트 필터링 기본 사항에 대한 이해
](#filtering-basics)
+ [

## 필터 기준을 충족하지 않는 레코드 처리
](#filtering-criteria-not-met)
+ [

## 필터 규칙 구문
](#filtering-syntax)
+ [

## 이벤트 소스 매핑에 필터 기준 연결(콘솔)
](#filtering-console)
+ [

## 이벤트 소스 매핑에 필터 기준 연결(AWS CLI)
](#filtering-cli)
+ [

## 이벤트 소스 매핑에 필터 기준 연결(AWS SAM)
](#filtering-sam)
+ [

## 필터 기준 암호화
](#filter-criteria-encryption)
+ [

## 서로 다른 AWS 서비스에서 필터 사용
](#filtering-by-service)

## 이벤트 필터링 기본 사항에 대한 이해
<a name="filtering-basics"></a>

필터 기준(`FilterCriteria`) 객체는 필터(`Filters`) 목록으로 구성된 구조입니다. 각 필터는 이벤트 필터링 패턴(`Pattern`)을 정의하는 구조입니다. 패턴은 JSON 필터 규칙의 문자열 표현입니다. `FilterCriteria` 객체의 구조는 다음과 같습니다.

```
{
   "Filters": [
        {
            "Pattern": "{ \"Metadata1\": [ rule1 ], \"data\": { \"Data1\": [ rule2 ] }}"
        }
    ]
}
```

명확성을 더하기 위해 일반 JSON으로 확장된 필터의 `Pattern` 값은 다음과 같습니다.

```
{
    "Metadata1": [ rule1 ],
    "data": {
        "Data1": [ rule2 ]
    }
}
```

필터 패턴에는 메타데이터 속성, 데이터 속성 또는 둘 다 포함될 수 있습니다. 사용 가능한 메타데이터 파라미터와 데이터 파라미터의 형식은 이벤트 소스 역할을 하는 AWS 서비스에 따라 다릅니다. 예를 들어, 이벤트 소스 매핑이 Amazon SQS 대기열에서 다음 레코드를 수신한다고 가정해 보겠습니다.

```
{
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "{\\n \"City\": \"Seattle\",\\n \"State\": \"WA\",\\n \"Temperature\": \"46\"\\n}",
    "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1545082649183",
        "SenderId": "AIDAIENQZJOLO23YVJ4VO",
        "ApproximateFirstReceiveTimestamp": "1545082649185"
    },
    "messageAttributes": {},
    "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
    "eventSource": "aws:sqs",
    "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
    "awsRegion": "us-east-2"
}
```
+ **메타데이터 속성**은 레코드를 생성한 이벤트에 대한 정보가 들어 있는 필드입니다. 예제 Amazon SQS 레코드에서 메타데이터 속성에는 `messageID`, `eventSourceArn`, `awsRegion` 등의 필드가 포함됩니다.
+ **데이터 속성**은 스트림 또는 대기열의 데이터를 포함하는 레코드의 필드입니다. Amazon SQS 이벤트 예제에서 데이터 필드의 키는 `body`이고, 데이터 속성은 필드 `City` `State` 및 `Temperature`입니다.

이벤트 소스 유형마다 데이터 필드에 서로 다른 키 값을 사용합니다. 데이터 속성을 필터링하려면 필터의 패턴에 올바른 키를 사용해야 합니다. 데이터 필터링 키 목록과 지원되는 각 AWS 서비스의 필터 패턴 예제는 [서로 다른 AWS 서비스에서 필터 사용](#filtering-by-service) 섹션을 참조하세요.

이벤트 필터링은 멀티 레벨 JSON 필터링을 처리할 수 있습니다. 예를 들어 DynamoDB 스트림의 다음 레코드 조각을 고려하세요.

```
"dynamodb": {
    "Keys": {
        "ID": {
            "S": "ABCD"
        }
        "Number": {
            "N": "1234"
    },
    ...
}
```

정렬 키 `Number`의 값이 4567인 레코드만 처리하려고 한다고 가정해 보겠습니다. 이러한 경우 `FilterCriteria` 객체는 다음과 같습니다.

```
{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\": { \"Keys\": { \"Number\": { \"N\": [ "4567" ] } } } }"
        }
    ]
}
```

명확성을 더하기 위해 일반 JSON으로 확장된 필터의 `Pattern` 값은 다음과 같습니다.

```
{
    "dynamodb": {
        "Keys": {
            "Number": {
                "N": [ "4567" ]
                }
            }
        }
}
```

## 필터 기준을 충족하지 않는 레코드 처리
<a name="filtering-criteria-not-met"></a>

Lambda가 필터 기준을 충족하지 않는 레코드를 처리하는 방식은 이벤트 소스에 따라 다릅니다.
+ **Amazon SQS**의 경우 메시지가 필터 기준을 충족하지 못하는 경우 Lambda는 자동으로 대기열에서 메시지를 제거합니다. 이러한 메시지를 Amazon SQS에서 수동으로 삭제할 필요가 없습니다.
+ **Kinesis**와 **DynamoDB**의 경우, 필터 기준이 레코드를 평가한 후 스트림 반복기는 이 레코드를 지나서 진행됩니다. 레코드가 필터 조건을 충족하지 않으면 이벤트 소스에서 수동으로 레코드를 삭제할 필요가 없습니다. 보존 기간이 지나면 Kinesis 및 DynamoDB는 이러한 이전 레코드를 자동으로 삭제합니다. 레코드를 더 빨리 삭제하려면 [데이터 보존 기간 변경](https://docs.aws.amazon.com/streams/latest/dev/kinesis-extended-retention.html)을 참조하세요.
+ **Amazon MSK**, **자체 관리형 Apache Kafka** 및 **Amazon MQ** 메시지의 경우 Lambda는 필터에 포함된 모든 필드와 일치하지 않는 메시지를 삭제합니다. Amazon MSK 및 자체 관리형 Apache Kafka의 경우, Lambda는 함수를 성공적으로 호출한 후 일치하는 메시지와 일치하지 않는 메시지에 대한 오프셋을 커밋합니다. Amazon MQ의 경우, Lambda는 함수를 성공적으로 호출한 후 일치하는 메시지를 확인하고, 일치하지 않는 메시지를 필터링할 때 확인합니다.

## 필터 규칙 구문
<a name="filtering-syntax"></a>

필터 규칙의 경우 Lambda는 Amazon EventBridge 규칙을 지원하며 EventBridge와 동일한 구문을 사용합니다. 자세한 내용은 **Amazon EventBridge 사용 설명서의 [Amazon EventBridge 이벤트 패턴](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)을 참조하세요.

다음은 Lambda 이벤트 필터링에 사용할 수 있는 모든 비교 연산자에 대한 요약입니다.


| 비교 연산자 | 예제 | 규칙 구문 | 
| --- | --- | --- | 
|  Null  |  UserID가 null임  |  "UserID": [ null ]  | 
|  비어 있음  |  LastName이 비어 있음  |  "LastName": [""]  | 
|  같음  |  이름이 “Alice”임  |  "Name": [ "Alice" ]  | 
|  같음(대/소문자 무시)  |  이름이 ‘Alice’임  |  "Name": [ \$1 "equals-ignore-case": "alice" \$1 ]  | 
|  및  |  위치가 “New York”이고 요일이 “Monday”임  |  "Location": [ "New York" ], "Day": ["Monday"]  | 
|  또는  |  PaymentType이 “Credit” 또는 “Debit”임  |  "PaymentType": [ "Credit", "Debit"]  | 
|  또는(여러 필드)  |  위치가 'New York'이고 요일이 'Monday'임  |  "\$1or": [ \$1 "Location": [ "New York" ] \$1, \$1 "Day": [ "Monday" ] \$1 ]   | 
|  아님  |  날씨는 “Raining”이 아님  |  "Weather": [ \$1 "anything-but": [ "Raining" ] \$1 ]  | 
|  숫자(같음)  |  가격은 100임  |  "Price": [ \$1 "numeric": [ "=", 100 ] \$1 ]  | 
|  숫자(범위)  |  가격이 10을 초과하고 20보다 작거나 같음  |  "Price": [ \$1 "numeric": [ ">", 10, "<=", 20 ] \$1 ]  | 
|  존재함  |  Productname이 있음  |  "ProductName": [ \$1 "exists": true \$1 ]  | 
|  존재하지 않음  |  Productname이 없음  |  "ProductName": [ \$1 "exists": false \$1 ]  | 
|  로 시작함  |  리전이 미국에 있음  |  "Region": [ \$1"prefix": "us-" \$1 ]  | 
|  다음으로 끝남  |  FileName은 .png 확장명으로 끝납니다.  |  "FileName": [ \$1 "suffix": ".png" \$1 ]   | 

**참고**  
EventBridge와 마찬가지로 문자열의 경우 Lambda는 대소문자 변환이나 기타 문자열 정규화 없이 정확한 문자별 일치를 사용합니다. 숫자의 경우 Lambda는 문자열 표현도 사용합니다. 예를 들어 300, 300.0 및 3.0e2는 동일한 것으로 간주되지 않습니다.

Exists 연산자가 이벤트 소스 JSON의 리프 노드에서만 작동한다는 점에 유의하세요. 중간 노드와 일치하지 않습니다. 예를 들어 다음 JSON에서는 `"address"`가 중간 노드이므로 필터 패턴(`{ "person": { "address": [ { "exists": true } ] } }"`)이 일치하는 항목을 찾지 못합니다.

```
{
  "person": {
    "name": "John Doe",
    "age": 30,
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "country": "USA"
    }
  }
}
```

## 이벤트 소스 매핑에 필터 기준 연결(콘솔)
<a name="filtering-console"></a>

다음 단계에 따라 Lambda 콘솔을 사용하여 필터 기준을 사용하여 새 이벤트 소스 매핑을 생성합니다.

**필터 기준을 사용하여 새 이벤트 소스 매핑을 생성하려면(콘솔)**

1. Lambda 콘솔의 [함수(Functions)](https://console.aws.amazon.com/lambda/home#/functions) 페이지를 엽니다.

1. 이벤트 소스 매핑을 생성할 함수의 이름을 선택합니다.

1. **함수 개요(Function overview)**에서 **트리거 추가(Add trigger)**를 선택합니다.

1. **트리거 구성(Trigger configuration)**에서 이벤트 필터링을 지원하는 트리거 유형을 선택합니다. 지원되는 서비스 목록은 이 페이지의 시작 부분에 있는 목록을 참조하세요.

1. **추가 설정**을 폅니다.

1. **필터 기준(Filter criteria)**에서 **추가(Add)**를 선택한 다음, 필터를 정의하고 입력합니다. 예를 들면 다음과 같이 입력할 수 있습니다.

   ```
   { "Metadata" : [ 1, 2 ] }
   ```

   이는 필드 `Metadata`가 1 또는 2인 레코드만 처리하도록 Lambda에 지시합니다. 계속해서 **추가**를 선택하여 최대 허용량까지 필터를 더 추가할 수 있습니다.

1. 필터 추가를 마쳤으면 **저장**을 선택합니다.

콘솔을 사용하여 필터 기준을 입력할 때 필터 패턴만 입력하면 되며 `Pattern` 키나 이스케이프 따옴표를 제공할 필요가 없습니다. 앞의 지침의 6단계에서 `{ "Metadata" : [ 1, 2 ] }`는 다음 `FilterCriteria`에 해당합니다.

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

콘솔에서 이벤트 소스 매핑을 생성한 후 트리거 세부 정보에서 형식이 지정된 `FilterCriteria`를 확인할 수 있습니다. 콘솔을 사용하여 이벤트 필터를 생성하는 추가 예는 [서로 다른 AWS 서비스에서 필터 사용](#filtering-by-service) 섹션을 참조하세요.

## 이벤트 소스 매핑에 필터 기준 연결(AWS CLI)
<a name="filtering-cli"></a>

이벤트 소스 매핑에 다음 `FilterCriteria`가 포함되기를 원한다고 가정해 보겠습니다.

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

AWS Command Line Interface(AWS CLI)를 사용하여 이러한 필터 기준으로 새 이벤트 소스 매핑을 생성하려면 다음 명령을 실행합니다.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

이 [create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html) 명령은 지정된 `FilterCriteria`로 함수 `my-function`에 대한 새 Amazon SQS 이벤트 소스 매핑을 생성합니다.

이러한 필터 기준을 기존 이벤트 소스 매핑에 추가하려면 다음 명령을 실행합니다.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

이벤트 소스 매핑을 업데이트하려면 해당 UUID가 필요합니다. [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html) 호출에서 UUID를 가져올 수 있습니다. Lambda는 또한 [create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html) CLI 응답에서 UUID를 반환합니다.

이벤트 소스에서 필터 기준을 제거하려면, 빈 `FilterCriteria` 객체로 다음 [update-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/update-event-source-mapping.html) 명령을 실행할 수 있습니다.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria "{}"
```

AWS CLI를 사용하여 이벤트 필터를 생성하는 추가 예는 [서로 다른 AWS 서비스에서 필터 사용](#filtering-by-service) 섹션을 참조하세요.

## 이벤트 소스 매핑에 필터 기준 연결(AWS SAM)
<a name="filtering-sam"></a>

 AWS SAM에서 다음 필터 기준을 사용하도록 이벤트 소스를 구성한다고 가정해 보겠습니다.

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

 이러한 필터 기준을 이벤트 소스 매핑에 추가하려면 다음 코드 조각을 이벤트 소스의 YAML 템플릿에 삽입합니다.

```
FilterCriteria: 
  Filters: 
    - Pattern: '{"Metadata": [1, 2]}'
```

 이벤트 소스 매핑을 위한 AWS SAM 템플릿을 생성하고 구성하는 방법에 대한 자세한 내용은 AWS SAM 개발자 가이드에서 [EventSource](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-eventsource.html) 섹션을 참조하세요. AWS SAM 템플릿을 사용하여 이벤트 필터를 생성하는 추가 예는 [서로 다른 AWS 서비스에서 필터 사용](#filtering-by-service) 섹션을 참조하세요.

## 필터 기준 암호화
<a name="filter-criteria-encryption"></a>

기본적으로 Lambda는 필터 기준 객체를 암호화하지 않습니다. 필터 기준 객체에 민감한 정보를 포함할 수 있는 사용 사례의 경우 자체 [KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)를 사용하여 이를 암호화할 수 있습니다.

필터 기준 객체를 암호화한 후 [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API 직접 호출을 사용하여 일반 텍스트 버전을 볼 수 있습니다. 필터 기준을 일반 텍스트로 제대로 볼 수 있으려면 `kms:Decrypt` 권한이 있어야 합니다.

**참고**  
필터 기준 객체가 암호화된 경우 Lambda는 [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html) 호출에 대한 응답으로 `FilterCriteria` 필드 값을 삭제합니다. 대신 이 필드는 `null`로 표시됩니다. `FilterCriteria`의 실제 값을 확인하려면 [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API를 사용합니다.  
콘솔에서 `FilterCriteria`의 해독된 값을 보려면 IAM 역할에 [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) 권한이 포함되어 있는지 확인하세요.

콘솔, API/CLI 또는 CloudFormation를 통해 고유한 KMS 키를 지정할 수 있습니다.

**고객 소유의 KMS 키를 사용하여 필터 기준을 암호화하려면 다음을 수행하세요(콘솔).**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. **트리거 추가**를 선택합니다. 기존 트리거가 이미 있는 경우 **구성** 탭을 선택한 다음 **트리거**를 선택합니다. 기존 트리거를 선택하고 **편집**을 선택합니다.

1. **고객 관리형 KMS 키로 암호화** 옆의 확인란을 선택합니다.

1. **고객 관리형 KMS 암호화 키 선택**에서 기존에 활성화된 키를 선택하거나 새 키를 생성합니다. 작업에 따라 `kms:DescribeKey`, `kms:GenerateDataKey` 및 `kms:Decrypt` 권한 중 일부 또는 전체가 필요합니다. KMS 키 정책을 사용하여 이러한 권한을 부여하세요.

자체 KMS 키를 사용하는 경우 [키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)에서 다음 API 작업을 허용해야 합니다.
+ `kms:Decrypt` - 리전 Lambda 서비스 위탁자(`lambda.AWS_region.amazonaws.com`)에 부여되어야 합니다. 이를 통해 Lambda는 이 KMS 키로 데이터를 복호화할 수 있습니다.
  + [서비스 간에 혼동되는 대리인 문제](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)를 방지하기 위해 키 정책에서 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 전역 조건 키를 사용합니다. `aws:SourceArn` 키의 올바른 값은 이벤트 소스 매핑 리소스의 ARN이므로 ARN을 알고 나서야 이 값을 정책에 추가할 수 있습니다. 또한 Lambda는 KMS에 암호 해독 요청을 할 때 [암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)에서 `aws:lambda:FunctionArn` 및 `aws:lambda:EventSourceArn` 키와 해당 값을 전달합니다. 암호 해독 요청이 성공하려면 이러한 값이 키 정책의 지정된 조건과 일치해야 합니다. 자체 관리형 Kafka 이벤트 소스에는 EventSourcearn이 없으므로 EventSourcearn을 포함할 필요가 없습니다.
+ `kms:Decrypt`[[ - 또한 GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) 또는 DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API 직접 호출에서 일반 텍스트 필터 기준을 보기 위해 키를 사용하려는 위탁자에게도 권한을 부여해야 합니다.
+ `kms:DescribeKey` - 지정된 위탁자가 고객 관리형 키를 사용할 수 있도록 해당 세부 정보를 제공합니다.
+ `kms:GenerateDataKey` - Lambda가 지정된 위탁자([봉투 암호화](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping))를 대신하여 필터 기준을 암호화하는 데이터 키를 생성할 수 있는 권한을 제공합니다.

AWS CloudTrail을 사용하여 Lambda가 사용자 대신 수행하는 AWS KMS 요청을 추적할 수 있습니다. 샘플 CloudTrail 이벤트에 대한 내용은 [Lambda에 대한 암호화 키 모니터링](security-encryption-at-rest.md#encryption-key-monitoring) 섹션을 참조하세요.

또한 [https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service) 조건 키를 사용하여 KMS 키 사용을 Lambda의 요청으로만 제한하는 것이 좋습니다. 이 키의 값은 리전 Lambda 서비스 위탁자(`lambda.AWS_region.amazonaws.com`)입니다. 다음은 모든 관련 권한을 부여하는 샘플 키 정책입니다.

**Example AWS KMS 키 정책**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "example-key-policy-1",
    "Statement": [
        {
            "Sid": "Allow Lambda to decrypt using the key",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.us-east-1.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals" : {
                    "aws:SourceArn": [
                        "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:<esm_uuid>"
                    ]
                },
                "StringEquals": {
                    "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:test-function",
                    "kms:EncryptionContext:aws:lambda:EventSourceArn": "arn:aws:sqs:us-east-1:123456789012:test-queue"
                }
            }
        },
        {
            "Sid": "Allow actions by an AWS account on the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key to specific roles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/ExampleRole"
            },
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals" : {
                    "kms:ViaService": "lambda.us-east-1.amazonaws.com"
                }
            }
        }
    ]
}
```

자체 KMS 키를 사용하여 필터 기준을 암호화하려면 다음 [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) AWS CLI 명령을 사용할 수도 있습니다. `--kms-key-arn` 플래그를 사용하여 KMS 키 ARN을 지정합니다.

```
aws lambda create-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

기존 이벤트 소스 매핑이 있는 경우 [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) AWS CLI 명령을 대신 사용하세요. `--kms-key-arn` 플래그를 사용하여 KMS 키 ARN을 지정합니다.

```
aws lambda update-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

이 작업은 이전에 지정된 모든 KMS 키를 덮어씁니다. 빈 인수와 함께 `--kms-key-arn` 플래그를 지정하면 Lambda는 KMS 키를 사용하여 필터 기준을 암호화하는 것을 중지합니다. 대신 Lambda는 기본적으로 Amazon 소유 키를 다시 사용합니다.

CloudFormation 템플릿에서 고유한 KMS 키를 지정하려면 `AWS::Lambda::EventSourceMapping` 리소스 유형의 `KMSKeyArn` 속성을 사용하세요. 예를 들어 다음 코드 조각을 이벤트 소스의 YAML 템플릿에 삽입할 수 있습니다.

```
MyEventSourceMapping:
  Type: AWS::Lambda::EventSourceMapping
  Properties:
    ...
    FilterCriteria:
      Filters:
        - Pattern: '{"a": [1, 2]}'
    KMSKeyArn: "arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599"
    ...
```

[GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) 또는 [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) API 직접 호출에서 암호화된 필터 기준을 일반 텍스트로 보려면 `kms:Decrypt` 권한이 있어야 합니다.

2024년 8월 6일부터 함수가 이벤트 필터링을 사용하지 않는 경우 [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html), [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) 및 [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) API 직접 호출의 AWS CloudTrail 로그에 `FilterCriteria` 필드가 더 이상 표시되지 않습니다. 함수가 이벤트 필터링을 사용하는 경우 `{}` 필드는 empty(`FilterCriteria`)로 표시됩니다. 올바른 KMS 키에 대한 `kms:Decrypt` 권한이 있으면 [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API 직접 호출의 응답에서 여전히 필터 기준을 일반 텍스트로 볼 수 있습니다.

### Create/Update/DeleteEventSourceMapping 직접 호출에 대한 샘플 CloudTrail 로그 항목
<a name="filter-criteria-encryption-cloudtrail"></a>

CreateEventSourceMapping 호출에 대한 다음 AWS CloudTrail 샘플 로그 항목에서 함수가 이벤트 필터링을 사용하기 때문에 `FilterCriteria`가 empty(`{}`)로 표시됩니다. 이는 함수가 현재 사용하고 있는 유효한 필터 기준이 `FilterCriteria` 객체에 포함되어 있는 경우에도 마찬가지입니다. 함수가 이벤트 필터링을 사용하지 않는 경우 CloudTrail은 로그 항목에 `FilterCriteria` 필드를 전혀 표시하지 않습니다.

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA123456789EXAMPLE:userid1",
        "arn": "arn:aws:sts::123456789012:assumed-role/Example/example-role",
        "accountId": "123456789012",
        "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROA987654321EXAMPLE",
                "arn": "arn:aws:iam::123456789012:role/User1",
                "accountId": "123456789012",
                "userName": "User1"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-05-09T20:35:01Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2024-05-09T21:05:41Z",
    "eventSource": "lambda.amazonaws.com",
    "eventName": "CreateEventSourceMapping20150331",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "functionName": "example-function",
        "enabled": true,
        "batchSize": 10,
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "scalingConfig": {},
        "maximumBatchingWindowInSeconds": 0,
        "sourceAccessConfigurations": []
    },
    "responseElements": {
        "uUID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
        "batchSize": 10,
        "maximumBatchingWindowInSeconds": 0,
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:example-function",
        "lastModified": "May 9, 2024, 9:05:41 PM",
        "state": "Creating",
        "stateTransitionReason": "USER_INITIATED",
        "functionResponseTypes": [],
        "eventSourceMappingArn": "arn:aws:lambda:us-east-2:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLEbbbbb"
    },
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management",
    "sessionCredentialFromConsole": "true"
}
```

## 서로 다른 AWS 서비스에서 필터 사용
<a name="filtering-by-service"></a>

이벤트 소스 유형마다 데이터 필드에 서로 다른 키 값을 사용합니다. 데이터 속성을 필터링하려면 필터의 패턴에 올바른 키를 사용해야 합니다. 다음 표에는 지원되는 각 AWS 서비스에 대한 필터링 키가 나와 있습니다.


| AWS 서비스 | 키 필터링 | 
| --- | --- | 
| DynamoDB | dynamodb | 
| Kinesis | data | 
| Amazon MQ | data | 
| Amazon MSK | value | 
| 자체 관리형 Apache Kafka | value | 
|  Amazon SQS | body | 

다음 섹션들에서는 다양한 유형의 이벤트 소스에 대한 필터 패턴의 예제를 제공합니다. 또한 지원되는 수신 데이터 형식의 정의와 지원되는 각 서비스에 대한 필터 패턴 본문 형식을 제공합니다.
+ [DynamoDB 이벤트 소스를 통해 이벤트 필터링 사용](with-ddb-filtering.md)
+ [Kinesis 이벤트 소스를 통해 이벤트 필터링 사용](with-kinesis-filtering.md)
+ [Amazon MQ 이벤트 소스에서 이벤트 필터링](with-mq-filtering.md)
+ [Amazon MSK 및 자체 관리형 Apache Kafka 이벤트 소스에서 이벤트 필터링](kafka-filtering.md)
+ [Amazon SQS 이벤트 소스를 통해 이벤트 필터링 사용](with-sqs-filtering.md)

# 콘솔에서 Lambda 함수 테스트
<a name="testing-functions"></a>

테스트 이벤트로 함수를 호출하여 콘솔에서 Lambda 함수를 테스트할 수 있습니다. *테스트 이벤트*는 함수에 대한 JSON 입력입니다. 함수에 입력이 필요하지 않은 경우 이벤트는 빈 문서(`({})`)가 될 수 있습니다.

콘솔에서 테스트를 실행하면 Lambda는 테스트 이벤트와 함께 동시에 함수를 간접 호출합니다. 함수 런타임은 JSON을 객체로 변환하고 처리를 위해 코드의 핸들러 메서드로 전달합니다.

**테스트 이벤트 생성**  
콘솔에서 테스트하려면 먼저 프라이빗 또는 공유 가능한 테스트 이벤트를 생성해야 합니다.

## 테스트 이벤트로 함수 호출
<a name="invoke-with-event"></a>

**함수 테스트**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 테스트하려는 함수의 이름을 선택합니다.

1. **테스트(Test)** 탭을 선택합니다.

1. **테스트 이벤트**에서 **새 이벤트 생성** 또는 **저장된 이벤트 편집**을 선택한 다음 사용하려는 저장된 이벤트를 선택합니다.

1. 선택 사항 - 이벤트 JSON용 **템플릿**을 선택합니다.

1. **테스트(Test)**를 선택합니다.

1. 테스트 결과를 확인하려면 **실행 결과(Execution result)**에서 **세부 정보(Details)**를 확장합니다.

테스트 이벤트를 저장하지 않고 함수를 간접 호출하려면 저장하기 전에 **테스트(Test)**를 선택합니다. 이렇게 하면 세션 기간 동안에만 Lambda가 보존하는 저장되지 않은 테스트 이벤트가 생성됩니다.

Node.js, Python, Ruby 런타임의 경우 **코드** 탭에서 기존에 저장되거나 저장되지 않은 테스트 이벤트에 액세스할 수도 있습니다. **테스트 이벤트** 섹션을 사용하여 테스트를 생성, 편집 및 실행합니다.

## 프라이빗 테스트 이벤트 생성
<a name="creating-private-events"></a>

프라이빗 테스트 이벤트는 이벤트 작성자만 사용할 수 있으며, 사용하기 위해 추가 권한이 필요하지 않습니다. 함수당 최대 10개의 프라이빗 테스트 이벤트를 생성하고 저장할 수 있습니다.

**프라이빗 테스트 이벤트 생성**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 테스트하려는 함수의 이름을 선택합니다.

1. **테스트(Test)** 탭을 선택합니다.

1. **테스트 이벤트(Test event)**에서 다음을 수행합니다.

   1. **템플릿(Template)**을 선택합니다.

   1. 테스트의 **이름(Name)**을 입력합니다.

   1. 텍스트 입력 상자에 JSON 테스트 이벤트를 입력합니다.

   1. **이벤트 공유 설정(Event sharing settings)**에서 **프라이빗(Private)**을 선택합니다.

1. **변경 사항 저장**을 선택합니다.

Node.js, Python, Ruby 런타임의 경우 **코드** 탭에서 테스트 이벤트를 생성할 수도 있습니다. **테스트 이벤트** 섹션을 사용하여 테스트를 생성, 편집 및 실행합니다.

## 공유 가능한 테스트 이벤트 생성
<a name="creating-shareable-events"></a>

공유 가능한 테스트 이벤트는 동일한 AWS 계정의 다른 사용자와 공유할 수 있는 테스트 이벤트입니다. 다른 사용자의 공유 가능한 테스트 이벤트를 편집하고 해당 이벤트로 자신의 함수를 간접 호출할 수 있습니다.

Lambda는 `lambda-testevent-schemas`로 이름이 지정된 [Amazon EventBridge(CloudWatch Events) 스키마 레지스트리](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-schema-registry.html)에 공유 가능한 테스트 이벤트를 스키마로 저장합니다. Lambda는 이 레지스트리를 사용하여 사용자가 생성한 공유 가능한 테스트 이벤트를 저장하고 호출하므로, 이 레지스트리를 편집하거나 `lambda-testevent-schemas`라는 이름을 사용하여 레지스트리를 생성하지 않는 것이 좋습니다.

공유 가능한 테스트 이벤트를 보고, 공유하고, 편집하려면 다음의 모든 [EventBridge(CloudWatch Events) Schema Registry API 작업](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/operations.html)에 대한 권한이 있어야 합니다.
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#CreateRegistry](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#CreateRegistry)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#CreateSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#CreateSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DeleteSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DeleteSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-version-schemaversion.html#DeleteSchemaVersion](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-version-schemaversion.html#DeleteSchemaVersion)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#DescribeRegistry](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#DescribeRegistry)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DescribeSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DescribeSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-discover.html#GetDiscoveredSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-discover.html#GetDiscoveredSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-versions.html#ListSchemaVersions](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-versions.html#ListSchemaVersions)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#UpdateSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#UpdateSchema)

공유 가능한 테스트 이벤트에 대한 편집 내용을 저장하면 해당 이벤트를 덮어씁니다.

공유 가능한 테스트 이벤트를 만들거나, 편집하거나, 볼 수 없는 경우 계정에 이러한 작업에 필요한 권한이 있는지 확인합니다. 필요한 권한이 있지만 여전히 공유 가능한 테스트 이벤트에 액세스할 수 없는 경우, EventBridge(CloudWatch Events) 레지스트리에 대한 액세스 권한을 제한할 수 있는 [리소스 기반 정책](access-control-resource-based.md)이 있는지 확인합니다.

**공유 가능한 테스트 이벤트 생성**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 테스트하려는 함수의 이름을 선택합니다.

1. **테스트(Test)** 탭을 선택합니다.

1. **테스트 이벤트(Test event)**에서 다음을 수행합니다.

   1. **템플릿(Template)**을 선택합니다.

   1. 테스트의 **이름(Name)**을 입력합니다.

   1. 텍스트 입력 상자에 JSON 테스트 이벤트를 입력합니다.

   1. **이벤트 공유 설정(Event sharing settings)**에서 **공유 가능(Shareable)**을 선택합니다.

1. **변경 사항 저장**을 선택합니다.

**AWS Serverless Application Model에서 공유 가능한 테스트 이벤트를 사용합니다.**  
AWS SAM을 사용하여 공유 가능한 테스트 이벤트를 간접 호출할 수 있습니다. [AWS Serverless Application Model 개발자 안내서](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html)의 [https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html) 참조

## 공유 가능한 테스트 이벤트 스키마 삭제
<a name="deleting-test-schemas"></a>

공유 가능한 테스트 이벤트를 삭제하면 Lambda는 `lambda-testevent-schemas` 레지스트리에서 해당 이벤트를 제거합니다. 레지스트리에서 공유 가능한 마지막 테스트 이벤트를 제거하면 Lambda는 해당 레지스트리를 삭제합니다.

사용자가 함수를 삭제할 경우 Lambda는 연결된 공유 가능한 테스트 이벤트 스키마를 삭제하지 않습니다. 이러한 리소스는 [EventBridge(CloudWatch Events) 콘솔](https://console.aws.amazon.com/events)에서 수동으로 정리해야 합니다.

# Lambda 함수 상태
<a name="functions-states"></a>

함수를 간접 호출할 준비가 된 시기를 나타내기 위해 Lambda는 모든 함수에 대한 함수 구성에 [상태](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) 필드를 포함합니다. `State`는 함수를 성공적으로 간접 호출할 수 있는지 여부를 포함하여 함수의 현재 상태에 대한 정보를 제공합니다. 함수 상태는 함수 호출의 동작 또는 함수가 코드를 실행하는 방법을 변경하지 않습니다.

**참고**  
함수 상태 정의는 [SnapStart](snapstart.md) 함수에 따라 약간 다릅니다. 자세한 내용은 [Lambda SnapStart와 함수 상태](snapstart-activate.md#snapstart-function-states) 섹션을 참조하세요.

대부분의 경우 DynamoDB 테이블은 지연 시간이 짧은 데이터 액세스를 제공하고 Lambda 서비스를 통해 조정할 수 있으므로 간접 호출 간의 상태를 유지하는 데 이상적인 방법입니다. 이 서비스를 사용하는 경우 [ Amazon EFS for Lambda](https://aws.amazon.com/blogs/compute/using-amazon-efs-for-aws-lambda-in-your-serverless-applications/)에 데이터를 저장할 수도 있으며, 이를 통해 파일 시스템 스토리지에 대한 액세스 지연 시간이 짧아집니다.

함수 상태는 다음을 포함합니다.
+ `Pending` - Lambda가 함수를 만든 후 상태를 보류 중으로 설정합니다. 보류 상태 동안 Lambda는 VPC 또는 EFS 리소스와 같은 함수에 대한 리소스를 생성하거나 구성하려고 시도합니다. Lambda는 보류 상태에서 함수를 간접 호출하지 않습니다. 해당 함수에서 작동하는 호출 또는 기타 API 작업은 실패합니다.
+ `Active` - Lambda가 리소스 구성 및 프로비저닝을 완료한 후에 함수가 활성 상태로 전환됩니다. 함수는 활성 상태에서만 성공적으로 간접 호출될 수 있습니다.
+ `Failed` - 리소스 구성 또는 프로비저닝에 오류가 발생했음을 나타냅니다. 함수 생성이 실패하면 Lambda는 함수 상태를 실패로 설정합니다. 그러면 함수를 삭제하고 다시 생성해야 합니다.
+ `Inactive` - Lambda가 함수에 대해 구성된 외부 리소스를 회수할 수 있을 만큼 충분히 유휴 상태이면 해당 함수는 비활성 상태가 됩니다. 비활성 상태인 함수를 간접 호출하려고 하면 간접 호출이 실패하고 함수 리소스가 다시 만들어질 때까지 Lambda가 해당 함수를 보류 상태로 설정합니다. Lambda가 리소스를 다시 생성하지 못하면 함수가 비활성 상태로 돌아갑니다. 함수를 활성 상태로 복원하려면 오류를 해결하고 함수를 다시 배포해야 할 수 있습니다.

SDK 기반 자동화 워크플로를 사용하거나 Lambda의 서비스 API를 직접 호출하는 경우, 호출 전에 함수의 상태를 확인하여 활성 상태인지 확인합니다. 이 작업은 Lambda API 작업 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html)을 사용하거나 [AWS SDK for Java 2.0](https://github.com/aws/aws-sdk-java-v2)을 사용해 웨이터를 구성하여 수행할 수 있습니다.

```
aws lambda get-function --function-name my-function --query 'Configuration.[State, LastUpdateStatus]'
```

다음 결과가 표시됩니다.

```
[
 "Active",
 "Successful" 
]
```

함수 생성이 대기 중인 동안에는 다음 작업이 실패합니다.
+ [간접 호출](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)

## 업데이트 중 함수 상태
<a name="functions-states-updating"></a>

Lambda에는 함수 업데이트를 위한 두 가지 작업이 있습니다.
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html): 함수의 배포 패키지를 업데이트합니다.
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html): 함수의 구성을 업데이트합니다.

Lambda는 [LastUpdateStatus](https://docs.aws.amazon.com/lambda/latest/api/API_FunctionConfiguration.html#lambda-Type-FunctionConfiguration-LastUpdateStatus) 속성을 사용하여 이러한 업데이트 작업의 진행 상황을 추적합니다. 업데이트가 진행되는 동안(`"LastUpdateStatus": "InProgress"`일 때) 다음과 같은 일이 일어납니다.
+ 함수의 [State](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State)는 `Active` 상태로 유지됩니다.
+ 간접 호출은 업데이트가 완료될 때까지 함수의 이전 코드와 구성을 계속 사용합니다.
+ 다음 작업이 실패합니다.
  + [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
  + [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
  + [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)
  + [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html)

업데이트가 실패할 경우(`"LastUpdateStatus": "Failed"`인 경우):
+ 함수의 [State](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State)는 `Active` 상태로 유지됩니다.
+ 간접 호출이 함수의 이전 코드 및 구성을 계속 사용합니다.

**Example GetFunctionConfiguration 응답**  
다음 예는 업데이트 중인 함수에 대한 [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html) 요청의 결과입니다.  

```
{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
    "Runtime": "nodejs24.x",
    "VpcConfig": {
        "SubnetIds": [
            "subnet-071f712345678e7c8",
            "subnet-07fd123456788a036",
            "subnet-0804f77612345cacf"
        ],
        "SecurityGroupIds": [
            "sg-085912345678492fb"
        ],
        "VpcId": "vpc-08e1234569e011e83"
    },
    "State": "Active",
    "LastUpdateStatus": "InProgress",
    ...
}
```

# Lambda의 재시도 동작 이해
<a name="invocation-retries"></a>

함수를 직접 간접 호출하는 경우 함수 코드와 관련된 오류 처리 전략을 결정합니다. Lambda는 사용자를 대신하여 이러한 유형의 오류를 자동으로 재시도하지 않습니다. 재시도할 때에는 함수를 수동으로 다시 간접 호출하고 실패한 이벤트를 대기열로 보내 디버깅하거나 오류를 무시할 수 있습니다. 함수의 코드는 완전히 또는 부분적으로 실행되었거나 전혀 실행되지 않았을 수 있습니다. 재시도하는 경우 함수의 코드가 중복 트랜잭션 또는 기타 원치 않는 부작용을 일으키지 않고도 동일한 이벤트를 여러 번 처리할 수 있게 해야 합니다.

함수를 직접 간접 호출하는 경우 간접 호출자의 재시도 동작과 요청이 수행되는 과정에서 만나게 되는 모든 서비스에 대해 잘 알고 있어야 합니다. 여기에는 다음 시나리오가 포함됩니다.
+ **비동기식 호출** – Lambda는 함수 오류를 두 번 재시도합니다. 함수가 모든 수신 요청을 처리할 만큼 용량이 충분하지 않은 경우, 이벤트는 함수로 전송될 때까지 몇 시간 동안 대기열에서 대기할 수 있습니다. 성공적으로 처리되지 않은 이벤트를 캡처하도록 함수에 대해 배달 못한 편지 대기열을 구성할 수 있습니다. 자세한 내용은 [Dead Letter Queue(DLQ) 추가](invocation-async-retain-records.md#invocation-dlq) 단원을 참조하십시오.
+ **이벤트 소스 매핑** – 스트림에서 읽기를 수행하는 이벤트 소스 매핑은 항목의 전체 배치를 재시도합니다. 반복되는 오류는 오류가 해결되거나 항목이 만료될 때까지 영향을 받은 샤드의 처리를 차단합니다. 중단된 샤드를 탐지하려면 [반복기 수명](monitoring-metrics.md) 지표를 모니터링하면 됩니다.

  대기열에서 읽는 이벤트 소스 매핑의 경우 소스 대기열에서 가시성 제한 시간 및 리드라이브 정책을 구성하여 실패한 이벤트에 대한 재시도와 대상 간의 시간 길이를 결정합니다. 자세한 내용은 [Lambda가 스트림 및 대기열 기반 이벤트 소스의 레코드를 처리하는 방법](invocation-eventsourcemapping.md) 및 [다른 AWS 서비스의 이벤트로 Lambda 간접 호출](lambda-services.md)의 서비스별 주제를 참조하세요.
+ **AWS 서비스** – AWS 서비스는 함수를 [동기식](invocation-sync.md) 또는 비동기식으로 간접 호출할 수 있습니다. 동기식 호출의 경우 서비스는 재시도 여부를 결정합니다. 예를 들어, Lambda 함수가 `TemporaryFailure` 응답 코드를 반환하면 Amazon S3 배치 작업이 작업을 다시 시도합니다. 업스트림 사용자 또는 클라이언트의 요청을 프록시하는 서비스는 재시도 전략을 갖고 있거나 오류 응답을 요청자에게 다시 릴레이할 수 있습니다. 예를 들어, API Gateway는 오류 응답을 요청자에게 항상 다시 릴레이합니다.

  비동기 호출의 경우, 재시도 로직은 간접 호출 소스와 관계없이 동일합니다. 기본적으로 Lambda는 실패한 비동기 호출을 최대 2회까지 재시도합니다. 자세한 내용은 [Lambda가 비동기 호출을 통해 오류 및 재시도를 처리하는 방법](invocation-async-error-handling.md) 단원을 참조하십시오.
+ **기타 계정 및 클라이언트** – 다른 계정에 대한 액세스 권한을 부여할 때 [리소스 기반 정책](access-control-resource-based.md)을 사용해 함수를 간접 호출하도록 구성할 수 있는 서비스 또는 리소스를 제한할 수 있습니다. 함수가 오버로드되는 것을 방지하기 위해 [Amazon API Gateway](services-apigateway.md)를 사용하여 함수 앞에 API 계층을 배치할 것을 고려하는 것이 좋습니다.

Lambda 애플리케이션에서 오류를 더 원활히 처리할 수 있도록 Lambda는 Amazon CloudWatch, AWS X-Ray와 같은 서비스와 통합됩니다. 로그, 지표, 경보 및 추적의 조합을 사용해 애플리케이션을 지원하는 함수 코드, API 또는 기타 리소스에서 문제를 신속하게 감지하고 식별할 수 있습니다. 자세한 내용은 [Lambda 함수 모니터링, 디버깅, 문제 해결](lambda-monitoring.md) 단원을 참조하십시오.

# Lambda 재귀 루프 감지를 사용하여 무한 루프 방지
<a name="invocation-recursion"></a>

함수를 간접적으로 간접 호출하는 동일한 서비스 또는 리소스로 출력하도록 Lambda 함수를 구성하면 무한 재귀 루프를 생성할 수 있습니다. 예를 들어 Lambda 함수는 Amazon Simple Queue Service(Amazon SQS) 대기열에 메시지를 작성한 다음 동일한 함수를 간접적으로 간접 호출할 수 있습니다. 이 간접 호출로 인해 함수는 대기열에 다른 메시지를 작성하고 다시 함수를 간접 호출합니다.

의도하지 않은 재귀 루프로 인해 예상치 못한 요금이 AWS 계정에 청구될 수 있습니다. 루프로 인해 Lambda가 [규모를 조정](lambda-concurrency.md)하고 계정의 사용 가능한 모든 동시성을 사용할 수도 있습니다. 의도하지 않은 루프의 영향을 줄이기 위해 Lambda는 특정 유형의 재귀 루프가 발생한 직후 이를 감지할 수 있습니다. 기본적으로 Lambda가 재귀 루프를 감지하면 함수 간접 호출을 중지하고 알려줍니다. 의도적으로 재귀 패턴 사용을 설계하는 경우 함수의 기본 구성을 변경하여 재귀 패턴 사용을 허용할 수 있습니다. 자세한 정보는 [Lambda 함수가 재귀 루프에서 실행되도록 허용](#invocation-recursion-disable)을 참조하세요.

**Topics**
+ [

## 재귀 루프 감지에 대한 이해
](#invocation-recursion-concepts)
+ [

## 지원되는 AWS 서비스 및 SDK
](#invocation-recursion-supported)
+ [

## 재귀 루프 알림
](#invocation-recursion-monitoring)
+ [

## 재귀 루프 감지 알림에 응답
](#invocation-recursion-responding)
+ [

## Lambda 함수가 재귀 루프에서 실행되도록 허용
](#invocation-recursion-disable)
+ [

## Lambda 재귀 루프 감지를 위해 지원되는 리전
](#invocation-recursion-regions)

## 재귀 루프 감지에 대한 이해
<a name="invocation-recursion-concepts"></a>

Lambda의 재귀 루프 감지는 이벤트 추적을 통해 작동합니다. Lambda는 특정 이벤트가 발생할 때 함수 코드를 실행하는 이벤트 기반 컴퓨팅 서비스입니다. 예를 들어 항목이 Amazon SQS 대기열 또는 Amazon Simple Notification Service(Amazon SNS) 주제에 추가되는 경우를 들 수 있습니다. Lambda는 이벤트를 시스템 상태 변경에 대한 정보가 포함된 JSON 객체로 함수에 전달합니다. 이벤트로 인해 함수가 실행되는 경우를 *간접 호출*이라고 합니다.

재귀 루프를 감지하기 위해 Lambda는 [AWS X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html) 추적 헤더를 사용합니다. [재귀 루프 감지를 지원하는 AWS 서비스](#invocation-recursion-supportedservices)가 이벤트를 Lambda로 보내면 해당 이벤트에 자동으로 메타데이터 주석이 추가됩니다. Lambda 함수가 [지원되는 AWS SDK 버전](#invocation-recursion-supportedsdks)을 사용하여 이러한 이벤트 중 하나를 지원되는 다른 AWS 서비스에 쓸 때 이 메타데이터가 업데이트됩니다. 업데이트된 메타데이터에는 이벤트가 함수를 간접적으로 간접 호출한 횟수가 포함됩니다.

**참고**  
이 기능을 작동하기 위해 X-Ray 활성 추적을 활성화할 필요는 없습니다. 재귀 루프 감지는 기본적으로 모든 AWS 고객에 대해 켜져 있습니다. 이 기능은 무료로 사용할 수 있습니다.

요청 체인**은 동일한 트리거 이벤트로 인해 발생하는 일련의 Lambda 간접 호출입니다. 예를 들어 Amazon SQS 대기열이 Lambda 함수를 간접적으로 간접 호출한다고 가정해 보겠습니다. 그러면 Lambda 함수가 처리된 이벤트를 동일한 Amazon SQS 대기열로 다시 전송하여 함수를 다시 간접적으로 간접 호출합니다. 이 예제에서 함수의 각 간접 호출은 동일한 요청 체인에 속합니다.

함수가 동일한 요청 체인에서 약 16번 간접 호출되는 경우 Lambda는 해당 요청 체인에서 다음 함수의 간접 호출을 자동으로 중지하고 사용자에게 알립니다. 함수가 여러 트리거로 구성된 경우 다른 트리거에서의 간접 호출은 영향을 받지 않습니다.

**참고**  
소스 대기열의 리드라이브 정책에 대한 `maxReceiveCount` 설정이 16보다 높은 경우에도 Lambda 재귀 보호는 재귀 루프가 감지되고 종료된 후 Amazon SQS가 메시지를 재시도하는 것을 막지 않습니다. Lambda는 재귀 루프를 감지하고 후속 간접 호출을 삭제하면 `RecursiveInvocationException`을(를) 이벤트 소스 매핑으로 반환합니다. 이로 인해 메시지의 `receiveCount` 값이 증가합니다. Amazon SQS가 `maxReceiveCount`를 초과했다고 판단하여 구성된 Dead Letter Queue(DLQ)로 메시지를 보낼 때까지 Lambda는 메시지를 계속 재시도하고 함수 호출을 계속 차단합니다.

함수에 대해 [실패 시 대상](invocation-async-retain-records.md#invocation-async-destinations) 또는 [Dead Letter Queue(DLQ)](invocation-async-retain-records.md#invocation-dlq)가 구성되어 있는 경우에도, Lambda는 중지된 간접 호출에서 이벤트를 대상 또는 DLQ로 전송합니다. 함수에 대한 대상 또는 Dead Letter Queue(DLQ)를 구성하는 경우 함수에서 사용하는 이벤트 트리거 또는 이벤트 소스 매핑을 사용하지 마세요. 함수를 간접적으로 호출하는 동일한 리소스에 이벤트를 보내면 또 다른 재귀 루프를 생성할 수 있으며 이 루프도 종료됩니다. 재귀 루프 감지를 옵트아웃하면 이 루프는 종료되지 않습니다.

## 지원되는 AWS 서비스 및 SDK
<a name="invocation-recursion-supported"></a>

Lambda는 지원되는 특정 AWS 서비스를 포함하는 재귀 루프만 감지할 수 있습니다. 재귀 루프를 감지하려면 함수도 지원되는 AWS SDK 중 하나를 사용해야 합니다.

### 지원되는 AWS 서비스
<a name="invocation-recursion-supportedservices"></a>

Lambda는 현재 함수, Amazon SQS, Amazon S3, Amazon SNS 간의 재귀 루프를 감지합니다. Lambda는 또한 동기식 또는 비동기식으로 서로를 간접적으로 간접 호출할 수 있는 Lambda 함수로만 구성된 루프를 감지합니다. 다음 다이어그램은 Lambda가 감지할 수 있는 루프의 몇 가지 예를 보여줍니다.

![\[Lambda 함수, Amazon SNS, Amazon S3, Amazon SQS 대기열 간의 재귀 루프 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/RunawayWorkloadDetected_v3.png)


Amazon DynamoDB 등의 다른 AWS 서비스가 루프의 일부인 경우 현재 Lambda는 이를 감지하고 중지할 수 없습니다.

Lambda는 현재 Amazon SQS, Amazon S3 및 Amazon SNS와 관련된 재귀 루프만 감지하기 때문에 다른 AWS 서비스와 관련된 루프로 인해 Lambda 함수가 의도치 않게 사용될 수 있습니다.

AWS 계정에 예기치 않은 요금이 청구되지 않도록 하려면 비정상적인 사용 패턴을 알리도록 [Amazon CloudWatch 경보](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)를 구성하는 것이 좋습니다. 예를 들어 Lambda 함수 동시성 또는 간접 호출의 급증에 대해 알리도록 CloudWatch를 구성할 수 있습니다. 계정 지출이 지정한 임계값을 초과할 때 알림을 받도록 [결제 경보](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html)를 구성할 수도 있습니다. 또는 [AWS Cost Anomaly Detection](https://docs.aws.amazon.com/cost-management/latest/userguide/manage-ad.html)를 사용하여 비정상적인 청구 패턴에 대해 경고할 수 있습니다.

### 지원되는 AWS SDK
<a name="invocation-recursion-supportedsdks"></a>

Lambda가 재귀 루프를 감지하려면 함수가 다음 이상의 SDK 버전 중 하나를 사용해야 합니다.


| 런타임 | 필요한 최소 AWS SDK 버전 | 
| --- | --- | 
|  Node.js  |  2.1147.0(SDK 버전 2) 3.105.0(SDK 버전 3)  | 
|  Python  |  1.24.46(boto3) 1.27.46(botocore)  | 
|  Java 8 및 Java 11  |  2.17.135  | 
|  Java 17  |  2.20.81  | 
|  Java 21  |  2.21.24  | 
|  .NET  |  3.7.293.0  | 
|  Ruby  |  3.134.0  | 
|  PHP  |  3.232.0  | 
|  Go  |  V2 SDK 1.57.0  | 

Python 및 Node.js와 같은 일부 Lambda 런타임에는 AWS SDK 버전이 포함되어 있습니다. 함수의 런타임에 포함된 SDK 버전이 필요한 최소 버전보다 낮은 경우 지원되는 SDK 버전을 함수의 배포 패키지에 추가할 수 있습니다. [Lambda 계층](chapter-layers.md)을 사용하여 지원되는 SDK 버전을 함수에 추가할 수도 있습니다. 각 Lambda 런타임에 포함된 SDK 목록은 [Lambda 런타임](lambda-runtimes.md) 단원을 참조하세요.

## 재귀 루프 알림
<a name="invocation-recursion-monitoring"></a>

Lambda가 재귀 루프를 중지하면 [Health Dashboard](https://aws.amazon.com/premiumsupport/technology/aws-health-dashboard/)와 이메일을 통해 알림을 받습니다. 또한 CloudWatch 지표를 사용하여 Lambda가 중지한 재귀 간접 호출 수를 모니터링할 수 있습니다.

### Health Dashboard 알림
<a name="invocation-recursion-phd"></a>

Lambda가 재귀 간접 호출을 중지하면 Health Dashboard는 **계정 상태** 페이지의 [미결 및 최근 문제](https://health.aws.amazon.com/health/home#/account/dashboard/open-issues) 아래에 알림을 표시합니다. Lambda가 재귀 간접 호출을 중지한 후 이 알림이 표시되기까지 최대 3.5시간이 걸릴 수 있습니다. Health Dashboard에서 계정 이벤트 보기에 대한 자세한 내용은 *AWS Health 사용 설명서*에서 [Getting started with your AWS Health Dashboard – Your account health](https://docs.aws.amazon.com/health/latest/ug/getting-started-health-dashboard.html)를 참조하세요.

### 이메일 알림
<a name="invocation-recursion-email"></a>

Lambda가 함수의 재귀 간접 호출을 처음 중지하면 이메일 알림이 전송됩니다. Lambda는 AWS 계정의 각 함수와 관련된 이메일을 24시간마다 최대 한 번 보냅니다. Lambda가 이메일 알림을 보낸 후 Lambda가 함수의 추가 재귀 간접 호출을 중지하더라도 그다음 24시간 동안 해당 함수에 대한 이메일이 더 이상 전송되지 않습니다. Lambda가 재귀 간접 호출을 중지한 후 이 이메일 알림을 받을 때까지 최대 3.5시간이 걸릴 수 있습니다.

Lambda는 AWS 계정의 기본 계정 연락처 및 대체 작업 연락처에 재귀 루프 이메일 알림을 보냅니다. 계정의 이메일 주소 보기 또는 업데이트에 대한 자세한 내용은 *AWS 참조 가이드*에서 [Updating contact information](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact.html)을 참조하세요.

### Amazon CloudWatch 측정치
<a name="invocation-recursion-cloudwatch"></a>

[CloudWatch 지표](monitoring-metrics-types.md) `RecursiveInvocationsDropped`는 단일 요청 체인에서 함수가 약 16회 넘게 간접적으로 간접 호출되어 Lambda가 중지한 함수 간접 호출 수를 기록합니다. Lambda는 재귀 간접 호출을 중지하는 즉시 이 지표를 내보냅니다. 이 지표를 보려면 [CloudWatch 콘솔에서 지표 보기](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics.html#monitoring-metrics-console) 지침을 따르고 지표 `RecursiveInvocationsDropped`를 선택하세요.

## 재귀 루프 감지 알림에 응답
<a name="invocation-recursion-responding"></a>

동일한 트리거 이벤트에 의해 함수가 약 16회 넘게 간접적으로 간접 호출되면 Lambda는 해당 이벤트에 대한 다음 함수 간접 호출을 중지하여 재귀 루프를 중지합니다. Lambda가 중지한 재귀 루프의 재발을 방지하려면 다음을 수행합니다.
+ 함수의 사용 가능한 [동시성](lambda-concurrency.md)을 0으로 줄이면 향후 모든 간접 호출이 제한됩니다.
+ 함수를 간접적으로 호출하는 트리거 또는 이벤트 소스 매핑을 제거하거나 비활성화합니다.
+ 함수를 간접적으로 호출하는 AWS 리소스에 이벤트를 다시 기록하는 코드 결함을 식별하고 수정합니다. 일반적인 결함은 변수를 사용하여 함수의 이벤트 소스와 대상을 정의할 때 발생합니다. 두 변수에 동일한 값을 사용하고 있지 않은지 확인하세요.

또한 Lambda 함수의 이벤트 소스가 Amazon SQS 대기열인 경우 소스 대기열에서 [Dead Letter Queue(DLQ)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue.html)를 구성하는 것이 좋습니다.

**참고**  
Lambda 함수가 아닌 소스 대기열에서 Dead Letter Queue(DLQ)를 구성해야 합니다. 함수에서 구성하는 Dead Letter Queue(DLQ)은 이벤트 소스 대기열이 아닌 함수의 [비동기식 간접 호출 대기열](invocation-async.md)에 사용됩니다.

이벤트 소스가 Amazon SNS 주제인 경우 함수에 대해 [실패 시 대상](invocation-async-retain-records.md#invocation-async-destinations)을 추가하는 것이 좋습니다.

**함수의 사용 가능한 동시성을 0으로 줄이려면(콘솔)**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수의 이름을 선택합니다.

1. **제한**을 선택합니다.

1. **함수 제한** 대화 상자에서 **확인**을 선택합니다.

**함수의 트리거 또는 이벤트 소스 매핑을 제거하려면(콘솔)**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수의 이름을 선택합니다.

1. **구성** 탭을 선택한 다음 **트리거**를 선택합니다.

1. **트리거**에서 삭제하려는 트리거 또는 이벤트 소스 매핑을 선택한 다음 **삭제**를 선택합니다.

1. **트리거 삭제** 대화 상자에서 **삭제**를 선택합니다.

**함수에 대한 이벤트 소스 매핑을 비활성화하려면(AWS CLI)**

1. 비활성화하려는 이벤트 소스 매핑의 UUID를 찾으려면 AWS Command Line Interface(AWS CLI) [list-event-source-mappings](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/list-event-source-mappings.html) 명령을 실행합니다.

   ```
   aws lambda list-event-source-mappings
   ```

1. 이벤트 소스 매핑을 비활성화하려면 다음 AWS CLI [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html) 명령을 실행합니다.

   ```
   aws lambda update-event-source-mapping --function-name MyFunction \
   --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 --no-enabled
   ```

## Lambda 함수가 재귀 루프에서 실행되도록 허용
<a name="invocation-recursion-disable"></a>

설계에서 의도적으로 재귀 루프를 사용하는 경우, Lambda 함수를 재귀적으로 간접 호출할 수 있도록 구성할 수 있습니다. 설계에 재귀 루프를 사용하지 않는 것이 좋습니다. 구현 오류로 인해 AWS 계정의 사용 가능한 모든 동시 실행 기능을 사용한 재귀 호출이 발생하고 계정에 예상치 못한 요금이 청구될 수 있습니다.

**중요**  
재귀 루프를 사용하는 경우 주의해서 다루세요. 모범 사례 가드 레일을 구현하여 구현 오류의 위험을 최소화하세요. 재귀 패턴 사용에 대한 모범 사례에 대해 자세히 알아보려면 Serverless Land의 [Recursive patterns that cause run-away Lambda functions](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway)를 참조하세요.

Lambda 콘솔, AWS Command Line Interface(AWS CLI) 및 [PutFunctionRecursionConfig](https://docs.aws.amazon.com//lambda/latest/api/API_PutFunctionRecursionConfig.html) API를 사용하여 재귀 루프를 허용하도록 함수를 구성할 수 있습니다. AWS SAM 및 CloudFormation에서 함수의 재귀 루프 감지 설정을 구성할 수도 있습니다.

기본적으로 Lambda는 재귀 루프를 탐지하고 종료합니다. 의도적으로 재귀 루프 사용을 설계하는 경우 함수의 기본 구성을 변경하지 않는 것이 좋습니다.

재귀 루프를 허용하도록 함수를 구성할 때는 [CloudWatch 지표](monitoring-metrics-types.md#invocation-metrics) `RecursiveInvocationsDropped`가 생성되지 않는다는 점에 유의하세요.

------
#### [ Console ]

**함수가 재귀 루프에서 실행되도록 허용하려면 다음을 수행하세요(콘솔).**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수의 이름을 선택하여 함수의 세부 정보 페이지를 엽니다.

1. **구성** 탭을 선택한 다음 **동시성 및 재귀 감지**를 선택합니다.

1. **재귀 루프 감지** 옆에서 **편집**을 선택합니다.

1. **재귀 루프 허용**을 선택합니다.

1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

[PutFunctionRecursionConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionRecursionConfig.html) API를 사용하여 함수를 재귀 루프에서 간접 호출하도록 허용할 수 있습니다. 재귀 루프 파라미터에 대해 `Allow`를 지정합니다. 예를 들어, `put-function-recursion-config` AWS CLI 명령으로 이 API를 직접적으로 호출할 수 있습니다.

```
aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Allow
```

------

함수의 구성을 기본 설정으로 다시 변경하여 Lambda가 재귀 루프를 감지할 때 재귀 루프를 종료하도록 할 수 있습니다. Lambda 콘솔 또는 AWS CLI를 사용하여 함수 구성을 편집합니다.

------
#### [ Console ]

**재귀 루프가 종료되도록 함수를 구성하려면 다음을 수행하세요(콘솔).**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수의 이름을 선택하여 함수의 세부 정보 페이지를 엽니다.

1. **구성** 탭을 선택한 다음 **동시성 및 재귀 감지**를 선택합니다.

1. **재귀 루프 감지** 옆에서 **편집**을 선택합니다.

1. **재귀 루프 종료**를 선택합니다.

1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

[PutFunctionRecursionConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionRecursionConfig.html) API를 사용하여 Lambda가 재귀 루프를 감지할 때 이를 종료하도록 함수를 구성할 수 있습니다. 재귀 루프 파라미터에 대해 `Terminate`를 지정합니다. 예를 들어, `put-function-recursion-config` AWS CLI 명령으로 이 API를 직접적으로 호출할 수 있습니다.

```
aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Terminate
```

------

## Lambda 재귀 루프 감지를 위해 지원되는 리전
<a name="invocation-recursion-regions"></a>

Lambda 재귀 루프 감지는 멕시코(중부) 및 아시아 태평양(뉴질랜드)을 제외한 모든 [상용 리전](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#region)에서 지원됩니다.

# Lambda 함수 URL 생성 및 관리
<a name="urls-configuration"></a>

함수 URL은 Lambda 함수를 위한 전용 HTTP(S) 엔드포인트입니다. Lambda 콘솔 또는 Lambda API를 통해 함수 URL을 생성하고 구성할 수 있습니다.

**작은 정보**  
Lambda는 HTTP 엔드포인트를 통해 함수를 간접적으로 호출하는 두 가지 방법, 즉 함수 URL과 Amazon API Gateway를 제공합니다. 사용 사례에 가장 적합한 방법을 잘 모르는 경우 [HTTP 요청을 사용하여 Lambda 함수를 간접 호출하는 메서드 선택](furls-http-invoke-decision.md) 섹션을 참조하세요.

함수 URL을 생성하면 Lambda가 자동으로 고유한 URL 엔드포인트를 생성합니다. 함수 URL을 생성하면 URL 엔드포인트가 변경되지 않습니다. 함수 URL 엔드포인트는 다음 형식을 취합니다.

```
https://<url-id>.lambda-url.<region>.on.aws
```

**참고**  
AWS 리전 아시아 태평양(하이데라바드)(`ap-south-2`), 아시아 태평양(멜버른)(`ap-southeast-4`), 아시아 태평양(말레이시아)(`ap-southeast-5`), 아시아 태평양(뉴질랜드)(`ap-southeast-6`), 아시아 태평양(태국)(`ap-southeast-7`), 아시아 태평양(타이페이)(`ap-east-2`),캐나다 서부(캘거리)(`ca-west-1`), 유럽(스페인)(`eu-south-2`)), 유럽(취리히)(`eu-central-2`), 이스라엘(텔아비브)(`il-central-1`) 및 중동(아랍에미리트)(`me-central-1`)에서는 함수 URL이 지원되지 않습니다.

함수 URL은 IPv4 및 IPv6을 지원하는 이중 스택을 지원합니다. 함수에 대한 함수 URL을 구성한 후 웹 브라우저, curl, Postman 또는 모든 HTTP 클라이언트를 통해 HTTP(S) 엔드포인트에서 함수를 간접 호출할 수 있습니다.

**참고**  
퍼블릭 인터넷을 통해서만 함수 URL에 액세스할 수 있습니다. Lambda 함수는 AWS PrivateLink를 지원하지만 함수 URL은 지원하지 않습니다.

Lambda 함수 URL은 보안 및 액세스 제어를 위해 [리소스 기반 정책](access-control-resource-based.md)을 사용합니다. 함수 URL은 교차 오리진 리소스 공유(CORS) 구성 옵션도 지원합니다.

함수 URL을 함수 별칭이나 `$LATEST` 게시되지 않은 함수 버전에 적용할 수 있습니다. 다른 함수 버전에는 함수 URL을 추가할 수 없습니다.

다음 섹션에서는 Lambda 콘솔, AWS CLI 및 CloudFormation 템플릿을 사용하여 함수 URL을 생성하고 관리하는 방법을 보여줍니다.

**Topics**
+ [

## 함수 URL 생성(콘솔)
](#create-url-console)
+ [

## 함수 URL 생성(AWS CLI)
](#create-url-cli)
+ [

## CloudFormation 템플릿에 함수 URL 추가
](#urls-cfn)
+ [

## 교차 오리진 리소스 공유(CORS)
](#urls-cors)
+ [

## 함수 URL 스로틀링
](#urls-throttling)
+ [

## 함수 URL 비활성화
](#urls-deactivating)
+ [

## 함수 URL 삭제
](#w2aac39c81c53)
+ [

# Lambda 함수 URL에 대한 액세스 제어
](urls-auth.md)
+ [

# Lambda 함수 URL 호출
](urls-invocation.md)
+ [

# Lambda 함수 URL 모니터링
](urls-monitoring.md)
+ [

# HTTP 요청을 사용하여 Lambda 함수를 간접 호출하는 메서드 선택
](furls-http-invoke-decision.md)
+ [

# 자습서: Lambda 함수 URL을 사용하여 웹후크 엔드포인트 생성
](urls-webhook-tutorial.md)

## 함수 URL 생성(콘솔)
<a name="create-url-console"></a>

다음 단계에 따라 콘솔을 사용하여 함수 URL을 생성합니다.

### 기존 함수에 대한 함수 URL 생성
<a name="create-url-existing-function"></a>

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수 URL을 생성할 함수의 이름을 선택합니다.

1. **구성(Configuration)** 탭을 선택한 다음, **함수 URL(Function URL)**을 선택합니다.

1. **함수 URL 생성(Create function URL)**을 선택합니다.

1. **인증 유형(Auth type)**에서 **AWS\$1IAM** 또는 **NONE**을 선택합니다. 함수 URL 인증에 대한 자세한 내용은 [액세스 관리](urls-auth.md) 섹션을 참조하세요.

1. (선택 사항) **교차 오리진 리소스 공유(CORS) 구성(Configure cross-origin resource sharing (CORS))**을 선택한 다음 함수 URL에 대한 CORS 설정을 구성합니다. CORS에 대한 자세한 내용은 [교차 오리진 리소스 공유(CORS)](#urls-cors) 섹션을 참조하세요.

1. **저장(Save)**을 선택합니다.

이렇게 하면 `$LATEST` 게시되지 않은 함수 버전에 대한 함수 URL이 생성됩니다. 함수 URL이 콘솔의 **함수 개요(Function overview)** 섹션에 표시됩니다.

### 기존 별칭에 대한 함수 URL 생성
<a name="create-url-existing-alias"></a>

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수 URL을 생성할 별칭을 사용하는 함수의 이름을 선택합니다.

1. **별칭(Aliases)** 탭을 선택한 다음, 함수 URL을 생성할 별칭의 이름을 선택합니다.

1. **구성(Configuration)** 탭을 선택한 다음, **함수 URL(Function URL)**을 선택합니다.

1. **함수 URL 생성(Create function URL)**을 선택합니다.

1. **인증 유형(Auth type)**에서 **AWS\$1IAM** 또는 **NONE**을 선택합니다. 함수 URL 인증에 대한 자세한 내용은 [액세스 관리](urls-auth.md) 섹션을 참조하세요.

1. (선택 사항) **교차 오리진 리소스 공유(CORS) 구성(Configure cross-origin resource sharing (CORS))**을 선택한 다음 함수 URL에 대한 CORS 설정을 구성합니다. CORS에 대한 자세한 내용은 [교차 오리진 리소스 공유(CORS)](#urls-cors) 섹션을 참조하세요.

1. **저장**을 선택합니다.

이렇게 하면 함수 별칭에 대한 함수 URL이 생성됩니다. 함수 URL이 콘솔의 별칭에 대한 **함수 개요(Function overview)** 섹션에 표시됩니다.

### 함수 URL을 사용하여 새 함수 생성
<a name="create-url-new-function"></a>

**함수 URL을 사용하여 새 함수를 생성하려면(콘솔)**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. **함수 생성**을 선택합니다.

1. **기본 정보**에서 다음과 같이 합니다.

   1. **함수 이름(Function name)**에 **my-function**과 같은 함수 이름을 입력합니다.

   1. **런타임**에서 원하는 언어 런타임(예: **Node.js 24**)을 선택합니다.

   1. **아키텍처(Architecture)**에서 **x86\$164** 또는 **arm64**를 선택합니다.

   1. **권한(Permissions)**을 확장한 다음, 새 실행 역할을 생성할지 아니면 기존 역할을 사용할지 여부를 선택합니다.

1. **고급 설정(Advanced settings)**을 확장한 다음 **함수 URL(Function URL)**을 선택합니다.

1. **인증 유형(Auth type)**에서 **AWS\$1IAM** 또는 **NONE**을 선택합니다. 함수 URL 인증에 대한 자세한 내용은 [액세스 관리](urls-auth.md) 섹션을 참조하세요.

1. (선택 사항) **교차 오리진 리소스 공유(CORS) 구성(Configure cross-origin resource sharing (CORS))**을 선택합니다. 함수 생성 중에 이 옵션을 선택하면 함수 URL이 기본적으로 모든 오리진의 요청을 허용합니다. 함수를 생성한 후 함수 URL에 대한 CORS 설정을 편집할 수 있습니다. CORS에 대한 자세한 내용은 [교차 오리진 리소스 공유(CORS)](#urls-cors) 섹션을 참조하세요.

1. **함수 생성**을 선택합니다.

이렇게 하면 `$LATEST` 게시되지 않은 함수 버전에 대한 함수 URL이 있는 새로운 함수가 생성됩니다. 함수 URL이 콘솔의 **함수 개요(Function overview)** 섹션에 표시됩니다.

## 함수 URL 생성(AWS CLI)
<a name="create-url-cli"></a>

AWS Command Line Interface(AWS CLI)를 사용하여 기존 Lambda 함수에 대한 함수 URL을 생성하려면 다음 명령을 실행합니다.

```
aws lambda create-function-url-config \
    --function-name my-function \
    --qualifier prod \ // optional
    --auth-type AWS_IAM
    --cors-config {AllowOrigins="https://example.com"} // optional
```

이렇게 하면 함수 **my-function**에 대한 **prod** 한정자에 함수 URL이 추가됩니다. 이러한 구성 파라미터에 대한 자세한 내용은 API 참조의 [CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html)를 참조하세요.

**참고**  
AWS CLI를 통해 함수 URL을 생성하려면 함수가 이미 존재해야 합니다.

## CloudFormation 템플릿에 함수 URL 추가
<a name="urls-cfn"></a>

CloudFormation 템플릿에 `AWS::Lambda::Url` 리소스를 추가하려면 다음 구문을 사용합니다.

### JSON
<a name="urls-cfn-json"></a>

```
{
  "Type" : "AWS::Lambda::Url",
  "Properties" : {
      "AuthType" : String,
      "Cors" : Cors,
      "Qualifier" : String,
      "TargetFunctionArn" : String
    }
}
```

### YAML
<a name="urls-cfn-yaml"></a>

```
Type: AWS::Lambda::Url
Properties: 
  AuthType: String
  Cors: 
    Cors
  Qualifier: String
  TargetFunctionArn: String
```

### 파라미터
<a name="urls-cfn-params"></a>
+ (필수) `AuthType` – 함수 URL에 대한 인증 유형을 정의합니다. 가능한 값은 `AWS_IAM` 또는 `NONE`입니다. 액세스 권한을 인증된 사용자로 제한하려면 `AWS_IAM`으로 설정합니다. IAM 인증을 우회하고 모든 사용자가 함수에 요청을 수행할 수 있도록 허용하려면 `NONE`으로 설정합니다.
+ (선택 사항) `Cors` – 함수 URL에 대한 [CORS 설정](#urls-cors)을 정의합니다. CloudFormation의 `AWS::Lambda::Url` 리소스에 `Cors`를 추가하려면 다음 구문을 사용합니다.

    
**Example AWS::Lambda::Url.Cors (JSON)**  

  ```
  {
    "AllowCredentials" : Boolean,
    "AllowHeaders" : [ String, ... ],
    "AllowMethods" : [ String, ... ],
    "AllowOrigins" : [ String, ... ],
    "ExposeHeaders" : [ String, ... ],
    "MaxAge" : Integer
  }
  ```  
**Example AWS::Lambda::Url.Cors (YAML)**  

  ```
    AllowCredentials: Boolean
    AllowHeaders: 
      - String
    AllowMethods: 
      - String
    AllowOrigins: 
      - String
    ExposeHeaders: 
      - String
    MaxAge: Integer
  ```
+ (선택 사항) `Qualifier` – 별칭 이름입니다.
+ (필수) `TargetFunctionArn` – Lambda 함수의 이름 또는 Amazon 리소스 이름(ARN)입니다. 유효한 이름 형식은 다음과 같습니다.
  + **함수 이름** - `my-function`
  + **함수 ARN** - `arn:aws:lambda:us-west-2:123456789012:function:my-function`
  + **부분적 ARN** - `123456789012:function:my-function`

## 교차 오리진 리소스 공유(CORS)
<a name="urls-cors"></a>

다양한 오리진이 함수 URL에 액세스하는 방법을 정의하려면 [교차 오리진 리소스 공유(CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)를 사용합니다. 다른 도메인에서 함수 URL을 호출하려는 경우 CORS를 구성하는 것이 좋습니다. Lambda는 함수 URL에 대해 다음 CORS 헤더를 지원합니다.


| CORS 헤더 | CORS 구성 속성 | 예제 값 | 
| --- | --- | --- | 
|  [ Access-Control-Allow-Origin](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin)  |  `AllowOrigins`  |  `*` (모든 오리진 허용) `https://www.example.com` `http://localhost:60905`  | 
|  [ Access-Control-Allow-Methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods)  |  `AllowMethods`  |  `GET`, `POST`, `DELETE`, `*`  | 
|  [ Access-Control-Allow-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)  |  `AllowHeaders`  |  `Date`, `Keep-Alive`, `X-Custom-Header`  | 
|  [ Access-Control-Expose-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers)  |  `ExposeHeaders`  |  `Date`, `Keep-Alive`, `X-Custom-Header`  | 
|  [ Access-Control-Allow-Credentials](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials)  |  `AllowCredentials`  |  `TRUE`  | 
|  [ Access-Control-Max-Age](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age)  |  `MaxAge`  |  `5` (기본값), `300`   | 

Lambda 콘솔 또는 AWS CLI를 사용하여 함수 URL에 대한 CORS를 구성하는 경우, Lambda는 함수 URL을 통해 모든 응답에 CORS 헤더를 자동으로 추가합니다. 또는 함수 응답에 CORS 헤더를 수동으로 추가할 수 있습니다. 충돌하는 헤더가 있는 경우, 예상되는 동작은 요청 유형에 따라 달라집니다.
+ OPTIONS 요청과 같은 사전 요청의 경우, 함수 URL에 구성된 CORS 헤더가 우선합니다. Lambda는 응답에서 이러한 CORS 헤더만 반환합니다.
+ GET 또는 POST 요청과 같은 비 사전 요청의 경우, Lambda는 함수 URL에 구성된 CORS 헤더와 함수가 반환한 CORS 헤더를 모두 반환합니다. 이로 인해 응답에 CORS 헤더가 중복될 수 있습니다. 다음과 유사한 오류가 표시될 수 있습니다. `The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed`.

일반적으로, 함수 응답에서 CORS 헤더를 수동으로 전송하는 것보다 함수 URL에서 모든 CORS 설정을 구성하는 것이 좋습니다.

## 함수 URL 스로틀링
<a name="urls-throttling"></a>

스로틀링은 함수가 요청을 처리하는 속도를 제한합니다. 이는 함수가 다운스트림 리소스를 오버로드하지 못하게 하거나 갑작스러운 요청 급증을 처리하는 등 여러 상황에서 유용합니다.

예약된 동시성을 구성하여 Lambda 함수가 함수 URL을 통해 처리하는 요청 속도를 제한할 수 있습니다. 예약된 동시성은 함수에 대한 최대 동시 호출 수를 제한합니다. 함수의 초당 최대 요청 속도(RPS)는 구성된 예약된 동시성의 10배에 해당합니다. 예를 들어 예약된 동시성이 100인 함수를 구성하는 경우 최대 RPS는 1,000입니다.

함수 동시성이 예약된 동시성을 초과할 때마다 함수 URL은 HTTP `429` 상태 코드를 반환합니다. 함수가 구성된 예약된 동시성을 기준으로 10배의 RPS 최대값을 초과하는 요청을 수신하면 HTTP `429` 오류도 수신됩니다. 예약된 동시성에 대한 자세한 내용은 [함수에 대해 예약된 동시성 구성](configuration-concurrency.md) 섹션을 참조하세요.

## 함수 URL 비활성화
<a name="urls-deactivating"></a>

비상시에는 함수 URL에 대한 모든 트래픽을 거부할 수 있습니다. 함수 URL을 비활성화하려면 예약된 동시성을 0으로 설정합니다. 이렇게 하면 함수 URL에 대한 모든 요청을 제한하여 HTTP `429` 상태 응답이 발생합니다. 함수 URL을 다시 활성화하려면 예약된 동시성 구성을 삭제하거나 구성을 0보다 큰 값으로 설정합니다.

## 함수 URL 삭제
<a name="w2aac39c81c53"></a>

함수 URL을 삭제하면 복구할 수 없습니다. 새 함수 URL을 생성하면 URL 주소가 달라집니다.

**참고**  
`NONE` 인증 유형이 있는 함수 URL을 삭제하는 경우, Lambda는 연결된 리소스 기반 정책을 자동으로 삭제하지 않습니다. 이 정책을 삭제하려면 수동으로 삭제해야 합니다.

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수의 이름을 선택합니다.

1. **구성(Configuration)** 탭을 선택한 다음, **함수 URL(Function URL)**을 선택합니다.

1. **삭제**를 선택합니다.

1. 필드에 *삭제*라는 단어를 입력하여 삭제를 확인합니다.

1. **삭제**를 선택합니다.

**참고**  
함수 URL이 있는 함수를 삭제할 경우 Lambda는 함수 URL을 비동기적으로 삭제합니다. 동일한 계정에서 동일한 이름으로 새 함수를 즉시 생성하는 경우 원래 함수 URL이 삭제되는 대신 새 함수에 매핑될 수 있습니다.

# Lambda 함수 URL에 대한 액세스 제어
<a name="urls-auth"></a>

**참고**  
2025년 10월부터 새 함수 URL에는 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 권한이 모두 필요합니다.

[AuthType](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html#lambda-CreateFunctionUrlConfig-request-AuthType) 파라미터를 특정 함수에 연결된 [리소스 기반 정책](access-control-resource-based.md)과 함께 사용하여 Lambda 함수 URL에 대한 액세스를 제어할 수 있습니다. 이 두 구성 요소의 구성에 따라 함수 URL에서 다른 관리 작업을 간접 호출하거나 수행할 수 있는 사람이 결정됩니다.

`AuthType` 파라미터는 Lambda가 함수 URL에 대한 요청을 인증하거나 권한을 부여하는 방법을 결정합니다. 함수 URL을 구성할 때 다음 `AuthType` 옵션 중 하나를 지정해야 합니다.
+ `AWS_IAM` – Lambda는 AWS Identity and Access Management(IAM)를 사용하여 IAM 위탁자의 자격 증명 정책 및 함수의 리소스 기반 정책에 따라 요청을 인증하고 권한을 부여합니다. 인증된 사용자 및 역할만 함수 URL을 사용해 함수를 간접 호출하도록 하려면 이 옵션을 선택합니다.
+ `NONE` – Lambda가 함수를 호출하기 전에 인증을 수행하지 않습니다. 그러나 함수의 리소스 기반 정책은 항상 유효하며 함수 URL이 요청을 수신하기 전에 퍼블릭 액세스 권한을 부여해야 합니다. 함수 URL에 인증되지 않은 퍼블릭 액세스를 허용하려면 이 옵션을 선택합니다.

보안에 대한 추가 인사이트를 얻기 위해, AWS Identity and Access Management Access Analyzer을 사용하여 함수 URL에 대한 외부 액세스의 종합적인 분석을 확인할 수 있습니다. 또한 IAM Access Analyzer는 Lambda 함수에 대한 신규 또는 업데이트된 권한을 모니터링하여 퍼블릭 및 교차 계정 액세스를 부여하는 권한을 식별하는 데 도움이 됩니다. IAM Access Analyzer는 무료로 사용할 수 있습니다. IAM Access Analyzer를 시작하려면 [AWS IAM Access Analyzer 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html) 섹션을 참조하세요.

이 페이지에는 두 인증 유형에 대한 리소스 기반 정책의 예와 [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html) API 작업 또는 Lambda 콘솔을 사용하여 이러한 정책을 생성하는 방법이 포함되어 있습니다. 권한을 설정한 후 함수 URL을 간접 호출하는 방법에 대한 자세한 내용은 [Lambda 함수 URL 호출](urls-invocation.md) 섹션을 참조하세요.

**Topics**
+ [

## `AWS_IAM` 인증 유형 사용
](#urls-auth-iam)
+ [

## `NONE` 인증 유형 사용
](#urls-auth-none)
+ [

## 거버넌스 및 액세스 제어
](#urls-governance)

## `AWS_IAM` 인증 유형 사용
<a name="urls-auth-iam"></a>

`AWS_IAM` 인증 유형을 선택하는 경우 Lambda 함수 URL을 간접 호출해야 하는 사용자에게 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 권한이 있어야 합니다. 호출을 요청하는 사람에 따라 [리소스 기반 정책](access-control-resource-based.md)을 사용하여 이 권한을 부여해야 할 수 있습니다.

요청을 하는 위탁자가 함수 URL과 동일한 AWS 계정에 있는 경우, 위탁자가 [자격 증명 기반 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)에 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 권한이 있거나 **또는** 함수의 리소스 기반 정책에 부여된 권한이 **있어야 합니다**. 즉, 사용자가 이미 자격 증명 기반 정책에 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 권한이 있는 경우 리소스 기반 정책은 선택 사항입니다. 정책 평가는 [정책 평가 로직](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)에 설명된 규칙을 따릅니다.

요청을 하는 위탁자가 다른 계정에 있는 경우 위탁자는 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 권한을 부여하는 자격 증명 기반 정책**과** 간접 호출하려는 함수에 대한 리소스 기반 정책에 부여된 권한이 **모두** 있어야 합니다. 정책 평가는 [계정 내에서 교차 계정 요청 허용 여부 결정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html#policy-eval-cross-account)에 설명된 규칙을 따릅니다.

다음과 같은 리소스 기반 정책은 AWS 계정 `444455556666`의 `example` 역할이 함수 `my-function`와 연결된 함수 URL을 간접 호출하도록 허용합니다. [lambda:InvokedViaFunctionUrl](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) 컨텍스트 키는 `lambda:InvokeFunction` 작업을 함수 URL 직접 호출로 제한합니다. 즉, 위탁자는 함수 URL을 사용하여 함수를 간접 호출해야 합니다. `lambda:InvokedViaFunctionUrl`을 포함하지 않으면 위탁자는 함수 URL 외에도 다른 간접 호출 방법을 통해 함수를 간접 호출할 수 있습니다.

**Example - 교차 계정 리소스 기반 정책**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "AWS_IAM"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

다음 단계에 따라 콘솔을 통해 이 리소스 기반 정책을 생성할 수 있습니다.

**다른 계정에 URL 호출 권한을 부여하려면(콘솔)**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. URL 호출 권한을 부여하려는 함수의 이름을 선택합니다.

1. **구성(Configuration)** 탭을 선택한 다음, **권한(Permissions)**을 선택합니다.

1. **리소스 기반 정책(Resource-based policy)**에서 **권한 추가(Add permissions)**를 선택합니다.

1. **함수 URL(Function URL)**을 선택합니다.

1. **인증 유형(Auth type)**에서 **AWS\$1IAM**을 선택합니다.

1. 정책 문의 **문 ID**를 입력합니다.

1. **위탁자**에 권한을 부여하려는 사용자나 역할의 계정 ID 또는 Amazon 리소스 이름(ARN)을 입력합니다. 예를 들면 **444455556666**입니다.

1. **저장**을 선택합니다.

또는 다음 [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) AWS Command Line Interface(AWS CLI) 명령을 사용하여 이 정책을 생성할 수 있습니다. AWS CLI를 사용하는 경우 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 문을 별도로 추가해야 합니다. 예제:

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal 444455556666 \
  --function-url-auth-type AWS_IAM
```

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal 444455556666 \
  --invoked-via-function-url
```

## `NONE` 인증 유형 사용
<a name="urls-auth-none"></a>

**중요**  
함수 URL 인증 유형이 `NONE`이고 퍼블릭 액세스 권한을 부여하는 [리소스 기반 정책](access-control-resource-based.md)이 있는 경우, 함수 URL이 있는 인증되지 않은 모든 사용자가 함수를 간접 호출할 수 있습니다.

경우에 따라 함수 URL을 공개할 수 있습니다. 예를 들어 웹 브라우저에서 직접 제출된 요청을 처리하고자 할 수 있습니다. 함수 URL에 대한 퍼블릭 액세스를 허용하려면 `NONE` 인증 유형을 선택합니다.

`NONE` 인증 유형을 선택하는 경우, Lambda는 IAM을 사용하여 함수 URL에 대한 요청을 인증하지 않습니다. 그러나 함수에는 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction`을 허용하는 리소스 기반 정책이 있어야 합니다. 콘솔 또는 AWS Serverless Application Model(AWS SAM)을 통해 인증 유형 `NONE`을 사용하는 함수 URL을 생성하는 경우 Lambda에서 리소스 기반 정책을 자동으로 생성합니다. AWS CLI, AWS CloudFormation, 또는 Lambda API를 직접 사용하는 경우 [권한을 직접 추가해야 합니다](#policy-cli).

`NONE` 인증 유형을 사용할 때는 리소스 기반 정책에 [lambda:InvokedViaFunctionUrl](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) 컨텍스트 키를 포함하는 것이 좋습니다. 이 컨텍스트 키는 함수 URL을 통해서만 함수를 간접 호출할 수 있고 다른 간접 호출 방법을 통해서는 호출할 수 없도록 합니다.

이 정책에 대한 다음을 참고하세요.
+ 모든 엔터티는 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction`을 직접 호출할 수 있습니다. 즉, 함수 URL이 있는 사람은 누구나 함수를 간접 호출할 수 있습니다.
+ `lambda:FunctionUrlAuthType` 조건 키 값은 `NONE`입니다. 이 정책 문은 함수 URL의 인증 유형도 `NONE`인 경우에만 액세스를 허용합니다.
+ `lambda:InvokedViaFunctionUrl` 조건은 함수 URL을 통해서만 함수를 간접 호출할 수 있고 다른 간접 호출 방법을 통해서는 호출할 수 없도록 합니다.

**Example - NONE 인증 유형에 대한 기본 리소스 기반 정책**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "FunctionURLAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "NONE"
        }
      }
    },
    {
      "Sid": "FunctionURLInvokeAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

**AWS CLI를 사용하여 리소스 기반 정책 생성**  
콘솔 또는 AWS SAM를 사용하여 인증 유형이 `NONE`인 함수 URL을 생성하지 않는다면 리소스 기반 정책을 직접 추가해야 합니다. 다음 명령을 사용하여 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 권한을 갖는 문을 생성합니다. 각 문은 별도의 명령에 추가해야 합니다.

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal * \
  --function-url-auth-type NONE
```

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal * \
  --invoked-via-function-url
```

**참고**  
`NONE` 인증 유형이 있는 함수 URL을 삭제하는 경우, Lambda는 연결된 리소스 기반 정책을 자동으로 삭제하지 않습니다. 이 정책을 삭제하려면 수동으로 삭제해야 합니다.

함수의 리소스 기반 정책이 `lambda:invokeFunctionUrl` 및 `lambda:InvokeFunction` 권한을 부여하지 않는 경우 사용자가 함수 URL을 간접 호출하면 403 금지됨 오류 코드가 표시됩니다. 이는 함수 URL이 `NONE` 인증 유형을 사용하는 경우에도 발생합니다.

## 거버넌스 및 액세스 제어
<a name="urls-governance"></a>

함수 URL 호출 권한 외에도 함수 URL을 구성하는 데 사용되는 작업에 대한 액세스를 제어할 수도 있습니다. Lambda는 함수 URL에 대해 다음과 같은 IAM 정책 작업을 지원합니다.
+ `lambda:InvokeFunctionUrl` – 함수 URL을 사용하여 Lambda 함수를 간접 호출합니다.
+ `lambda:CreateFunctionUrlConfig` – 함수 URL을 생성하고 해당 `AuthType`을 설정합니다.
+ `lambda:UpdateFunctionUrlConfig` – 함수 URL 구성 및 해당 `AuthType`을 업데이트합니다.
+ `lambda:GetFunctionUrlConfig` – 함수 URL의 세부 정보를 봅니다.
+ `lambda:ListFunctionUrlConfigs` – 함수 URL 구성을 나열합니다.
+ `lambda:DeleteFunctionUrlConfig` – 함수 URL을 삭제합니다.

다른 AWS 엔터티에 대한 함수 URL 액세스를 허용하거나 거부하려면 IAM 정책에 이러한 작업을 포함합니다. 예를 들어 다음 정책은 계정 `123456789012`의 함수 **my-function**에 대한 함수 URL을 업데이트할 수 있는 권한을 AWS 계정 `444455556666`의 `example` 역할에 부여합니다.

**Example 교차 계정 함수 URL 정책**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action": "lambda:UpdateFunctionUrlConfig",
            "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function"
        }
    ]
}
```

### 조건 키
<a name="urls-condition-keys"></a>

함수 URL에 대한 세분화된 액세스 제어를 위해 조건 컨텍스트 키를 사용합니다. Lambda는 함수 URL에 대해 다음 컨텍스트 키를 지원합니다.
+ `lambda:FunctionUrlAuthType` - 함수 URL에서 사용하는 인증 유형을 설명하는 열거형 값을 정의합니다. 이때 값은 `AWS_IAM` 또는 `NONE`가 될 수 있습니다.
+ `lambda:InvokedViaFunctionUrl` - 함수 URL을 통해 이루어진 호출로 `lambda:InvokeFunction` 작업을 제한합니다. 이렇게 하면 함수 URL을 사용해서만 함수를 간접 호출할 수 있고 다른 간접 호출 방법을 통해서는 호출할 수 없도록 합니다. `lambda:InvokedViaFunctionUrl` 컨텍스트 키를 사용하는 리소스 기반 정책의 예는 [`AWS_IAM` 인증 유형 사용](#urls-auth-iam) 및 [`NONE` 인증 유형 사용](#urls-auth-none)의 예제를 참조하세요.

함수와 연결된 정책에서 이 컨텍스트 키를 사용할 수 있습니다. 예를 들어 함수 URL의 구성을 변경할 수 있는 사용자를 제한하려고 할 수 있습니다. URL 인증 유형이 `NONE`인 모든 함수에 대한 `UpdateFunctionUrlConfig` 요청을 거부하려면 다음 정책을 정의할 수 있습니다.

**Example 명시적 거부를 사용한 함수 URL 정책**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action":[
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "NONE"
                }
            }
        }
    ]
}
```

URL 인증 유형이 `AWS_IAM`인 함수에 대한 `CreateFunctionUrlConfig` 및 `UpdateFunctionUrlConfig` 요청을 할 수 있는 권한을 AWS 계정 `444455556666`의 `example` 역할을 부여하려면 다음 정책을 정의할 수 있습니다.

**Example 명시적 허용을 사용한 함수 URL 정책**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```

[서비스 제어 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)(SCP)에서 이 조건 키를 사용할 수도 있습니다. SCP를 사용하여 AWS Organizations의 조직 전체에서 권한을 관리합니다. 예를 들어, 사용자가 `AWS_IAM` 이외의 인증 유형을 사용하는 함수 URL을 생성하거나 업데이트하는 것을 거부하려면 다음 서비스 제어 정책을 사용합니다.

**Example 명시적 거부를 사용한 함수 URL SCP**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:*",
            "Condition": {
                "StringNotEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```

# Lambda 함수 URL 호출
<a name="urls-invocation"></a>

함수 URL은 Lambda 함수를 위한 전용 HTTP(S) 엔드포인트입니다. Lambda 콘솔 또는 Lambda API를 통해 함수 URL을 생성하고 구성할 수 있습니다.

**작은 정보**  
Lambda는 HTTP 엔드포인트를 통해 함수를 간접적으로 호출하는 두 가지 방법, 즉 함수 URL과 Amazon API Gateway를 제공합니다. 사용 사례에 가장 적합한 방법을 잘 모르는 경우 [HTTP 요청을 사용하여 Lambda 함수를 간접 호출하는 메서드 선택](furls-http-invoke-decision.md) 섹션을 참조하세요.

함수 URL을 생성하면 Lambda가 자동으로 고유한 URL 엔드포인트를 생성합니다. 함수 URL을 생성하면 URL 엔드포인트가 변경되지 않습니다. 함수 URL 엔드포인트는 다음 형식을 취합니다.

```
https://<url-id>.lambda-url.<region>.on.aws
```

**참고**  
AWS 리전 아시아 태평양(하이데라바드)(`ap-south-2`), 아시아 태평양(멜버른)(`ap-southeast-4`), 아시아 태평양(말레이시아)(`ap-southeast-5`), 아시아 태평양(뉴질랜드)(`ap-southeast-6`), 아시아 태평양(태국)(`ap-southeast-7`), 아시아 태평양(타이페이)(`ap-east-2`),캐나다 서부(캘거리)(`ca-west-1`), 유럽(스페인)(`eu-south-2`)), 유럽(취리히)(`eu-central-2`), 이스라엘(텔아비브)(`il-central-1`) 및 중동(아랍에미리트)(`me-central-1`)에서는 함수 URL이 지원되지 않습니다.

함수 URL은 IPv4 및 IPv6을 지원하는 이중 스택을 지원합니다. 함수 URL을 구성한 후 웹 브라우저, curl, Postman 또는 모든 HTTP(S) 클라이언트를 통해 HTTP 엔드포인트에서 함수를 간접 호출할 수 있습니다. 함수 URL을 간접 호출하려면 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 권한이 있어야 합니다. 자세한 내용은 [액세스 관리](urls-auth.md) 섹션을 참조하세요.

**Topics**
+ [

## 함수 URL 호출 기본 사항
](#urls-invocation-basics)
+ [

## 요청 및 응답 페이로드
](#urls-payloads)

## 함수 URL 호출 기본 사항
<a name="urls-invocation-basics"></a>

함수 URL에서 `AWS_IAM` 인증 유형을 사용하는 경우 [AWS서명 버전 4(SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)를 사용하여 각 HTTP 요청에 서명해야 합니다. [Postman](https://quickstarts.postman.com/guide/aws/index.html?index=..%2F..index#2)과 같은 도구는 SigV4를 사용하여 요청에 서명할 수 있는 방법을 기본으로 제공합니다.

도구를 사용하여 함수 URL에 대한 HTTP 요청에 서명하지 않으면 SigV4를 사용하여 각 요청에 수동으로 서명해야 합니다. 함수 URL이 요청을 수신하면 Lambda는 SigV4 서명도 계산합니다. 서명이 일치하는 경우 Lambda가 요청을 처리합니다. SigV4를 사용하여 요청에 수동으로 서명하는 방법에 대한 지침은 *Amazon Web Services 일반 참조 일반 참조 가이드*의 [서명 버전 4를 사용하여 AWS 요청에 서명](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)을 참조하세요.

함수 URL에서 `NONE` 인증 유형을 사용하는 경우 SigV4를 사용하여 요청에 서명할 필요가 없습니다. 웹 브라우저, curl, Postman 또는 HTTP 클라이언트를 사용하여 함수를 간접 호출할 수 있습니다.

함수에 대한 간단한 `GET` 요청을 테스트하려면 웹 브라우저를 사용합니다. 예를 들어 함수 URL이 `https://abcdefg.lambda-url.us-east-1.on.aws`이며 문자열 파라미터 `message`에서 사용되는 경우 요청 URL은 다음과 같을 수 있습니다.

```
https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld
```

`POST` 요청과 같은 다른 HTTP 요청을 테스트하려면 curl 등의 도구를 사용할 수 있습니다. 예를 들어 함수 URL에 대한 `POST` 요청에 일부 JSON 데이터를 포함하려면 다음 curl 명령을 사용할 수 있습니다.

```
curl -v 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \
-H 'content-type: application/json' \
-d '{ "example": "test" }'
```

## 요청 및 응답 페이로드
<a name="urls-payloads"></a>

클라이언트가 함수 URL을 호출하면 Lambda는 요청을 함수에 전달하기 전에 이벤트 객체에 매핑합니다. 그러면 함수의 응답이 HTTP 응답에 매핑되고, Lambda는 해당 HTTP 응답을 함수 URL을 통해 클라이언트로 다시 전송합니다.

요청 및 응답 이벤트 형식은 [Amazon API Gateway 페이로드 포맷 버전 2.0](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format)과 동일한 스키마를 따릅니다.

### 요청 페이로드 형식
<a name="urls-request-payload"></a>

요청 페이로드는 다음 구조를 취합니다.

```
{
  "version": "2.0",
  "routeKey": "$default",
  "rawPath": "/my/path",
  "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value",
  "cookies": [
    "cookie1",
    "cookie2"
  ],
  "headers": {
    "header1": "value1",
    "header2": "value1,value2"
  },
  "queryStringParameters": {
    "parameter1": "value1,value2",
    "parameter2": "value"
  },
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "<urlid>",
    "authentication": null,
    "authorizer": {
        "iam": {
                "accessKey": "AKIA...",
                "accountId": "111122223333",
                "callerId": "AIDA...",
                "cognitoIdentity": null,
                "principalOrgId": null,
                "userArn": "arn:aws:iam::111122223333:user/example-user",
                "userId": "AIDA..."
        }
    },
    "domainName": "<url-id>.lambda-url.us-west-2.on.aws",
    "domainPrefix": "<url-id>",
    "http": {
      "method": "POST",
      "path": "/my/path",
      "protocol": "HTTP/1.1",
      "sourceIp": "123.123.123.123",
      "userAgent": "agent"
    },
    "requestId": "id",
    "routeKey": "$default",
    "stage": "$default",
    "time": "12/Mar/2020:19:03:58 +0000",
    "timeEpoch": 1583348638390
  },
  "body": "Hello from client!",
  "pathParameters": null,
  "isBase64Encoded": false,
  "stageVariables": null
}
```


| 파라미터 | 설명 | 예시 | 
| --- | --- | --- | 
|  `version`  |  이 이벤트에 대한 페이로드 포맷 버전입니다. Lambda 함수 URL은 현재 [페이로드 포맷 버전 2.0](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format)을 지원합니다.  |  `2.0`  | 
|  `routeKey`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 자리표시자를 의미하는 `$default`로 설정합니다.  |  `$default`  | 
|  `rawPath`  |  요청 경로입니다. 예를 들어, 요청 URL이 `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo`인 경우 원시 경로 값은 `/example/test/demo`입니다.  |  `/example/test/demo`  | 
|  `rawQueryString`  |  요청의 쿼리 문자열 파라미터를 포함하는 원시 문자열입니다. 지원되는 문자에는 `a-z`, `A-Z`, `0-9`, `.`, `_`, `-`, `%`, `&`, `=` 및 `+`가 포함됩니다.  |  `"?parameter1=value1&parameter2=value2"`  | 
|  `cookies`  |  요청의 일부로 전송되는 모든 쿠키를 포함하는 배열입니다.  |  `["Cookie_1=Value_1", "Cookie_2=Value_2"]`  | 
|  `headers`  |  요청 헤더 목록으로, 키-값 페어로 표시됩니다.  |  `{"header1": "value1", "header2": "value2"}`  | 
|  `queryStringParameters`  |  요청의 쿼리 파라미터입니다. 예를 들어, 요청 URL이 `https://{url-id}.lambda-url.{region}.on.aws/example?name=Jane`인 경우 `queryStringParameters` 값은 키가 `name`이고 값이 `Jane`인 JSON 객체입니다.  |  `{"name": "Jane"}`  | 
|  `requestContext`  |  요청에 대한 추가 정보를 포함하는 객체입니다(예: `requestId`, 요청 시간, AWS Identity and Access Management(IAM)를 통해 승인된 호출자의 ID).  |   | 
|  `requestContext.accountId`  |  함수 소유자의 AWS 계정 ID입니다.  |  `"123456789012"`  | 
|  `requestContext.apiId`  |  함수 URL의 ID입니다.  |  `"33anwqw8fj"`  | 
|  `requestContext.authentication`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 `null`로 설정합니다.  |  `null`  | 
|  `requestContext.authorizer`  |  함수 URL에서 `AWS_IAM` 인증 유형을 사용하는 경우 호출자 자격 증명에 관한 정보를 포함하는 객체입니다. 그렇지 않으면 Lambda가 이 파라미터를 `null`로 설정합니다.  |   | 
|  `requestContext.authorizer.iam.accessKey`  |  호출자 자격 증명의 액세스 키입니다.  |  `"AKIAIOSFODNN7EXAMPLE"`  | 
|  `requestContext.authorizer.iam.accountId`  |  호출자 자격 증명의 AWS 계정 ID입니다.  |  `"111122223333"`  | 
|  `requestContext.authorizer.iam.callerId`  |  호출자의 ID(사용자 ID)입니다.  |  `"AIDACKCEVSQ6C2EXAMPLE"`  | 
|  `requestContext.authorizer.iam.cognitoIdentity`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 `null`로 설정하거나 JSON에서 제외합니다.  |  `null`  | 
|  `requestContext.authorizer.iam.principalOrgId`  |  호출자 자격 증명과 연결된 위탁자 조직 ID입니다.  |  `"AIDACKCEVSQORGEXAMPLE"`  | 
|  `requestContext.authorizer.iam.userArn`  |  호출자 자격 증명의 사용자 Amazon 리소스 이름(ARN)입니다.  |  `"arn:aws:iam::111122223333:user/example-user"`  | 
|  `requestContext.authorizer.iam.userId`  |  호출자 자격 증명의 사용자 ID입니다.  |  `"AIDACOSFODNN7EXAMPLE2"`  | 
|  `requestContext.domainName`  |  함수 URL의 도메인 이름입니다.  |  `"<url-id>.lambda-url.us-west-2.on.aws"`  | 
|  `requestContext.domainPrefix`  |  함수 URL의 도메인 접두사입니다.  |  `"<url-id>"`  | 
|  `requestContext.http`  |  HTTP 요청에 대한 세부 정보를 포함하는 객체입니다.  |   | 
|  `requestContext.http.method`  |  이 요청에 사용되는 HTTP 메서드입니다. 유효한 값에는 `GET`, `POST`, `PUT`, `HEAD`, `OPTIONS`, `PATCH` 및 `DELETE`가 있습니다.  |  `GET`  | 
|  `requestContext.http.path`  |  요청 경로입니다. 예를 들어, 요청 URL이 `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo`인 경우 경로 값은 `/example/test/demo`입니다.  |  `/example/test/demo`  | 
|  `requestContext.http.protocol`  |  요청의 프로토콜입니다.  |  `HTTP/1.1`  | 
|  `requestContext.http.sourceIp`  |  요청하는 즉시 TCP 연결의 소스 IP 주소입니다.  |  `123.123.123.123`  | 
|  `requestContext.http.userAgent`  |  사용자 에이전트 요청 헤더 값입니다.  |  `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Gecko/20100101 Firefox/42.0`  | 
|  `requestContext.requestId`  |  호출 요청의 ID입니다. 이 ID를 사용하여 함수와 관련된 호출 로그를 추적할 수 있습니다.  |  `e1506fd5-9e7b-434f-bd42-4f8fa224b599`  | 
|  `requestContext.routeKey`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 자리표시자를 의미하는 `$default`로 설정합니다.  |  `$default`  | 
|  `requestContext.stage`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 자리표시자를 의미하는 `$default`로 설정합니다.  |  `$default`  | 
|  `requestContext.time`  |  요청의 타임스탬프입니다.  |  `"07/Sep/2021:22:50:22 +0000"`  | 
|  `requestContext.timeEpoch`  |  Unix Epoch 시간으로 표시된 요청의 타임스탬프입니다.  |  `"1631055022677"`  | 
|  `body`  |  요청의 본문입니다. 요청의 콘텐츠 유형이 바이너리인 경우 본문은 base64로 인코딩됩니다.  |  `{"key1": "value1", "key2": "value2"}`  | 
|  `pathParameters`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 `null`로 설정하거나 JSON에서 제외합니다.  |  `null`  | 
|  `isBase64Encoded`  |  본문이 이진 페이로드이고 base64로 인코딩되는 경우 `TRUE`입니다. 그렇지 않으면 `FALSE`입니다.  |  `FALSE`  | 
|  `stageVariables`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 `null`로 설정하거나 JSON에서 제외합니다.  |  `null`  | 

### 응답 페이로드 형식
<a name="urls-response-payload"></a>

함수가 응답을 반환하면 Lambda는 응답을 구문 분석하여 HTTP 응답으로 변환합니다. 함수 응답 페이로드는 다음 형식을 취합니다.

```
{
   "statusCode": 201,
    "headers": {
        "Content-Type": "application/json",
        "My-Custom-Header": "Custom Value"
    },
    "body": "{ \"message\": \"Hello, world!\" }",
    "cookies": [
        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",
        "Cookie_2=Value2; Max-Age=78000"
    ],
    "isBase64Encoded": false
}
```

Lambda는 응답 형식을 추론합니다. 함수가 유효한 JSON을 반환하고 `statusCode`을 반환하지 않는 경우 Lambda가 다음과 같은 가정을 합니다.
+ `statusCode`는 입니다.`200`
**참고**  
유효한 `statusCode`는 100\$1599 범위 내에 있습니다.
+ `content-type`은 입니다.`application/json`
+ `body`는 함수의 응답입니다.
+ `isBase64Encoded`is(`false` )

다음 예제에서는 Lambda 함수의 출력이 응답 페이로드에 매핑되는 방법과 응답 페이로드가 최종 HTTP 응답에 매핑되는 방법을 보여 줍니다. 클라이언트가 함수 URL을 간접 호출하면 HTTP 응답이 표시됩니다.

**문자열 응답에 대한 출력 예**


| Lambda 함수 출력 | 해석된 응답 출력 | HTTP 응답(클라이언트에게 표시되는 내용) | 
| --- | --- | --- | 
|  <pre>"Hello, world!"</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": "Hello, world!",<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 15<br /><br />"Hello, world!"</pre>  | 

**JSON 응답에 대한 출력 예**


| Lambda 함수 출력 | 해석된 응답 출력 | HTTP 응답(클라이언트에게 표시되는 내용) | 
| --- | --- | --- | 
|  <pre>{<br />  "message": "Hello, world!"<br />}</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": {<br />    "message": "Hello, world!"<br />  },<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 34<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

**사용자 지정 응답에 대한 출력 예**


| Lambda 함수 출력 | 해석된 응답 출력 | HTTP 응답(클라이언트에게 표시되는 내용) | 
| --- | --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

### Cookies
<a name="urls-cookies"></a>

함수에서 쿠키를 반환하려면 수동으로 `set-cookie` 헤더를 추가하지 않습니다. 대신 응답 페이로드 객체에 쿠키를 포함합니다. Lambda는 이를 자동으로 해석하고 다음 예제와 같이 HTTP 응답의 `set-cookie` 헤더로서 추가합니다.


| Lambda 함수 출력 | HTTP 응답(클라이언트에게 표시되는 내용) | 
| --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "cookies": [<br />        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",<br />        "Cookie_2=Value2; Max-Age=78000"<br />    ],<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br />set-cookie: Cookie_1=Value2; Expires=21 Oct 2021 07:48 GMT<br />set-cookie: Cookie_2=Value2; Max-Age=78000<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

# Lambda 함수 URL 모니터링
<a name="urls-monitoring"></a>

AWS CloudTrail과 Amazon CloudWatch를 사용하여 함수 URL을 모니터링할 수 있습니다.

**Topics**
+ [

## CloudTrail을 사용하여 함수 URL 모니터링
](#urls-cloudtrail)
+ [

## 함수 URL에 대한 CloudWatch 지표
](#urls-cloudwatch)

## CloudTrail을 사용하여 함수 URL 모니터링
<a name="urls-cloudtrail"></a>

함수 URL에 대해 Lambda는 CloudTrail 로그 파일에 다음 API 작업을 이벤트로 로깅하는 것을 자동 지원합니다.
+ [CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html)
+ [UpdateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionUrlConfig.html)
+ [DeleteFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionUrlConfig.html)
+ [GetFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionUrlConfig.html)
+ [ListFunctionUrlConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctionUrlConfigs.html)

각 로그 항목에는 호출자 자격 증명, 요청이 이루어진 시기, 기타 세부 정보에 관한 정보가 포함되어 있습니다. CloudTrail **이벤트 기록(Event history)**을 확인하면 지난 90일 이내의 모든 이벤트를 볼 수 있습니다. 90일이 지난 레코드를 보존하려면 추적을 생성할 수 있습니다.

기본적으로 CloudTrail은 데이터 이벤트로 간주하는 `InvokeFunctionUrl` 요청을 로그하지 않습니다. 그러나 CloudTrail에서 데이터 이벤트 로깅을 활성화할 수 있습니다. 자세한 내용은 *AWS CloudTrail 사용 설명서*의 [추적을 위해 데이터 이벤트 로깅](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)을 참조하십시오.

## 함수 URL에 대한 CloudWatch 지표
<a name="urls-cloudwatch"></a>

Lambda는 함수 URL 요청에 대한 집계된 지표를 CloudWatch로 전송합니다. 이러한 지표를 사용하면 CloudWatch 콘솔에서 함수 URL을 모니터링하고 대시보드를 구축하고 경보를 구성할 수 있습니다.

함수 URL은 다음 호출 지표를 지원합니다. `Sum` 통계를 사용하여 이러한 지표를 볼 것을 권장합니다.
+ `UrlRequestCount` – 이 함수 URL에 수행된 요청 수.
+ `Url4xxCount` – 4XX HTTP 상태 코드를 반환한 요청 수. 4XX 시리즈 코드는 잘못된 요청과 같은 클라이언트 측 오류를 나타냅니다.
+ `Url5xxCount` – 5XX HTTP 상태 코드를 반환한 요청 수. 5XX 시리즈 코드는 함수 오류 및 제한 시간과 같은 서버 측 오류를 나타냅니다.

함수 URL은 다음과 같은 성능 지표도 지원합니다. `Average` 또는 `Max` 통계를 사용하여 이러한 지표를 볼 것을 권장합니다.
+ `UrlRequestLatency` – 함수 URL이 요청을 수신하는 시점부터 함수 URL이 응답을 반환하는 시점까지의 시간입니다.

이러한 각 호출 및 성능 지표는 다음 차원을 지원합니다.
+ `FunctionName` – 함수의 `$LATEST` 게시되지 않은 버전 또는 함수의 별칭에 할당된 함수 URL에 대한 집계 지표를 확인합니다. 예: `hello-world-function`.
+ `Resource` – 특정 함수 URL에 대한 지표를 확인합니다 함수 이름과 함수의 `$LATEST` 게시되지 않은 버전 또는 함수의 별칭 중 하나로 정의합니다. 예: `hello-world-function:$LATEST`.
+ `ExecutedVersion` – 실행된 버전을 기반으로 특정 함수 URL에 대한 지표를 확인합니다. 이 차원을 사용하여 주로 `$LATEST` 게시되지 않은 버전에 할당된 함수 URL을 추적할 수 있습니다.

# HTTP 요청을 사용하여 Lambda 함수를 간접 호출하는 메서드 선택
<a name="furls-http-invoke-decision"></a>

Lambda에 대한 많은 일반적인 사용 사례는 HTTP 요청을 사용하여 함수를 간접 호출하는 작업과 관련이 있습니다. 예를 들어 웹 애플리케이션이 브라우저 요청을 통해 함수를 간접적으로 호출하도록 할 수 있습니다. Lambda 함수를 사용하여 전체 REST API를 생성하거나, 모바일 앱에서 사용자 상호 작용을 처리하거나, HTTP 호출을 통해 외부 서비스의 데이터를 처리하거나, 사용자 지정 웹후크를 생성할 수도 있습니다.

다음 섹션에서는 HTTP를 통해 Lambda를 간접 호출할 때 선택하는 항목을 설명하고 특정 사용 사례에 맞는 올바른 결정을 내리는 데 도움이 되는 정보를 제공합니다.

## HTTP 간접 호출 메서드를 선택할 때 선택할 수 있는 항목은 무엇인가요?
<a name="w2aac39c81c73b9"></a>

Lambda는 HTTP 요청을 사용하여 함수를 간접 호출하는 두 가지 주요 방법인 [함수 URL](urls-configuration.md) 및 [API Gateway](services-apigateway.md)를 제공합니다. 이 두 옵션의 주요 차이는 다음과 같습니다.
+ **Lambda 함수 URL**에서는 Lambda 함수에 대한 간단한 직접 HTTP 엔드포인트를 제공합니다. 단순성과 비용 효율성에 최적화되어 있으며 HTTP를 통해 Lambda 함수를 공개할 수 있는 가장 빠른 경로를 제공합니다.
+ **API Gateway**는 완전한 기능을 갖춘 API 빌드를 위한 보다 고급 서비스입니다. API Gateway는 대규모로 프로덕션 API를 빌드 및 관리하는 데 최적화되어 있으며 보안, 모니터링 및 트래픽 관리를 위한 포괄적인 도구를 제공합니다.

## 권장 사항(요구 사항을 이미 알고 있는 경우)
<a name="w2aac39c81c73c11"></a>

요구 사항을 이미 명확히 알고 있는 경우 기본 권장 사항은 다음과 같습니다.

기본 인증 방법 및 요청/응답 처리만 필요하고 비용과 복잡성을 최소화하려는 간단한 애플리케이션 또는 프로토타이프 제작에는 **[함수 URL](urls-configuration.md)**을 사용하는 것이 좋습니다.

**[API게이트웨이](services-apigateway.md)**는 대규모 프로덕션 애플리케이션 또는 [OpenAPI 설명](https://www.openapis.org/) 지원, 인증 옵션 선택 항목, 사용자 지정 도메인 이름 또는 스로틀링, 캐싱, 요청/응답 변환을 포함한 다양한 요청/응답 처리와 같은 고급 기능이 필요한 경우에 더 적합한 선택 항목입니다.

## Lambda 함수를 간접 호출하는 방법을 선택할 때 고려할 사항
<a name="w2aac39c81c73c13"></a>

함수 URL 및 API Gateway 중에서 선택할 때는 다음 요소를 고려해야 합니다.
+ OAuth 또는 Amazon Cognito에서 사용자를 인증해야 하는지 여부와 같은 인증 요구 사항
+ 규모 조정 요구 사항 및 구현하려는 API의 복잡성
+ 요청 검증 및 요청/응답 형식 지정과 같은 고급 기능이 필요한지 여부
+ 모니터링 요구 사항
+ 비용 목표

이러한 요소를 이해하면 보안, 복잡성 및 비용 요구 사항의 균형을 가장 잘 맞추는 옵션을 선택할 수 있습니다.

다음은 두 옵션 간 주요 차이를 요약한 정보입니다.

### Authentication
<a name="w2aac39c81c73c13c11b1"></a>
+ **함수 URL**에서는 AWS Identity and Access Management(IAM)를 통해 기본 인증 옵션을 제공합니다. 엔드포인트를 퍼블릭(인증 없음) 또는 IAM 인증을 요구하도록 구성할 수 있습니다. IAM 인증을 사용하면 표준 AWS 자격 증명 또는 IAM 역할을 사용하여 액세스를 제어할 수 있습니다. 간단하게 설정할 수 있지만 이 접근 방식에서는 다른 인증 방법에 비해 제한된 옵션을 제공합니다.
+ **API Gateway**는 보다 포괄적인 인증 옵션에 대한 액세스를 제공합니다. IAM 인증 외에도 [Lambda 권한 부여자](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html)(사용자 지정 인증 로직), [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) 사용자 풀 및 OAuth2.0 흐름을 사용할 수 있습니다. 이러한 유연성을 통해 서드파티 인증 제공업체, 토큰 기반 인증 및 다중 인증 등 복잡한 인증 체계를 구현할 수 있습니다.

### 요청/응답 처리
<a name="w2aac39c81c73c13c11b3"></a>
+ **함수 URL**에서는 기본 HTTP 요청 및 응답 처리를 제공합니다. 이때 표준 HTTP 메서드를 지원하며 기본 제공 교차 오리진 리소스 공유(CORS) 지원을 포함합니다. 기본적으로 JSON 페이로드 및 쿼리 파라미터를 처리할 수 있지만 요청 변환 또는 검증 기능은 제공하지 않습니다. 응답 처리도 마찬가지로 간단합니다. 클라이언트는 Lambda에서 반환하는 대로 정확히 Lambda 함수로부터 응답을 수신합니다.
+ **API Gateway**에서는 정교한 요청 및 응답 처리 기능을 제공합니다. 요청 검증기를 정의하고, 매핑 템플릿을 사용하여 요청 및 응답을 변환하며, 요청/응답 헤더를 설정하고, 응답 캐싱을 구현할 수 있습니다. 또한 API Gateway는 바이너리 페이로드 및 사용자 지정 도메인 이름을 지원하며 클라이언트에 도달하기 전에 응답을 수정할 수 있습니다. JSON 스키마를 사용하여 요청/응답 검증 및 변환을 위한 모델을 설정할 수 있습니다.

### 스케일링
<a name="w2aac39c81c73c13c11b5"></a>
+ **함수 URL**에서는 Lambda 함수의 동시성 제한에 따라 직접 조정하며 구성된 최대 동시성 제한까지 함수를 조정하여 트래픽 급증을 처리합니다. 제한에 도달하면 Lambda는 HTTP 429 응답과 함께 추가 요청에 응답합니다. 기본 제공 대기열 메커니즘이 없으므로 규모 조정 처리는 전적으로 Lambda 함수의 구성에 따라 달라집니다. 기본적으로 Lambda 함수는 AWS 리전당 동시 실행이 1,000개로 제한됩니다.
+ **API Gateway**에서는 Lambda의 자체 규모 조정 외에도 추가 규모 조정 기능을 제공합니다. 여기에는 기본 제공 요청 대기열 및 스로틀링 제어가 포함되어 있어 트래픽 급증을 보다 점진적으로 관리할 수 있습니다. API Gateway에서는 기본적으로 리전당 1초에 최대 10,000건의 요청을 처리할 수 있으며 버스트 용량에서는 1초에 5,000건의 요청을 처리할 수 있습니다. 또한 백엔드를 보호하기 위해 여러 수준(API, 단계 또는 방법)에서 요청을 스로틀링하는 도구를 제공합니다.

### 모니터링
<a name="w2aac39c81c73c13c11b7"></a>
+ **함수 URL**에서는 요청 수, 지연 시간 및 오류 비율을 포함하여 Amazon CloudWatch 지표를 통한 기본 모니터링을 제공합니다. 함수에 들어오는 원시 요청을 보여주는 표준 Lambda 지표 및 로그에 액세스할 수 있습니다. 이를 통해 핵심적인 운영 가시성을 제공하지만 지표는 주로 함수 실행에 중점을 둡니다.
+ **API Gateway**에서는 세부 지표, 로깅 및 추적 옵션을 포함한 포괄적인 모니터링 기능을 제공합니다. CloudWatch를 통해 API 직접 호출, 지연 시간, 오류 비율 및 캐시 적중/누락 비율을 모니터링할 수 있습니다. 또한 API Gateway는 분산 추적을 위해 AWS X-Ray와 통합되며 사용자 지정 가능한 로깅 형식을 제공합니다.

### 비용
<a name="w2aac39c81c73c13c11b9"></a>
+ **함수 URL**은 표준 Lambda 요금 모델을 따르므로, 함수 간접 호출 및 컴퓨팅 시간에 대한 비용만 지불하면 됩니다. URL 엔드포인트 자체에는 추가 요금이 부과되지 않습니다. 따라서 API Gateway의 추가 기능이 필요하지 않은 경우 간단한 API 또는 트래픽이 적은 애플리케이션에 비용 효율적인 선택이 됩니다.
+ **API Gateway**는 REST API에 대해 수신된 백만 개의 API 직접 호출 및 HTTP API에 대해 수신된 백만 개의 API 직접 호출을 포함하는 [프리 티어](https://aws.amazon.com/api-gateway/pricing/#Free_Tier)를 제공합니다. 프리 티어 이후에 API Gateway에서는 API 직접 호출, 데이터 전송 및 캐싱(활성화된 경우)에 대해 요금을 청구합니다. 자체 사용 사례의 비용을 파악하기 위해 API Gateway [요금 페이지](https://aws.amazon.com/api-gateway/pricing/)를 참조하세요.

### 기타 기능
<a name="w2aac39c81c73c13c11c11"></a>
+ **함수 URL**은 단순성과 직접적인 Lambda 통합을 위해 설계되었습니다. 여기에서는 HTTP 및 HTTPS 엔드포인트를 모두 지원하고, 기본 제공 CORS 지원을 제공하며, 듀얼 스택(IPv4 및 IPv6) 엔드포인트를 제공합니다. 고급 기능은 부족하지만 HTTP를 통해 Lambda 함수를 공개하는 빠르고 간단한 방법이 필요한 시나리오에서 적합합니다.
+ **API Gateway**에는 API 버전 관리, 단계 관리, 사용 계획을 위한 API 키, Swagger/OpenAPI에 관한 API 설명서, WebSocket API, VPC 내 프라이빗 API, 추가 보안을 위한 WAF 통합과 같은 많은 추가 기능이 포함되어 있습니다. 또한 카나리 배포, 테스트를 위한 모의 통합 및 Lambda 외 다른 AWS 서비스와의 통합을 지원합니다.

## Lambda 함수를 간접 호출할 메서드 선택
<a name="w2aac39c81c73c15"></a>

이제 Lambda 함수 URL 및 API Gateway 중 하나를 선택하는 기준과 이들 간의 주요 차이에 대해 알아보았으니, 요구 사항에 가장 적합한 옵션을 선택하고 다음 리소스를 사용하여 사용을 시작할 수 있습니다.

------
#### [ Function URLs ]

**다음 리소스를 사용하여 함수 URL 시작하기**
+ 자습서 [함수 URL을 사용하여 Lambda 함수 생성](urls-webhook-tutorial.md) 수행
+ 이 설명서의 [Lambda 함수 URL 생성 및 관리](urls-configuration.md) 장에서 함수 URL에 대해 자세히 알아보기
+ 다음을 수행하여 콘솔 내 안내식 자습서 **간단한 웹 앱 생성**을 시도해 보세요.

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 여세요.

1. 화면의 오른쪽 상단에 있는 아이콘을 선택하여 도움말 패널을 여세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/console_help_screenshot.png)

1. **자습서**를 선택하세요.

1. **간단한 웹 앱 생성**에서 **자습서 시작**을 선택하세요.

------
#### [ API Gateway ]

**다음 리소스를 사용하여 Lambda 및 API Gateway 시작하기**
+ 자습서 [API Gateway와 함께 Lambda 사용](services-apigateway-tutorial.md)에 따라 백엔드 Lambda 함수와 통합된 REST API를 생성합니다.
+ *Amazon API Gateway 개발자 안내서*의 다음 섹션에서 API Gateway가 제공하는 여러 API 유형에 대해 자세히 알아보세요.
  + [API Gateway REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html)
  + [API Gateway HTTP API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html)
  + [API Gateway WebSocket API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html)
+ *Amazon API Gateway 개발자 안내서*의 [자습서 및 워크숍](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-tutorials.html) 섹션에서 하나 이상의 예제를 시도해 보세요.

------

# 자습서: Lambda 함수 URL을 사용하여 웹후크 엔드포인트 생성
<a name="urls-webhook-tutorial"></a>

이 자습서에서는 Lambda 함수 URL을 생성하여 웹후크 엔드포인트를 구현합니다. 웹후크는 HTTP를 사용하여 애플리케이션 간에 데이터를 자동으로 전송하는 경량형 이벤트 기반 통신입니다. 웹후크를 사용하면 다른 시스템에서 발생하는 이벤트(예: 새 고객의 웹 사이트 가입, 결제 처리, 파일 업로드)에 대한 즉각적인 업데이트를 받을 수 있습니다.

Lambda를 활용하면 Lambda 함수 URL 또는 API Gateway를 사용하여 웹후크를 구현할 수 있습니다. 함수 URL은 고급 권한 부여 또는 요청 검증 같은 기능이 필요하지 않은 간단한 웹후크에 적합합니다.

**작은 정보**  
특정한 사용 사례에 가장 적합한 방법을 잘 모르는 경우 [HTTP 요청을 사용하여 Lambda 함수를 간접 호출하는 메서드 선택](furls-http-invoke-decision.md) 섹션을 참조하세요.

## 사전 조건
<a name="urls-webhook-tutorial-prereqs"></a>

이 자습서를 완료하려면 로컬 시스템에 Python(버전 3.8 이상) 또는 Node.js(버전 18 이상)가 설치되어 있어야 합니다.

HTTP 요청을 사용하여 엔드포인트를 테스트할 수 있도록 자습서에서는 [curl](https://curl.se/)을 사용합니다. 이는 다양한 네트워크 프로토콜을 사용하여 데이터를 전송하는 데 사용할 수 있는 명령줄 도구입니다. 아직 도구를 설치하지 않은 경우, 도구를 설치하는 방법을 알아보려면 [curl 설명서](https://curl.se/docs/install.html)를 참조하세요.

## Lambda 함수 생성
<a name="urls-webhook-tutorial-function"></a>

HTTP 요청이 웹후크 엔드포인트로 전송될 때 실행되는 Lambda 함수를 우선 생성합니다. 이 예제에서 전송 애플리케이션은 결제가 제출될 때마다 업데이트를 전송하며 결제 성공 여부를 HTTP 요청 본문에 표시합니다. Lambda 함수는 요청을 구문 분석하고 결제 상태에 따라 조치를 취합니다. 이 예제에서는 코드가 결제의 주문 ID만 인쇄하지만, 실제 애플리케이션에서는 주문을 데이터베이스에 추가하거나 알림을 전송할 수 있습니다.

또한 이 함수는 웹후크, 해시 기반 메시지 인증(HMAC)에 사용되는 가장 일반적인 인증 방법을 구현합니다. 이 방법을 사용하면 발신 및 수신 애플리케이션 두 가지 모두가 보안 키를 공유합니다. 전송 애플리케이션은 해싱 알고리즘을 사용하여 메시지 콘텐츠와 함께 이 키를 사용하여 고유한 서명을 생성하며, 웹후크 요청 내에 서명을 HTTP 헤더로 포함합니다. 그런 다음 수신 애플리케이션이 이 단계를 반복하여 보안 키를 사용해 서명을 생성하며, 결과 값을 요청 헤더에 전송된 서명과 비교합니다. 결과가 일치하면 요청이 정상적인 것으로 간주됩니다.

Python 또는 Node.js 런타임과 함께 Lambda 콘솔을 사용하여 함수를 생성합니다.

------
#### [ Python ]

**Lambda 함수 생성**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 다음을 수행하여 기본 'Hello world' 함수를 생성합니다.

   1. **함수 생성**을 선택합니다.

   1. **새로 작성**을 선택합니다.

   1. [**함수 이름**]에 **myLambdaWebhook**을 입력합니다.

   1. **런타임**에서 **Python 3.14**을 선택합니다.

   1. **함수 생성**을 선택합니다.

1. **코드 소스** 창에서 다음을 복사하고 붙여 넣어 기존 코드를 바꿉니다.

   ```
   import json
   import hmac
   import hashlib
   import os
   
   def lambda_handler(event, context):
       
       # Get the webhook secret from environment variables
       webhook_secret = os.environ['WEBHOOK_SECRET']
       
       # Verify the webhook signature
       if not verify_signature(event, webhook_secret):
           return {
               'statusCode': 401,
               'body': json.dumps({'error': 'Invalid signature'})
           }
       
       try:
           # Parse the webhook payload
           payload = json.loads(event['body'])
           
           # Handle different event types
           event_type = payload.get('type')
           
           if event_type == 'payment.success':
               # Handle successful payment
               order_id = payload.get('orderId')
               print(f"Processing successful payment for order {order_id}")
               
               # Add your business logic here
               # For example, update database, send notifications, etc.
               
           elif event_type == 'payment.failed':
               # Handle failed payment
               order_id = payload.get('orderId')
               print(f"Processing failed payment for order {order_id}")
               
               # Add your business logic here
               
           else:
               print(f"Received unhandled event type: {event_type}")
           
           # Return success response
           return {
               'statusCode': 200,
               'body': json.dumps({'received': True})
           }
           
       except json.JSONDecodeError:
           return {
               'statusCode': 400,
               'body': json.dumps({'error': 'Invalid JSON payload'})
           }
       except Exception as e:
           print(f"Error processing webhook: {e}")
           return {
               'statusCode': 500,
               'body': json.dumps({'error': 'Internal server error'})
           }
   
   def verify_signature(event, webhook_secret):
       """
       Verify the webhook signature using HMAC
       """
       try:
           # Get the signature from headers
           signature = event['headers'].get('x-webhook-signature')
   
           if not signature:
               print("Error: Missing webhook signature in headers")
               return False
           
           # Get the raw body (return an empty string if the body key doesn't exist)
           body = event.get('body', '')
           
           # Create HMAC using the secret key
           expected_signature = hmac.new(
               webhook_secret.encode('utf-8'),
               body.encode('utf-8'),
               hashlib.sha256
           ).hexdigest()
           
           # Compare the expected signature with the received signature to authenticate the message
           is_valid = hmac.compare_digest(signature, expected_signature)
           if not is_valid:
               print(f"Error: Invalid signature. Received: {signature}, Expected: {expected_signature}")
               return False
               
           return True
       except Exception as e:
           print(f"Error verifying signature: {e}")
           return False
   ```

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.

------
#### [ Node.js ]

**Lambda 함수 생성**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 다음을 수행하여 기본 'Hello world' 함수를 생성합니다.

   1. **함수 생성**을 선택합니다.

   1. **새로 작성**을 선택합니다.

   1. [**함수 이름**]에 **myLambdaWebhook**을 입력합니다.

   1. **런타임**에서 **nodejs24.x**를 선택합니다.

   1. **함수 생성**을 선택합니다.

1. **코드 소스** 창에서 다음을 복사하고 붙여 넣어 기존 코드를 바꿉니다.

   ```
   import crypto from 'crypto';
   
   export const handler = async (event, context) => {
       // Get the webhook secret from environment variables
       const webhookSecret = process.env.WEBHOOK_SECRET;
   
       // Verify the webhook signature
       if (!verifySignature(event, webhookSecret)) {
           return {
               statusCode: 401,
               body: JSON.stringify({ error: 'Invalid signature' })
           };
       }
   
       try {
           // Parse the webhook payload
           const payload = JSON.parse(event.body);
   
           // Handle different event types
           const eventType = payload.type;
   
           switch (eventType) {
               case 'payment.success': {
                   // Handle successful payment
                   const orderId = payload.orderId;
                   console.log(`Processing successful payment for order ${orderId}`);
   
                   // Add your business logic here
                   // For example, update database, send notifications, etc.
                   break;
               }
   
               case 'payment.failed': {
                   // Handle failed payment
                   const orderId = payload.orderId;
                   console.log(`Processing failed payment for order ${orderId}`);
   
                   // Add your business logic here
                   break;
               }
   
               default:
                   console.log(`Received unhandled event type: ${eventType}`);
           }
   
           // Return success response
           return {
               statusCode: 200,
               body: JSON.stringify({ received: true })
           };
   
       } catch (error) {
           if (error instanceof SyntaxError) {
               // Handle JSON parsing errors
               return {
                   statusCode: 400,
                   body: JSON.stringify({ error: 'Invalid JSON payload' })
               };
           }
   
           // Handle all other errors
           console.error('Error processing webhook:', error);
           return {
               statusCode: 500,
               body: JSON.stringify({ error: 'Internal server error' })
           };
       }
   };
   
   // Verify the webhook signature using HMAC
   
   const verifySignature = (event, webhookSecret) => {
       try {
           // Get the signature from headers
           const signature = event.headers['x-webhook-signature'];
     
           if (!signature) {
               console.log('No signature found in headers:', event.headers);
               return false;
           }
     
           // Get the raw body (return an empty string if the body key doesn't exist)
           const body = event.body || '';
     
           // Create HMAC using the secret key
           const hmac = crypto.createHmac('sha256', webhookSecret);
           const expectedSignature = hmac.update(body).digest('hex');
     
           // Compare expected and received signatures
           const isValid = signature === expectedSignature;
           if (!isValid) {
               console.log(`Invalid signature. Received: ${signature}, Expected: ${expectedSignature}`);
               return false;
           }
           
           return true;
       } catch (error) {
           console.error('Error during signature verification:', error);
           return false;
       }
     };
   ```

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.

------

## 보안 암호 키 생성
<a name="urls-webhook-tutorial-key"></a>

Lambda 함수는 웹후크 요청을 인증할 수 있도록 호출 애플리케이션과 공유하는 보안 키를 사용합니다. 이 예제에서는 키가 환경 변수에 저장됩니다. 프로덕션 애플리케이션에서는 함수 코드에 암호와 같은 민감한 정보를 저장하지 마십시오. 대신 [AWS Secrets Manager 보안 암호를 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)한 다음 [AWS Parameters and Secrets Lambda 확장](with-secrets-manager.md)을 사용하여 Lambda 함수에서 자격 증명을 검색합니다.

**웹후크 보안 암호 키 생성 및 저장**

1. 암호화 보안 난수 생성기를 사용하여 긴 무작위 문자열을 생성합니다. Python 또는 Node.js에서 다음 코드 조각을 사용하여 32자 보안 암호를 생성 및 인쇄하거나, 원하는 방법을 사용할 수 있습니다.

------
#### [ Python ]

**Example 보안 암호를 생성하는 코드**  

   ```
   import secrets
   webhook_secret = secrets.token_urlsafe(32)
   print(webhook_secret)
   ```

------
#### [ Node.js ]

**Example 보안 암호를 생성하는 코드(ES 모듈 형식)**  

   ```
   import crypto from 'crypto';
   let webhookSecret = crypto.randomBytes(32).toString('base64');
   console.log(webhookSecret)
   ```

------

1. 다음을 수행하여 생성된 문자열을 함수의 환경 변수로 저장합니다.

   1. 함수에 대한 **구성** 페이지에서 **환경 변수**를 선택합니다.

   1. **편집**을 선택합니다.

   1. **Add environment variable(환경 변수 추가)**을 선택합니다.

   1. **키**에서 **WEBHOOK\$1SECRET**을 입력한 다음, **값**에서 이전 단계에서 생성한 보안 암호를 입력합니다.

   1. **저장**을 선택합니다.

자습서의 뒷부분에서 이 보안 암호를 다시 사용하여 함수를 테스트해야 하므로 이 보안 암호를 지금 메모해 두세요.

## 함수 URL 엔드포인트 생성
<a name="urls-webhook-tutorial-furl"></a>

Lambda 함수 URL을 사용하여 웹후크의 엔드포인트를 생성합니다. 인증 유형 `NONE`을 사용하여 퍼블릭 액세스 권한이 있는 엔드포인트를 생성하면 URL이 있는 누구나 함수를 간접적으로 호출할 수 있습니다. 함수 URL에 대한 액세스 권한 제어를 자세히 알아보려면 [Lambda 함수 URL에 대한 액세스 제어](urls-auth.md) 섹션을 참조하세요. 웹후크에 대한 고급 인증 옵션이 필요한 경우 API Gateway를 사용하는 것이 좋습니다.

**함수 URL 엔드포인트 생성**

1. 함수의 **구성** 탭에서 **함수 URL**을 선택합니다.

1. **함수 URL 생성(Create function URL)**을 선택합니다.

1. **인증 유형**에서 **없음**을 선택합니다.

1. **저장**을 선택합니다.

방금 생성한 함수 URL의 엔드포인트가 **함수 URL** 창에 표시됩니다. 자습서의 뒷부분에서 사용할 엔드포인트를 복사합니다.

## 콘솔에서 함수 테스트
<a name="urls-webhook-tutorial-test-console"></a>

HTTP 요청을 사용하여 URL 엔드포인트를 사용하여 함수를 간접적으로 호출하려면 우선 콘솔에서 이를 테스트하여 코드가 예상대로 작동하는지 확인합니다.

콘솔에서 함수를 확인하려면 먼저 다음과 같은 테스트 JSON 페이로드를 통해 자습서 앞부분에서 생성한 보안 암호를 사용하여 웹후크 서명을 계산합니다.

```
{
    "type": "payment.success", 
    "orderId": "1234",
    "amount": "99.99"
}
```

다음과 같은 Python 또는 Node.js 코드 예제 중 하나를 사용해 고유한 보안 암호를 이용하여 웹후크 서명을 계산합니다.

------
#### [ Python ]

**웹후크 서명 계산**

1. 다음 코드를 `calculate_signature.py`라는 이름의 파일에 저장합니다. 코드의 웹후크 보안 암호를 원하는 고유한 값으로 바꿉니다.

   ```
   import secrets
   import hmac
   import json
   import hashlib
   
   webhook_secret = "arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M"
   
   body = json.dumps({"type": "payment.success", "orderId": "1234", "amount": "99.99"})
   
   signature = hmac.new(
               webhook_secret.encode('utf-8'),
               body.encode('utf-8'),
               hashlib.sha256
           ).hexdigest()
   
   print(signature)
   ```

1. 코드를 저장한 디렉터리에서 다음 명령을 실행하여 서명을 계산합니다. 코드가 출력하는 서명을 복사합니다.

   ```
   python calculate_signature.py
   ```

------
#### [ Node.js ]

**웹후크 서명 계산**

1. 다음 코드를 `calculate_signature.mjs`라는 이름의 파일에 저장합니다. 코드의 웹후크 보안 암호를 원하는 고유한 값으로 바꿉니다.

   ```
   import crypto from 'crypto';
   
   const webhookSecret = "arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M"
   const body = "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}";
   
   let hmac = crypto.createHmac('sha256', webhookSecret);
   let signature = hmac.update(body).digest('hex');
   
   console.log(signature);
   ```

1. 코드를 저장한 디렉터리에서 다음 명령을 실행하여 서명을 계산합니다. 코드가 출력하는 서명을 복사합니다.

   ```
   node calculate_signature.mjs
   ```

------

이제 콘솔에서 테스트 HTTP 요청을 사용하여 함수 코드를 테스트할 수 있습니다.

**콘솔에서 함수 테스트**

1. 함수의 **코드** 탭을 선택합니다.

1. **테스트 이벤트** 섹션에서 **새로운 테스트 이벤트 생성**을 선택합니다.

1. **Event Name(이벤트 이름)**에 **myEvent**를 입력합니다.

1. 다음을 복사하여 **이벤트 JSON** 창에 붙여 넣어 기존 JSON을 바꿉니다. 웹후크 서명을 이전 단계에서 계산한 값으로 바꿉니다.

   ```
   {
     "headers": {
       "Content-Type": "application/json",
       "x-webhook-signature": "2d672e7a0423fab740fbc040e801d1241f2df32d2ffd8989617a599486553e2a"
     },
     "body": "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}"
   }
   ```

1. **저장**을 선택합니다.

1. ** 간접 호출**를 선택합니다.

   다음과 유사한 출력 화면이 표시되어야 합니다.

------
#### [ Python ]

   ```
   Status: Succeeded
   Test Event Name: myEvent
   
   Response:
   {
     "statusCode": 200,
     "body": "{\"received\": true}"
   }
   
   Function Logs:
   START RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 Version: $LATEST
   Processing successful payment for order 1234
   END RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6
   REPORT RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6	Duration: 1.55 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 36 MB	Init Duration: 136.32 ms
   ```

------
#### [ Node.js ]

   ```
   Status: Succeeded
   Test Event Name: myEvent
   
   Response:
   {
     "statusCode": 200,
     "body": "{\"received\":true}"
   }
   
   Function Logs:
   START RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4 Version: $LATEST
   2025-01-10T18:05:42.062Z	e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4	INFO	Processing successful payment for order 1234
   END RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4
   REPORT RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4	Duration: 60.10 ms	Billed Duration: 61 ms	Memory Size: 128 MB	Max Memory Used: 72 MB	Init Duration: 174.46 ms
   
   Request ID: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4
   ```

------

## HTTP 요청을 사용하여 함수 테스트
<a name="urls-webhook-tutorial-test-curl"></a>

curl 명령줄 도구를 사용하여 웹후크 엔드포인트를 테스트합니다.

**HTTP 요청을 사용하여 함수 테스트**

1. 터미널 또는 쉘 프로그램에서 다음 curl 명령을 실행합니다. URL을 고유한 함수 URL 엔드포인트의 값으로 바꾸고, 웹후크 서명을 고유한 보안 키를 사용하여 계산한 서명으로 바꿉니다.

   ```
   curl -X POST https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/ \
   -H "Content-Type: application/json" \
   -H "x-webhook-signature: d5f52b76ffba65ff60ea73da67bdf1fc5825d4db56b5d3ffa0b64b7cb85ef48b" \
   -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'
   ```

   다음 결과가 표시됩니다.

   ```
   {"received": true}
   ```

1. 함수의 CloudWatch 로그를 검사해 다음을 수행하여 페이로드를 올바르게 구문 분석했는지 확인합니다.

   1. Amazon CloudWatch 콘솔에서 [로그 그룹](https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups) 페이지를 엽니다.

   1. 함수의 로그 그룹(`/aws/lambda/myLambdaWebhook`)을 선택합니다.

   1. 최신 로그 스트림을 선택합니다.

      함수의 로그에서 다음과 유사한 출력 화면이 표시되어야 합니다.

------
#### [ Python ]

      ```
      Processing successful payment for order 1234
      ```

------
#### [ Node.js ]

      ```
      2025-01-10T18:05:42.062Z e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4 INFO Processing successful payment for order 1234
      ```

------

1. 다음 curl 명령을 실행하여 코드가 잘못된 서명을 감지하는지 확인합니다. URL을 고유한 함수 URL 엔드포인트로 바꿉니다.

   ```
   curl -X POST https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/ \
   -H "Content-Type: application/json" \
   -H "x-webhook-signature: abcdefg" \
   -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'
   ```

   다음 결과가 표시됩니다.

   ```
   {"error": "Invalid signature"}
   ```

## 리소스 정리
<a name="urls-webhook-tutorial-cleanup"></a>

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

**Lambda 함수를 삭제하려면**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 생성한 함수를 선택합니다.

1. **작업**(Actions), **삭제**(Delete)를 선택합니다.

1. 텍스트 입력 필드에 **confirm**를 입력하고 **Delete**(삭제)를 선택합니다.

콘솔에서 Lambda 함수를 생성하면 Lambda는 함수에 대한 [실행 역할](lambda-intro-execution-role.md)도 생성합니다.

**집행 역할 삭제**

1. IAM 콘솔에서 [역할 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. Lambda가 생성한 실행 역할을 선택합니다. 역할의 이름 형식은 `myLambdaWebhook-role-<random string>`입니다.

1. **삭제**를 선택합니다.

1. 텍스트 입력 필드에 역할의 이름을 입력하고 **Delete**(삭제)를 선택합니다.