

# 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) 섹션을 참조하세요.