

# Amazon SQS에서 Lambda 사용
<a name="with-sqs"></a>

**참고**  
Lambda 함수 이외의 대상으로 데이터를 전송하거나 데이터를 전송하기 전에 데이터를 보강하려는 경우 [Amazon EventBridge 파이프](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html)를 참조하세요.

Lambda 함수를 사용하여 Amazon Simple Queue Service(Amazon SQS) 대기열의 메시지를 처리할 수 있습니다. Lambda는 [이벤트 소스 매핑](invocation-eventsourcemapping.md)을 위해 [표준 대기열](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html)과 [선입선출(FIFO) 대기열](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)을 모두 지원합니다. 프로비저닝 모드를 사용하여 Amazon SQS 이벤트 소스 매핑에 전용 폴링 리소스를 할당할 수도 있습니다. Lambda 함수와 Amazon SQS 대기열은 [서로 다른 AWS 계정](with-sqs-cross-account-example.md)에 있을 수 있지만 동일한 AWS 리전에 있어야 합니다.

Amazon SQS 메시지를 처리할 때, 배치의 일부 메시지가 실패하는 경우 처리 완료된 메시지가 재시도되지 않도록 부분 배치 응답 로직을 구현해야 합니다. Powertools for AWS Lambda의 [배치 프로세서 유틸리티](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/)는 부분 배치 응답 로직을 자동으로 처리하여 개발 시간을 단축하고 신뢰성을 개선하여 해당 구현을 간소화합니다.

**Topics**
+ [Amazon SQS 이벤트 소스 매핑에 대한 폴링 및 배치 동작 이해](#sqs-polling-behavior)
+ [Amazon SQS 이벤트 소스 매핑에서 프로비저닝 모드 사용](#sqs-provisioned-mode)
+ [Amazon SQS 이벤트 소스 매핑에 대한 프로비저닝 모드 구성](#sqs-configuring-provisioned-mode)
+ [표준 대기열 메시지 이벤트의 예](#example-standard-queue-message-event)
+ [FIFO 대기열 메시지 이벤트의 예](#sample-fifo-queues-message-event)
+ [Amazon SQS 이벤트 소스 매핑 생성 및 구성](services-sqs-configure.md)
+ [SQS 이벤트 소스 매핑에 대한 규모 조정 동작 구성](services-sqs-scaling.md)
+ [Lambda에서 SQS 이벤트 소스에 대한 오류 처리](services-sqs-errorhandling.md)
+ [Amazon SQS 이벤트 소스 매핑을 위한 Lambda 파라미터](services-sqs-parameters.md)
+ [Amazon SQS 이벤트 소스를 통해 이벤트 필터링 사용](with-sqs-filtering.md)
+ [자습서: Amazon SQS에서 Lambda 사용](with-sqs-example.md)
+ [자습서: 교차 계정 Amazon SQS 대기열을 이벤트 소스로 사용](with-sqs-cross-account-example.md)

## Amazon SQS 이벤트 소스 매핑에 대한 폴링 및 배치 동작 이해
<a name="sqs-polling-behavior"></a>

Amazon SQS 이벤트 소스 매핑을 사용하면 Lambda가 대기열을 폴링하고 이벤트와 [동기적으로](invocation-sync.md) 함수를 간접적으로 간접 호출합니다. 각 이벤트에는 대기열의 여러 메시지 배치가 포함될 수 있습니다. Lambda는 이러한 이벤트를 한 번에 한 배치씩 수신하고 각 배치에 대해 함수를 한 번씩 간접적으로 간접 호출합니다. 함수가 배치를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 삭제합니다.

Lambda가 배치를 수신하면 메시지는 대기열에 머무르지만 대기열의 [표시 제한 시간](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) 동안 숨겨집니다. 함수가 배치의 모든 메시지를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 삭제합니다. 기본적으로 배치를 처리하는 동안 함수에 오류가 발생하면 표시 제한 시간이 만료된 후 해당 배치의 모든 메시지가 대기열에 다시 표시됩니다. 이러한 이유로 함수 코드는 의도하지 않은 부작용 없이 동일한 메시지를 여러 번 처리할 수 있어야 합니다.

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

Lambda가 메시지를 여러 번 처리하지 못하도록 하려면 함수 응답에 [배치 항목 실패](services-sqs-errorhandling.md#services-sqs-batchfailurereporting)를 포함하도록 이벤트 소스 매핑을 구성하거나, Lambda 함수가 메시지를 성공적으로 처리할 경우 [DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessage.html) API를 사용하여 대기열에서 메시지를 제거할 수 있습니다.

SQS 이벤트 소스 매핑을 위해 Lambda가 지원하는 구성 파라미터에 대한 자세한 내용은 [SQS 이벤트 소스 매핑 생성](services-sqs-configure.md#events-sqs-eventsource) 섹션을 참조하세요.

## Amazon SQS 이벤트 소스 매핑에서 프로비저닝 모드 사용
<a name="sqs-provisioned-mode"></a>

이벤트 소스 매핑의 처리량을 미세 조정해야 하는 워크로드의 경우 프로비저닝된 모드를 사용할 수 있습니다. 프로비저닝된 모드에서는 프로비저닝된 이벤트 폴러의 양에 대한 최소 및 최대 제한을 정의합니다. 이러한 프로비저닝된 이벤트 폴러는 이벤트 소스 매핑 전용이며 응답형 오토스케일링을 통해 예상치 못한 메시지 급증을 처리할 수 있습니다. 프로비저닝 모드로 구성된 Amazon SQS 이벤트 소스 매핑은 기본 Amazon SQS 이벤트 소스 매핑 기능보다 3배 더 빠르게 확장되고(분당 최대 1,000개의 동시 간접 호출) 16배 더 높은 동시성(최대 20,000개의 동시 간접 호출)을 지원합니다. 시장 데이터 피드를 처리하는 금융 서비스 회사, 실시간 맞춤형 추천을 제공하는 전자 상거래 플랫폼, 라이브 플레이어 상호 작용을 관리하는 게임 회사 등 성능 요구 사항이 엄격한 Amazon SQS 이벤트 기반 워크로드에는 프로비저닝 모드를 사용하는 것이 좋습니다. 프로비저닝된 모드를 사용하면 추가 비용이 발생합니다. 요금에 대한 자세한 내용은 [AWS Lambda 요금](https://aws.amazon.com/lambda/pricing/)을 참조하세요.

프로비저닝 모드에서 각 이벤트 폴러는 최대 1MB/s의 처리량, 최대 10개의 동시 간접 호출 또는 초당 최대 10개의 Amazon SQS 폴링 API 직접 호출을 처리할 수 있습니다. 최소 이벤트 폴러 수(MinimumPollers)에 대해 허용되는 값의 범위는 2\$1200으로, 기본값은 2입니다. 최대 이벤트 폴러 수(MaximumPollers)에 대해 허용되는 값의 범위는 2\$12,000으로, 기본값은 200입니다. MaximumPollers는 MinimumPollers보다 크거나 같아야 합니다.

### 필요한 이벤트 폴러 결정
<a name="sqs-determining-event-pollers"></a>

SQS ESM에 프로비저닝 모드를 사용할 때 최적의 메시지 처리 성능 보장에 필요한 이벤트 폴러 수를 추정하려면 애플리케이션에 대해 지연 시간이 짧은 처리가 필요한 초당 최대 SQS 이벤트 수, 평균 SQS 이벤트 페이로드 크기, 평균 Lambda 함수 기간, 구성된 배치 크기 등의 지표를 수집합니다.

먼저 다음 공식을 사용하여 이벤트 폴러가 워크로드에 지원하는 초당 SQS 이벤트 수(EPS)를 추정할 수 있습니다.

```
EPS per event poller = 
        minimum(
            ceiling(1024 / average event size in KB),
            ceiling(10 / average function duration in seconds) * batch size, 
            min(100, 10 * batch size)
                )
```

이후 아래 공식을 사용하여 필요한 최소 폴러 수를 계산할 수 있습니다. 이 계산을 통해 최대 트래픽 요구 사항을 처리할 수 있는 충분한 용량을 프로비저닝할 수 있습니다.

```
Required event pollers = (Peak number of events per second in Queue) / EPS per event poller
```

기본 배치 크기가 10이고, 평균 이벤트 크기가 3KB이고, 평균 함수 기간이 100ms이고, 초당 1,000개의 이벤트를 처리해야 하는 워크로드를 고려합니다. 이 시나리오에서 각 이벤트 폴러는 약 100개의 초당 이벤트(EPS)를 지원합니다. 따라서 최대 트래픽 요구 사항을 적절하게 처리하려면 최소 폴러 수를 10으로 설정해야 합니다. 워크로드의 특성이 동일하지만 평균 함수 기간이 1초인 경우 각 폴러는 10 EPS만 지원하므로 짧은 지연 시간으로 초당 1,000개의 이벤트를 지원하도록 최소 100개의 폴러를 구성해야 합니다.

프로비저닝 모드 이벤트 폴러의 효율성을 극대화하려면 기본 배치 크기인 10 이상을 사용하는 것이 좋습니다. 배치 크기가 클수록 각 폴러가 간접 호출당 더 많은 이벤트를 처리하고, 이를 통해 처리량과 비용 효율성을 개선할 수 있습니다. 이벤트 폴러 용량을 계획할 때 잠재적 트래픽 급증을 고려하고 minimumPollers 값을 계산된 최소 값보다 약간 높게 설정하여 여유분을 두는 것이 좋습니다. 추가로 메시지 크기, 함수 기간 또는 트래픽 패턴의 변경으로 인해 최적의 성능과 비용 효율성을 유지하기 위해 이벤트 폴러 구성을 조정해야 할 수 있으므로 시간 경과에 따른 워크로드 특성을 모니터링합니다. 정확한 용량 계획을 위해 특정 워크로드를 테스트하여 각 이벤트 폴러가 처리할 수 있는 실제 EPS를 결정하는 것이 좋습니다.

## Amazon SQS 이벤트 소스 매핑에 대한 프로비저닝 모드 구성
<a name="sqs-configuring-provisioned-mode"></a>

콘솔 또는 Lambda API를 사용하여 Amazon SQS 이벤트 소스 매핑에 대한 프로비저닝 모드를 구성할 수 있습니다.

**기존 Amazon SQS 이벤트 소스 매핑에 대한 프로비저닝 모드를 구성하는 방법(콘솔)**

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

1. 프로비저닝 모드를 구성하려는 Amazon SQS 이벤트 소스 매핑을 사용하여 함수를 선택합니다.

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

1. 프로비저닝 모드를 구성하려는 Amazon SQS 이벤트 소스 매핑을 선택하고 **편집**을 선택합니다.

1. **이벤트 소스 매핑 구성**에서 **프로비저닝된 모드 구성**을 선택하세요.
   + **최소 이벤트 폴러**에 2\$1200의 값을 입력하세요. 값을 지정하지 않는 경우 Lambda에서는 기본값(2)을 선택합니다.
   + **최대 이벤트 폴러**에 2\$12,000의 값을 입력하세요 이 값은 **최소 이벤트 폴러**의 값 이상이어야 합니다. 값을 지정하지 않는 경우 Lambda에서는 기본값(200)을 선택합니다.

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

`EventSourceMappingConfiguration`의 `ProvisionedPollerConfig` 객체를 사용하여 프로그래밍 방식으로 프로비저닝 모드를 구성할 수 있습니다. 예를 들어 다음 `UpdateEventSourceMapping` CLI 명령은 `MinimumPollers` 값을 5로, `MaximumPollers` 값을 100으로 구성합니다.

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{"MinimumPollers": 5, "MaximumPollers": 100}'
```

프로비저닝된 모드를 구성한 후 `ProvisionedPollers` 지표를 모니터링하여 워크로드에 대한 이벤트 폴러 사용량을 관찰할 수 있습니다. 자세한 내용은 이벤트 소스 매핑 지표를 참조하세요.

프로비저닝 모드를 비활성화하고 기본(온디맨드) 모드로 돌아가기 위해 다음 `UpdateEventSourceMapping` CLI 명령을 사용할 수 있습니다.

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{}'
```

**참고**  
프로비저닝 모드는 최대 동시성 설정과 함께 사용할 수 없습니다. 프로비저닝 모드를 사용하는 경우 최대 이벤트 폴러 수를 통해 최대 동시성을 제어합니다.

프로비저닝 모드 구성에 대한 자세한 정보는 [Amazon SQS 이벤트 소스 매핑 생성 및 구성](services-sqs-configure.md) 항목을 참조하세요.

## 표준 대기열 메시지 이벤트의 예
<a name="example-standard-queue-message-event"></a>

**Example Amazon SQS 메시지 이벤트(표준 대기열)**  

```
{
    "Records": [
        {
            "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
            "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082649183",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082649185"
            },
            "messageAttributes": {
                "myAttribute": {
                    "stringValue": "myValue", 
                    "stringListValues": [], 
                    "binaryListValues": [], 
                    "dataType": "String"
                }
            },
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        },
        {
            "messageId": "2e1424d4-f796-459a-8184-9c92662be6da",
            "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082650636",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082650649"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        }
    ]
}
```

기본적으로 Lambda는 대기열에서 최대 10개의 메시지를 한 번에 폴링하고 해당 배치를 함수로 보냅니다. 소수의 레코드로 함수를 간접적으로 호출하는 것을 피하려면 배치 기간을 구성하여 이벤트 소스가 최대 5분 동안 레코드를 버퍼링하도록 구성할 수 있습니다. 함수를 간접적으로 호출하기 전에 Lambda는 배치 기간이 만료되거나, [간접 호출 페이로드 크기 할당량](gettingstarted-limits.md)에 도달하거나, 구성된 최대 배치 크기에 도달할 때까지 표준 대기열에서 메시지를 계속 폴링합니다.

배치 기간을 사용하고 SQS 대기열에 트래픽이 매우 적은 경우, Lambda는 함수를 호출하기 전에 최대 20초까지 기다릴 수 있습니다. 이는 배치 기간을 20초 미만으로 설정한 경우에도 마찬가지입니다.

**참고**  
Java에서는 JSON을 역직렬화할 때 null 포인터 오류가 발생할 수 있습니다. 이는 JSON 객체 매퍼가 ‘Records’ 및 “eventSourceARN’의 대소문자를 변환하는 방식 때문일 수 있습니다.

## FIFO 대기열 메시지 이벤트의 예
<a name="sample-fifo-queues-message-event"></a>

FIFO 대기열의 경우 레코드에는 중복 제거 및 시퀀싱과 관련된 추가 속성이 포함되어 있습니다.

**Example Amazon SQS 메시지 이벤트(FIFO 대기열)**  

```
{
    "Records": [
        {
            "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5",
            "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1573251510774",
                "SequenceNumber": "18849496460467696128",
                "MessageGroupId": "1",
                "SenderId": "AIDAIO23YVJENQZJOL4VO",
                "MessageDeduplicationId": "1",
                "ApproximateFirstReceiveTimestamp": "1573251510774"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo",
            "awsRegion": "us-east-2"
        }
    ]
}
```

# Amazon SQS 이벤트 소스 매핑 생성 및 구성
<a name="services-sqs-configure"></a>

Lambda로 Amazon SQS 메시지를 처리하려면 적절한 설정으로 대기열을 구성한 다음 Lambda 이벤트 소스 매핑을 생성하세요.

**Topics**
+ [Lambda에서 사용할 수 있도록 대기열 구성](#events-sqs-queueconfig)
+ [Lambda 실행 역할 권한 설정](#events-sqs-permissions)
+ [SQS 이벤트 소스 매핑 생성](#events-sqs-eventsource)

## Lambda에서 사용할 수 있도록 대기열 구성
<a name="events-sqs-queueconfig"></a>

기존 Amazon SQS 대기열이 없으면 Lambda 함수의 이벤트 소스로 사용할 [대기열을 생성](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-create-queue.html)합니다. Lambda 함수와 Amazon SQS 대기열은 [서로 다른 AWS 계정](with-sqs-cross-account-example.md)에 있을 수 있지만 동일한 AWS 리전에 있어야 합니다.

함수 시간이 각 레코드 배치를 처리할 수 있도록 하려면 소스 대기열의 [표시 제한 시간](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)을 함수에 [구성 제한 시간](configuration-timeout.md)의 6배 이상으로 설정하세요. 이전 배치를 처리하는 동안 함수가 제한되는 경우 추가 시간을 통해 Lambda가 재시도할 수 있습니다.

**참고**  
함수의 제한 시간은 대기열의 표시 제한 시간보다 작거나 같아야 합니다. Lambda는 이벤트 소스 매핑을 생성하거나 업데이트할 때 해당 요구 사항을 검증하고 함수 제한 시간이 대기열의 표시 제한 시간을 초과하면 오류를 반환합니다.

기본적으로 배치를 처리하는 동안 Lambda에 오류가 발생하면 해당 배치의 모든 메시지가 대기열로 돌아갑니다. [표시 제한 시간](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) 후 메시지가 Lambda에 다시 표시됩니다. [부분 배치 응답](services-sqs-errorhandling.md#services-sqs-batchfailurereporting)을 사용하여 실패한 메시지만 대기열에 반환하도록 이벤트 소스 매핑을 구성할 수 있습니다. 또한 함수가 메시지를 여러 번 처리하지 못하면 Amazon SQS에서 메시지를 [Dead Letter Queue(DLQ)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)로 보낼 수 있습니다. 소스 대기열의 [리드라이브 정책](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html#policies-for-dead-letter-queues)에서 `maxReceiveCount`를 5 이상으로 설정하는 것이 좋습니다. 이를 통해 Lambda는 실패한 메시지를 Dead Letter Queue(DLQ)로 직접 전송하기 전에 몇 번의 재시도를 할 수 있습니다.

## Lambda 실행 역할 권한 설정
<a name="events-sqs-permissions"></a>

[AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) AWS 관리형 정책에는 Lambda가 Amazon SQS 대기열에서 읽는 데 필요한 권한이 포함되어 있습니다. 함수의 실행 역할에 [이 관리형 정책을 추가](lambda-intro-execution-role.md)할 수 있습니다.

선택적으로 암호화된 대기열을 사용하는 경우 실행 역할에 다음 권한도 추가해야 합니다.
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

## SQS 이벤트 소스 매핑 생성
<a name="events-sqs-eventsource"></a>

이벤트 소스 매핑을 생성하여 Lambda가 대기열의 항목을 Lambda 함수로 전송하게 할 수 있습니다. 여러 이벤트 소스 매핑을 생성하여 하나의 함수로 여러 대기열의 항목을 처리할 수 있습니다. Lambda가 대상 함수를 간접 호출하면 이벤트에는 구성 가능한 최대 *배치 크기*까지 항목이 여러 개 포함될 수 있습니다.

Amazon SQS에서 읽도록 함수를 구성하려면 [ AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) AWS 관리형 정책을 실행 역할에 연결합니다. 그리고 다음 단계를 사용하여 콘솔에서 **SQS** 이벤트 소스 매핑을 생성합니다.

**권한 추가 및 트리거 생성**

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

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

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

1. **역할 이름**에서 실행 역할에 대한 링크를 선택합니다. 이 링크를 클릭하면 IAM 콘솔에서 역할이 열립니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/execution-role.png)

1. **권한 추가**를 선택하고 **정책 연결**을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/attach-policies.png)

1. 검색 필드에 `AWSLambdaSQSQueueExecutionRole`를 입력합니다. 실행 역할에 이 정책을 추가합니다. 이는 함수가 Amazon SQS 대기열에서 읽어야 하는 권한을 포함하는 AWS 관리형 정책입니다. 이 정책에 대한 자세한 내용은 **AWS Managed Policy 참조 안내서의 [AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html)을 참조하세요.

1. Lambda 콘솔에서 함수로 돌아갑니다. **함수 개요(Function overview)**에서 **트리거 추가(Add trigger)**를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/add-trigger.png)

1. 트리거 유형을 선택합니다.

1. 필요한 옵션을 구성한 다음 **추가**를 선택합니다.

Lambda는 Amazon SQS 이벤트 소스에 대해 다음과 같은 구성 옵션을 지원합니다.

**SQS 대기열**  
레코드를 읽어 올 Amazon SQS 대기열입니다. Lambda 함수와 Amazon SQS 대기열은 [서로 다른 AWS 계정](with-sqs-cross-account-example.md)에 있을 수 있지만 동일한 AWS 리전에 있어야 합니다.

**트리거 활성화**  
이벤트 소스 매핑의 상태입니다. **Enable trigger**(트리거 활성화)는 기본적으로 선택됩니다.

**배치 크기**  
각 배치에서 함수에 보낼 레코드 최대 수입니다. 표준 대기열의 경우 최대 10,000개의 레코드가 될 수 있습니다. FIFO 대기열의 경우 최대값은 10입니다. 10을 초과하는 배치 크기의 경우 배치 기간(`MaximumBatchingWindowInSeconds`)도 최소 1초로 설정해야 합니다.  
[함수 제한 시간](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/configurations#timeouts)은 항목의 전체 배치를 처리할 시간이 충분하도록 구성합니다. 항목을 처리하는 데 걸리는 시간이 길면 더 작은 배치 크기를 선택합니다. 배치 크기가 크면 매우 빠르거나 오버헤드가 큰 워크로드에 대한 효율성에 영향을 미칠 수 있습니다. 함수에 [예약된 동시성](configuration-concurrency.md)을 구성할 경우 최소 동시성 실행 수를 5로 설정하여 Lambda가 함수를 간접 호출할 때 스로틀링할 수 있는 가능성을 줄이세요.  
이벤트의 총 크기가 동기식 간접 호출에 대한 [간접 호출 페이로드 크기 할당량](gettingstarted-limits.md)(6MB)을 초과하지 않는 한 Lambda는 단일 직접 호출로 배치의 모든 레코드를 함수에 전달합니다. Lambda와 Amazon SQS는 모두 각 레코드의 메타데이터를 생성합니다. 이 추가 메타데이터는 총 페이로드 크기에 포함되며, 그러면 배치로 전송된 총 레코드 수가 구성된 배치 크기보다 작을 수 있습니다. Amazon SQS에서 전송하는 메타데이터 필드는 길이가 가변적일 수 있습니다. Amazon SQS 메타데이터 필드에 대한 자세한 내용은 **Amazon Simple Queue Service API 참조의 [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) API 작업 설명서를 참조하세요.

**배치 기간**  
함수를 호출하기 전에 기록을 수집할 최대 기간(단위: 초)입니다. 이 지표는 표준 대기열에만 적용됩니다.  
0초보다 큰 배치 기간을 사용하는 경우 대기열의 [표시 제한 시간](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)에서 늘어난 처리 시간을 고려해야 합니다. 대기열의 가시성 제한 시간을 [함수 제한 시간](configuration-timeout.md)의 6배에 `MaximumBatchingWindowInSeconds` 값을 더한 값으로 설정하는 것이 좋습니다. 이렇게 하면 Lambda 함수가 각 이벤트 배치를 처리하고 스로틀링 오류가 발생할 경우 다시 시도할 수 있습니다.  
메시지를 사용할 수 있게 되면 Lambda는 메시지를 일괄 처리하기 시작합니다. Lambda는 함수를 동시에 5번 호출하여 한 번에 5개의 배치를 처리하기 시작합니다. 메시지를 계속 사용할 수 있는 경우 Lambda는 분당 최대 300개의 함수 동시 간접 호출을 추가해 최대 1,250개까지 동시 간접 호출을 추가합니다. 프로비저닝 모드를 사용할 때 각 이벤트 폴러는 최대 1MB/s의 처리량, 최대 10개의 동시 간접 호출 또는 초당 최대 10개의 Amazon SQS 폴링 API 직접 호출을 처리할 수 있습니다. Lambda는 구성된 최소 및 최대 이벤트 폴러 수를 조정하여 분당 최대 1,000개의 동시 간접 호출을 빠르게 추가하면서 Amazon SQS 이벤트를 지연 시간이 짧은 방식으로 처리합니다. 이러한 최소 및 최대 이벤트 폴러 설정을 통해 규모 조정 및 동시성을 제어합니다. 함수 규모 조정 및 동시성에 대한 자세한 내용은 [Lambda 함수 규모 조정 이행](lambda-concurrency.md) 항목을 참조하세요.  
더 많은 메시지를 처리하기 위해 Lambda 함수를 최적화하여 처리량을 높일 수 있습니다. 자세한 내용은 [AWS Lambda의 Amazon SQS 표준 대기열 규모 조정 방식 이해](https://aws.amazon.com/blogs/compute/understanding-how-aws-lambda-scales-when-subscribed-to-amazon-sqs-queues/#:~:text=If there are more messages,messages from the SQS queue.)를 참조하세요.

**필터 기준**  
필터 기준을 추가하여 Lambda가 처리를 위해 함수로 보내는 이벤트를 제어합니다. 자세한 내용은 [Lambda가 함수로 보내는 이벤트에 대한 제어](invocation-eventfiltering.md) 섹션을 참조하세요.

**최대 동시성**  
이벤트 소스가 간접 호출할 수 있는 최대 동시성 함수 수입니다. 프로비저닝 모드가 활성화된 상태에서는 사용할 수 없습니다. 자세한 내용은 [Amazon SQS 이벤트 소스의 최대 동시성 구성](services-sqs-scaling.md#events-sqs-max-concurrency) 섹션을 참조하세요.

**프로비저닝된 모드**  
활성화되면 이벤트 소스 매핑에 대한 전용 폴링 리소스를 할당합니다. 이벤트 폴러의 최소(2\$1200) 및 최대(2\$12,000) 수를 구성할 수 있습니다. 각 이벤트 폴러는 최대 1MB/초의 처리량, 최대 10개의 동시 간접 호출 또는 초당 최대 10개의 Amazon SQS 폴링 API 직접 호출을 처리할 수 있습니다.  
참고: 프로비저닝 모드와 최대 동시성을 함께 사용할 수 없습니다. 프로비저닝 모드가 활성화된 경우 최대 폴러 설정을 사용하여 동시성을 제어합니다.

# SQS 이벤트 소스 매핑에 대한 규모 조정 동작 구성
<a name="services-sqs-scaling"></a>

최대 동시성 설정을 통해 또는 프로비저닝 모드를 활성화하여 Amazon SQS 이벤트 소스 매핑의 규모 조정 동작을 제어할 수 있습니다. 둘을 함께 사용할 수는 없습니다.

기본적으로 Lambda는 메시지 볼륨을 기반으로 이벤트 폴러의 규모를 자동으로 조정합니다. 프로비저닝 모드를 활성화하면 예상 트래픽 패턴을 처리할 준비 상태가 유지되는 최소 및 최대 전용 폴링 리소스 수를 할당합니다. 이렇게 하면 다음 2가지 방법으로 이벤트 소스 매핑의 성능을 최적화할 수 있습니다.
+ 표준 모드(기본값): Lambda는 소수의 폴러로 시작하여 워크로드에 따라 스케일 업하거나 스케일 다운하여 스케일을 자동으로 관리합니다.
+ 프로비저닝 모드: 최소 및 최대 제한을 사용하여 전용 폴링 리소스를 구성하면서 규모 조정 속도를 3배 높이고 처리 용량을 최대 16배 높일 수 있습니다.

표준 대개열의 경우 Lambda는 [긴 폴링](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html#sqs-long-polling)을 사용하여 대기열이 활성화될 때까지 대기열을 폴링합니다. 메시지를 사용할 수 있는 경우 Lambda는 함수를 동시에 5번 호출하여 한 번에 5개의 배치를 처리하기 시작합니다. 메시지를 계속 사용할 수 있는 경우 Lambda는 배치를 읽는 프로세스의 수를 분당 최대 300개의 추가 동시 간접 호출까지 증가시킵니다. 이벤트 소스 매핑으로 동시에 처리할 수 있는 최대 간접 호출 수는 1,250개입니다. 트래픽이 적으면 Lambda는 처리 규모를 5개의 동시 간접 호출로 다시 조정하고 동시 간접 호출을 2개까지 최적화하여 Amazon SQS 직접 호출과 해당 비용을 줄일 수 있습니다. 그러나 최대 동시성 설정을 활성화한 경우에는 이 최적화를 사용할 수 없습니다.

FIFO 대기열의 경우, Lambda는 메시지를 수신하는 순서대로 함수에 메시지를 보냅니다. FIFO 대기열에 메시지를 전송할 때 [메시지 그룹 ID](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html)를 지정합니다. Amazon SQS는 동일한 그룹의 메시지가 순서대로 Lambda에 전송되도록 합니다. Lambda가 메시지를 배치로 읽을 때 각 배치에는 둘 이상의 메시지 그룹의 메시지가 포함될 수 있지만 메시지 순서는 그대로 유지됩니다. 함수가 오류를 반환하면 함수는 Lambda가 동일한 그룹에서 추가 메시지를 수신하기 전에 영향을 받는 메시지에 대해 모든 재시도를 시도합니다.

프로비저닝 모드를 사용할 때 각 이벤트 폴러는 최대 1MB/초의 처리량, 최대 10개의 동시 간접 호출 또는 초당 최대 10개의 Amazon SQS 폴링 API 직접 호출을 처리할 수 있습니다. Lambda는 구성된 최소 및 최대 이벤트 폴러 수를 조정하여 분당 최대 1,000개의 동시성을 빠르게 추가하면서 Amazon SQS 이벤트를 일관적이면서 지연 시간이 짧은 방식으로 처리합니다. 프로비저닝된 모드를 사용하면 추가 비용이 발생합니다. 요금에 대한 자세한 내용은 [AWS Lambda 요금](https://aws.amazon.com/lambda/pricing/)을 참조하세요. 각 이벤트 폴러는 SQS 대기열에 초당 최대 10개의 폴링을 사용하는 [긴 폴링](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html)을 사용하므로 SQS API 요청 비용이 발생합니다. 자세한 내용은 [Amazon SQS 요금](https://aws.amazon.com/sqs/pricing/ )을 참조하세요. 이러한 옵션은 함께 사용할 수 없으므로 최대 동시성 설정을 사용하는 대신 최소 및 최대 이벤트 폴러 설정을 통해 조정 및 동시성을 제어합니다.

**참고**  
최대 동시성 설정과 프로비저닝 모드를 동시에 사용할 수는 없습니다. 프로비저닝 모드가 활성화되면 최소 및 최대 이벤트 폴러 수를 통해 Amazon SQS 이벤트 소스 매핑의 조정 및 동시성을 제어할 수 있습니다.

## Amazon SQS 이벤트 소스의 최대 동시성 구성
<a name="events-sqs-max-concurrency"></a>

최대 동시성 설정을 사용하여 SQS 이벤트 소스의 규모 조정 동작을 제어할 수 있습니다. 최대 동시성은 프로비저닝 모드가 활성화된 상태에서 사용할 수 없습니다. 최대 동시성 설정은 Amazon SQS 이벤트 소스가 간접 호출할 수 있는 함수의 동시 인스턴스 수를 제한합니다. 최대 동시성은 이벤트 소스 수준 설정입니다. 여러 Amazon SQS 이벤트 소스가 하나의 함수에 매핑되어 있는 경우, 각 이벤트 소스마다 별도의 최대 동시성 설정이 있을 수 있습니다. 최대 동시성을 사용하여 단일 대기열이 함수의 [예약된 동시성](configuration-concurrency.md) 전체를 사용하거나 [계정의 나머지 동시성 할당량](gettingstarted-limits.md)을 사용하지 못하도록 할 수 있습니다. Amazon SQS 이벤트 소스에 대해 최대 동시성을 구성하는 데는 요금이 부과되지 않습니다.

중요한 것은 최대 동시성과 예약된 동시성은 독립된 두 설정이라는 것입니다. 함수의 예약된 동시성보다 큰 최대 동시성을 설정하지 마세요. 최대 동시성을 구성한 경우, 함수의 예약된 동시성이 함수의 모든 Amazon SQS 이벤트 소스에 대한 총 최대 동시성보다 크거나 같은지 확인합니다. 그렇지 않으면 Lambda가 메시지를 제한할 수도 있습니다.

계정의 동시 실행 할당량이 기본값인 1,000으로 설정된 경우, 최대 동시성을 지정하지 않는 한 Amazon SQS 이벤트 소스 매핑은 함수 인스턴스를 이 값까지 간접 호출하도록 확장할 수 있습니다.

계정의 기본 동시성 할당량이 증가하면 Lambda가 새 할당량까지 동시 함수 인스턴스를 간접 호출하지 못할 수 있습니다. 기본적으로 Lambda는 Amazon SQS 이벤트 소스 매핑을 위해 최대 1,250개의 동시 함수 인스턴스를 간접 호출하도록 확장할 수 있습니다. 사용 사례에 충분하지 않은 경우 AWS Support에 문의하여 계정의 Amazon SQS 이벤트 소스 매핑 동시성 증가에 대해 논의하세요.

**참고**  
FIFO 대기열의 경우 동시 호출은 [메시지 그룹 ID](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html)(`messageGroupId`) 또는 최대 동시성 설정 중 더 낮은 값으로 제한됩니다. 예를 들어, 메시지 그룹 ID가 6개이고 최대 동시성이 10으로 설정된 경우 함수는 최대 6개의 동시 호출을 가질 수 있습니다.

신규 및 기존 Amazon SQS 이벤트 소스 매핑에 대해 최대 동시성을 구성할 수 있습니다.

**Lambda 콘솔을 사용하여 최대 동시성 구성**

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

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

1. **Function overview**(함수 개요)에서 **SQS**를 선택합니다. 그러면 **Configuration**(구성) 탭이 열립니다.

1. Amazon SQS 트리거를 선택하고 **Edit**(편집)를 선택합니다.

1. **Maximum concurrency**(최대 동시성)에 2에서 1,000 사이의 숫자를 입력합니다. 최대 동시성을 해제하려면 상자를 비워 둡니다.

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

**AWS Command Line Interface(AWS CLI)를 사용하여 최대 동시성 구성**  
`--scaling-config` 옵션과 함께 [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 \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --scaling-config '{"MaximumConcurrency":5}'
```

최대 동시성을 해제하려면 `--scaling-config`에 빈 값을 입력합니다.

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

**Lambda API를 사용하여 최대 동시성 구성**  
[ScalingConfig](https://docs.aws.amazon.com/lambda/latest/api/API_ScalingConfig.html) 객체와 함께 [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) 또는 [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) 작업을 사용합니다.

# Lambda에서 SQS 이벤트 소스에 대한 오류 처리
<a name="services-sqs-errorhandling"></a>

SQS 이벤트 소스와 관련된 오류를 처리하기 위해 Lambda는 백오프 전략과 함께 재시도 전략을 자동으로 사용합니다. [부분 배치 응답](#services-sqs-batchfailurereporting)을 반환하도록 SQS 이벤트 소스 매핑을 구성하여 오류 처리 동작을 사용자 지정할 수도 있습니다.

## 실패한 호출에 대한 백오프 전략
<a name="services-sqs-backoff-strategy"></a>

호출이 실패하면 Lambda는 백오프 전략을 구현하면서 호출을 재시도합니다. 백오프 전략은 Lambda가 함수 코드의 오류로 인해 장애를 겪었는지 아니면 스로틀링으로 인해 장애가 발생했는지에 따라 약간 다릅니다.
+  **함수 코드**로 인해 오류가 발생한 경우 Lambda는 간접 호출 처리 및 재시도를 중지합니다. 그 동안 Lambda는 점진적으로 백오프를 수행하여 Amazon SQS 이벤트 소스 매핑에 할당되는 동시성의 양을 줄입니다. 대기열의 표시 제한 시간이 다 지나면 메시지가 대기열에 다시 나타납니다.
+ **스로틀링**으로 인해 호출이 실패하는 경우 Lambda는 Amazon SQS 이벤트 소스 매핑에 할당되는 동시성의 양을 줄여 재시도를 점진적으로 백오프합니다. Lambda는 메시지의 타임스탬프가 대기열의 가시성 제한 시간을 초과할 때(이때 Lambda가 메시지를 삭제)까지 메시지를 계속 재시도합니다.

## 부분 일괄 응답 구현
<a name="services-sqs-batchfailurereporting"></a>

배치를 처리하는 동안 Lambda 함수에 오류가 발생하면 Lambda가 성공적으로 처리한 메시지를 포함하여 해당 배치의 모든 메시지가 기본적으로 대기열에 다시 표시됩니다. 따라서 함수가 동일한 메시지를 여러 번 처리할 수 있습니다.

실패한 배치에서 정상 처리된 메시지를 재처리하지 않으려면 실패한 메시지만 다시 표시하도록 이벤트 소스 매핑을 구성할 수 있습니다. 이를 부분 일괄 응답이라고 합니다. 부분 일괄 응답을 켜려면 이벤트 소스 매핑을 구성할 때 [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html#lambda-UpdateEventSourceMapping-request-FunctionResponseTypes) 작업에 대해 `ReportBatchItemFailures`을 지정하십시오. 그러면 함수가 부분적인 성공을 반환할 수 있으므로 레코드에 대한 불필요한 재시도 횟수를 줄일 수 있습니다.

**참고**  
Powertools for AWS Lambda의 [배치 프로세서 유틸리티](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/)는 모든 부분 배치 응답 로직을 자동으로 처리합니다. 이 유틸리티는 배치 처리 패턴 구현을 간소화하고 배치 항목 실패를 올바르게 처리하는 데 필요한 사용자 지정 코드를 줄입니다. Python, Java, Typescript 및 .NET에 사용할 수 있습니다.

`ReportBatchItemFailures`이 활성화되면 Lambda는 함수 호출이 실패할 때 [메시지 폴링을 스케일 다운](#services-sqs-backoff-strategy)하지 않습니다. 일부 메시지에 오류가 발생할 것으로 예상되고 이러한 오류가 메시지 처리 속도에 영향을 미치지 않도록 하려면 `ReportBatchItemFailures`를 사용하십시오.

**참고**  
부분 일괄 응답을 사용할 때는 다음 사항에 유의하세요.  
함수에서 예외가 발생한 경우 전체 배치가 완전한 실패로 간주됩니다.
FIFO 대기열과 함께 이 기능을 사용하는 경우 함수는 첫 번째 실패 후 메시지 처리를 중지하고 `batchItemFailures`에서 모든 실패한 메시지와 처리되지 않은 메시지를 반환해야 합니다. 그러면 대기열의 메시지 순서를 유지할 수 있습니다.

**부분 배치 보고를 활성화 방법**

1. [부분 일괄 응답 구현에 대한 모범 사례](https://docs.aws.amazon.com/prescriptive-guidance/latest/lambda-event-filtering-partial-batch-responses-for-sqs/best-practices-partial-batch-responses.html)를 검토하세요.

1. 다음 명령을 실행하여 함수의 `ReportBatchItemFailures`을 활성화합니다. 이벤트 소스 매핑의 UUID를 가져오려면 [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html) AWS CLI 명령을 실행합니다.

   ```
   aws lambda update-event-source-mapping \
   --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
   --function-response-types "ReportBatchItemFailures"
   ```

1. 함수 코드를 업데이트하여 모든 예외를 포착하고 실패한 메시지를 `batchItemFailures` JSON 응답으로 반환하세요. `batchItemFailures` 응답에는 메시지 ID 목록이 `itemIdentifier` JSON 값으로 포함되어야 합니다.

   예를 들어 메시지 ID가 `id1`, `id2`, `id3`, `id4`, `id5`인 5개의 메시지로 구성된 배치가 있다고 가정합니다. 함수가 `id1`, `id3`, `id5`를 성공적으로 처리합니다. `id2` 및 `id4` 메시지를 대기열에서 다시 볼 수 있도록 하려면 함수가 다음 응답을 리턴해야 합니다.

   ```
   { 
     "batchItemFailures": [ 
           {
               "itemIdentifier": "id2"
           },
           {
               "itemIdentifier": "id4"
           }
       ]
   }
   ```

   다음은 일괄적으로 실패한 메시지 ID 목록을 반환하는 함수 코드의 몇 가지 예입니다.

------
#### [ .NET ]

**SDK for .NET**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
.NET을 사용하여 Lambda로 SQS 배치 항목 실패 보고  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   using Amazon.Lambda.Core;
   using Amazon.Lambda.SQSEvents;
   
   // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
   [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
   namespace sqsSample;
   
   public class Function
   {
       public async Task<SQSBatchResponse> FunctionHandler(SQSEvent evnt, ILambdaContext context)
       {
           List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new List<SQSBatchResponse.BatchItemFailure>();
           foreach(var message in evnt.Records)
           {
               try
               {
                   //process your message
                   await ProcessMessageAsync(message, context);
               }
               catch (System.Exception)
               {
                   //Add failed message identifier to the batchItemFailures list
                   batchItemFailures.Add(new SQSBatchResponse.BatchItemFailure{ItemIdentifier=message.MessageId}); 
               }
           }
           return new SQSBatchResponse(batchItemFailures);
       }
   
       private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context)
       {
           if (String.IsNullOrEmpty(message.Body))
           {
               throw new Exception("No Body in SQS Message.");
           }
           context.Logger.LogInformation($"Processed message {message.Body}");
           // TODO: Do interesting work based on the new message
           await Task.CompletedTask;
       }
   }
   ```

------
#### [ Go ]

**SDK for Go V2**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Go를 사용하여 Lambda로 SQS 배치 항목 실패 보고  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package main
   
   import (
   	"context"
   	"fmt"
   	"github.com/aws/aws-lambda-go/events"
   	"github.com/aws/aws-lambda-go/lambda"
   )
   
   func handler(ctx context.Context, sqsEvent events.SQSEvent) (map[string]interface{}, error) {
   	batchItemFailures := []map[string]interface{}{}
   
   	for _, message := range sqsEvent.Records {
   		if len(message.Body) > 0 {
   			// Your message processing condition here
   			fmt.Printf("Successfully processed message: %s\n", message.Body)
   		} else {
   			// Message processing failed
   			fmt.Printf("Failed to process message %s\n", message.MessageId)
   			batchItemFailures = append(batchItemFailures, map[string]interface{}{"itemIdentifier": message.MessageId})
   		}
   	}
   
   	sqsBatchResponse := map[string]interface{}{
   		"batchItemFailures": batchItemFailures,
   	}
   	return sqsBatchResponse, nil
   }
   
   func main() {
   	lambda.Start(handler)
   }
   ```

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Java를 사용하여 Lambda로 SQS 배치 항목 실패 보고  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import com.amazonaws.services.lambda.runtime.events.SQSEvent;
   import com.amazonaws.services.lambda.runtime.events.SQSBatchResponse;
    
   import java.util.ArrayList;
   import java.util.List;
    
   public class ProcessSQSMessageBatch implements RequestHandler<SQSEvent, SQSBatchResponse> {
       @Override
       public SQSBatchResponse handleRequest(SQSEvent sqsEvent, Context context) {
            List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new ArrayList<SQSBatchResponse.BatchItemFailure>();
   
            for (SQSEvent.SQSMessage message : sqsEvent.getRecords()) {
                try {
                    //process your message
                } catch (Exception e) {
                    //Add failed message identifier to the batchItemFailures list
                    batchItemFailures.add(new SQSBatchResponse.BatchItemFailure(message.getMessageId()));
                }
            }
            return new SQSBatchResponse(batchItemFailures);
        }
   }
   ```

------
#### [ JavaScript ]

**SDK for JavaScript (v3)**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
JavaScript를 사용하여 Lambda에서 SQS 배치 항목 실패를 보고합니다.  

   ```
   // Node.js 20.x Lambda runtime, AWS SDK for Javascript V3
   export const handler = async (event, context) => {
       const batchItemFailures = [];
       for (const record of event.Records) {
           try {
               await processMessageAsync(record, context);
           } catch (error) {
               batchItemFailures.push({ itemIdentifier: record.messageId });
           }
       }
       return { batchItemFailures };
   };
   
   async function processMessageAsync(record, context) {
       if (record.body && record.body.includes("error")) {
           throw new Error("There is an error in the SQS Message.");
       }
       console.log(`Processed message: ${record.body}`);
   }
   ```
TypeScript를 사용하여 Lambda로 SQS 배치 항목 실패를 보고합니다.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import { SQSEvent, SQSBatchResponse, Context, SQSBatchItemFailure, SQSRecord } from 'aws-lambda';
   
   export const handler = async (event: SQSEvent, context: Context): Promise<SQSBatchResponse> => {
       const batchItemFailures: SQSBatchItemFailure[] = [];
   
       for (const record of event.Records) {
           try {
               await processMessageAsync(record);
           } catch (error) {
               batchItemFailures.push({ itemIdentifier: record.messageId });
           }
       }
   
       return {batchItemFailures: batchItemFailures};
   };
   
   async function processMessageAsync(record: SQSRecord): Promise<void> {
       if (record.body && record.body.includes("error")) {
           throw new Error('There is an error in the SQS Message.');
       }
       console.log(`Processed message ${record.body}`);
   }
   ```

------
#### [ PHP ]

**SDK for PHP**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
PHP를 사용하여 Lambda로 SQS 배치 항목 실패 보고  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   <?php
   
   use Bref\Context\Context;
   use Bref\Event\Sqs\SqsEvent;
   use Bref\Event\Sqs\SqsHandler;
   use Bref\Logger\StderrLogger;
   
   require __DIR__ . '/vendor/autoload.php';
   
   class Handler extends SqsHandler
   {
       private StderrLogger $logger;
       public function __construct(StderrLogger $logger)
       {
           $this->logger = $logger;
       }
   
       /**
        * @throws JsonException
        * @throws \Bref\Event\InvalidLambdaEvent
        */
       public function handleSqs(SqsEvent $event, Context $context): void
       {
           $this->logger->info("Processing SQS records");
           $records = $event->getRecords();
   
           foreach ($records as $record) {
               try {
                   // Assuming the SQS message is in JSON format
                   $message = json_decode($record->getBody(), true);
                   $this->logger->info(json_encode($message));
                   // TODO: Implement your custom processing logic here
               } catch (Exception $e) {
                   $this->logger->error($e->getMessage());
                   // failed processing the record
                   $this->markAsFailed($record);
               }
           }
           $totalRecords = count($records);
           $this->logger->info("Successfully processed $totalRecords SQS records");
       }
   }
   
   $logger = new StderrLogger();
   return new Handler($logger);
   ```

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

**SDK for Python(Boto3)**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Python을 사용하여 Lambda로 SQS 배치 항목 실패 보고  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   def lambda_handler(event, context):
       if event:
           batch_item_failures = []
           sqs_batch_response = {}
        
           for record in event["Records"]:
               try:
                   print(f"Processed message: {record['body']}")
               except Exception as e:
                   batch_item_failures.append({"itemIdentifier": record['messageId']})
           
           sqs_batch_response["batchItemFailures"] = batch_item_failures
           return sqs_batch_response
   ```

------
#### [ Ruby ]

**SDK for Ruby**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda-with-batch-item-handling) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Ruby를 사용하여 Lambda로 SQS 배치 항목 실패를 보고합니다.  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   require 'json'
   
   def lambda_handler(event:, context:)
     if event
       batch_item_failures = []
       sqs_batch_response = {}
   
       event["Records"].each do |record|
         begin
           # process message
         rescue StandardError => e
           batch_item_failures << {"itemIdentifier" => record['messageId']}
         end
       end
   
       sqs_batch_response["batchItemFailures"] = batch_item_failures
       return sqs_batch_response
     end
   end
   ```

------
#### [ Rust ]

**SDK for Rust**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Rust를 사용하여 Lambda로 SQS 배치 항목 실패를 보고합니다.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   use aws_lambda_events::{
       event::sqs::{SqsBatchResponse, SqsEvent},
       sqs::{BatchItemFailure, SqsMessage},
   };
   use lambda_runtime::{run, service_fn, Error, LambdaEvent};
   
   async fn process_record(_: &SqsMessage) -> Result<(), Error> {
       Err(Error::from("Error processing message"))
   }
   
   async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<SqsBatchResponse, Error> {
       let mut batch_item_failures = Vec::new();
       for record in event.payload.records {
           match process_record(&record).await {
               Ok(_) => (),
               Err(_) => batch_item_failures.push(BatchItemFailure {
                   item_identifier: record.message_id.unwrap(),
               }),
           }
       }
   
       Ok(SqsBatchResponse {
           batch_item_failures,
       })
   }
   
   #[tokio::main]
   async fn main() -> Result<(), Error> {
       run(service_fn(function_handler)).await
   }
   ```

------

실패한 이벤트가 대기열로 반환되지 않는 경우 AWS 지식 센터에서 [Lambda 함수 SQS ReportBatchItemFailure의 문제를 해결하려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-sqs-report-batch-item-failures/)를 참조하십시오.

### 성공 및 실패 조건
<a name="sqs-batchfailurereporting-conditions"></a>

Lambda는 함수가 다음 중 하나를 반환할 경우 배치를 완전한 성공으로 처리합니다.
+ 비어 있는 `batchItemFailures` 목록
+ null `batchItemFailures` 목록
+ 비어 있는 `EventResponse`
+ null `EventResponse`

Lambda는 함수가 다음 중 하나를 반환할 경우 배치를 완전한 실패로 처리합니다.
+ 잘못된 JSON 응답
+ 빈 문자열 `itemIdentifier`
+ null `itemIdentifier`
+ 키 이름이 잘못된 `itemIdentifier`
+ 존재하지 않는 메시지 ID가 있는 `itemIdentifier` 값

### CloudWatch 지표
<a name="sqs-batchfailurereporting-metrics"></a>

함수가 배치 항목 실패를 올바르게 보고하는지 확인하려면 Amazon CloudWatch에서 `NumberOfMessagesDeleted` 및 `ApproximateAgeOfOldestMessage` Amazon SQS 지표를 모니터링하면 됩니다.
+ `NumberOfMessagesDeleted`는 대기열에서 제거된 메시지 수를 추적합니다. 이 값이 0으로 떨어지면 함수 응답이 실패한 메시지를 올바르게 반환하지 않는다는 신호입니다.
+ `ApproximateAgeOfOldestMessage`는 가장 오래된 메시지가 대기열에 머물렀던 시간을 추적합니다. 이 지표가 급격히 증가하면 함수가 실패한 메시지를 올바르게 반환하지 않음을 나타낼 수 있습니다.

### Powertools for AWS Lambda 배치 프로세서 사용
<a name="services-sqs-batchfailurereporting-powertools"></a>

Powertools for AWS Lambda의 배치 프로세서 유틸리티는 부분 배치 응답 로직을 자동으로 처리하여 배치 실패 보고 구현에 따르는 복잡성을 줄입니다. 다음은 배치 프로세서를 사용하는 예제입니다.

**Python**  
전체 예제 및 설정 지침은 [배치 프로세서 설명서를](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) 참조하세요.
AWS Lambda 배치 프로세서를 사용하여 Amazon SQS 메시지를 처리합니다.  

```
import json
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response
from aws_lambda_powertools.utilities.data_classes import SQSEvent
from aws_lambda_powertools.utilities.typing import LambdaContext

processor = BatchProcessor(event_type=EventType.SQS)
logger = Logger()

def record_handler(record):
    logger.info(record)
    # Your business logic here
    # Raise an exception to mark this record as failed
    
def lambda_handler(event, context: LambdaContext):
    return process_partial_response(
        event=event, 
        record_handler=record_handler, 
        processor=processor,
        context=context
    )
```

**TypeScript**  
전체 예제 및 설정 지침은 [배치 프로세서 설명서를](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/) 참조하세요.
AWS Lambda 배치 프로세서를 사용하여 Amazon SQS 메시지를 처리합니다.  

```
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch';
import { Logger } from '@aws-lambda-powertools/logger';
import type { SQSEvent, Context } from 'aws-lambda';

const processor = new BatchProcessor(EventType.SQS);
const logger = new Logger();

const recordHandler = async (record: any): Promise<void> => {
    logger.info('Processing record', { record });
    // Your business logic here
    // Throw an error to mark this record as failed
};

export const handler = async (event: SQSEvent, context: Context) => {
    return processPartialResponse(event, recordHandler, processor, {
        context,
    });
};
```

# Amazon SQS 이벤트 소스 매핑을 위한 Lambda 파라미터
<a name="services-sqs-parameters"></a>

모든 Lambda 이벤트 소스 유형은 동일한 [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) 및 [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) API 작업을 공유합니다. 그러나 일부 파라미터만 Amazon SQS에 적용됩니다.


| 파라미터 | 필수 | 기본값 | 참고 | 
| --- | --- | --- | --- | 
|  BatchSize  |  N  |  10  |  표준 대기열의 경우 최댓값은 10,000입니다. FIFO 대기열의 경우 최댓값은 10입니다.  | 
|  활성  |  N  |  true  | 없음  | 
|  EventSourceArn  |  Y  | 해당 사항 없음 |  데이터 스트림 또는 스트림 소비자의 ARN  | 
|  FunctionName  |  Y  | 해당 사항 없음  | 없음  | 
|  FilterCriteria  |  N  |  해당 사항 없음   |  [Lambda가 함수로 보내는 이벤트에 대한 제어](invocation-eventfiltering.md)  | 
|  FunctionResponseTypes  |  N  | 해당 사항 없음  |  함수가 배치에서 특정 실패를 보고하도록 하려면 `FunctionResponseTypes`에 `ReportBatchItemFailures` 값을 포함하세요. 자세한 내용은 [부분 일괄 응답 구현](services-sqs-errorhandling.md#services-sqs-batchfailurereporting) 섹션을 참조하세요.  | 
|  MaximumBatchingWindowInSeconds  |  N  |  0  | FIFO 대기열에는 배치 기간이 지원되지 않습니다. | 
|  ProvisionedPollerConfig  |  N  |  해당 사항 없음  |  SQS 이벤트 소스 매핑에 대한 최소(2\$1200) 및 최대(2\$12,000) 전용 이벤트 폴러 수를 구성합니다. 각 폴러는 최대 1MB/s의 처리량과 10개의 동시 간접 호출을 처리할 수 있습니다.  | 
|  ScalingConfig  |  N  |  N/A   |  [Amazon SQS 이벤트 소스의 최대 동시성 구성](services-sqs-scaling.md#events-sqs-max-concurrency)  | 

# Amazon SQS 이벤트 소스를 통해 이벤트 필터링 사용
<a name="with-sqs-filtering"></a>

이벤트 필터링을 사용하여 Lambda가 함수로 전송하는 스트림 또는 대기열의 레코드를 제어할 수 있습니다. 이벤트 필터링의 작동 방식에 대한 일반적인 내용은 [Lambda가 함수로 보내는 이벤트에 대한 제어](invocation-eventfiltering.md)을 참조하세요.

이 섹션에서는 Amazon SQS 이벤트 소스에 대한 이벤트 필터링에 중점을 둡니다.

**참고**  
Amazon SQS 이벤트 소스 매핑은 `body` 키에 대한 필터링만 지원합니다.

**Topics**
+ [Amazon SQS 이벤트 필터링 기본 사항](#filtering-SQS)

## Amazon SQS 이벤트 필터링 기본 사항
<a name="filtering-SQS"></a>

Amazon SQS 대기열에 다음 JSON 형식의 메시지가 포함되어 있다고 가정해 보겠습니다.

```
{
    "RecordNumber": 1234,
    "TimeStamp": "yyyy-mm-ddThh:mm:ss",
    "RequestCode": "AAAA"
}
```

이 대기열에 대한 예제 레코드는 다음과 같습니다.

```
{
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "{\n "RecordNumber": 1234,\n "TimeStamp": "yyyy-mm-ddThh:mm:ss",\n "RequestCode": "AAAA"\n}",
    "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1545082649183",
        "SenderId": "AIDAIENQZJOLO23YVJ4VO",
        "ApproximateFirstReceiveTimestamp": "1545082649185"
        },
    "messageAttributes": {},
    "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
    "eventSource": "aws:sqs",
    "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue",
    "awsRegion": "us-west-2"
}
```

Amazon SQS 메시지의 콘텐츠를 기반으로 필터링하려면 Amazon SQS 메시지 레코드의 `body` 키를 사용합니다. Amazon SQS 메시지의 `RequestCode`가 'BBBB'인 레코드만 처리하려고 한다고 가정해 보겠습니다. `FilterCriteria` 객체는 다음과 같습니다.

```
{
    "Filters": [
        {
            "Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"
        }
    ]
}
```

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

```
{
    "body": {
        "RequestCode": [ "BBBB" ]
        }
}
```

콘솔, AWS CLI 또는 AWS SAM 템플릿을 사용하여 필터를 추가할 수 있습니다.

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

콘솔을 사용하여 이 필터를 추가하려면 [이벤트 소스 매핑에 필터 기준 연결(콘솔)](invocation-eventfiltering.md#filtering-console)의 지침을 따르고 **필터 기준**에 대해 다음 문자열을 입력합니다.

```
{ "body" : { "RequestCode" : [ "BBBB" ] } }
```

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

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": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'
```

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

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

------
#### [ AWS SAM ]

AWS SAM을 사용하여 이 필터를 추가하려면 이벤트 소스의 YAML 템플릿에 다음 코드 조각을 추가합니다.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RequestCode" : [ "BBBB" ] } }'
```

------

함수가 `RecordNumber`가 9,999보다 큰 레코드만 처리하도록 하려는 경우를 가정해 보겠습니다. `FilterCriteria` 객체는 다음과 같습니다.

```
{
    "Filters": [
        {
            "Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"
        }
    ]
}
```

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

```
{
    "body": {
        "RecordNumber": [
            {
                "numeric": [ ">", 9999 ]
            }
        ]
    }
}
```

콘솔, AWS CLI 또는 AWS SAM 템플릿을 사용하여 필터를 추가할 수 있습니다.

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

콘솔을 사용하여 이 필터를 추가하려면 [이벤트 소스 매핑에 필터 기준 연결(콘솔)](invocation-eventfiltering.md#filtering-console)의 지침을 따르고 **필터 기준**에 대해 다음 문자열을 입력합니다.

```
{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }
```

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

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": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
```

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

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
```

------
#### [ AWS SAM ]

AWS SAM을 사용하여 이 필터를 추가하려면 이벤트 소스의 YAML 템플릿에 다음 코드 조각을 추가합니다.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }'
```

------

Amazon SQS의 경우 메시지 본문은 임의의 문자열이 될 수 있습니다. 그러나 `FilterCriteria`에서 유효한 JSON 형식의 `body`를 기대하는 경우 문제가 될 수 있습니다. 반대 시나리오도 마찬가지입니다. 수신 메시지 본문이 JSON 형식이지만 필터 기준이 `body`를 일반 문자열로 예상하는 경우 의도하지 않은 동작이 발생할 수 있습니다.

이 문제를 방지하려면 `FilterCriteria`에서 본문의 형식이 대기열에서 수신하는 메시지의 `body`의 예상 형식과 일치하는지 확인합니다. 메시지를 필터링하기 전에 Lambda는 수신 메시지 본문의 형식과 `body`의 필터 패턴의 형식을 자동으로 평가합니다. 일치하지 않으면 Lambda는 메시지를 삭제합니다. 다음 표에는 이 평가가 요약되어 있습니다.


| 수신 메시지 `body` 형식 | 필터 패턴 `body` 형식 | 결과적 작업 | 
| --- | --- | --- | 
|  일반 문자열  |  일반 문자열  |  Lambda는 필터 기준에 따라 필터링합니다.  | 
|  일반 문자열  |  데이터 속성에 대한 필터 패턴 없음  |  Lambda는 필터 기준에 따라(다른 메타데이터 속성에만 해당) 필터링합니다.  | 
|  일반 문자열  |  유효한 JSON  |  Lambda가 메시지를 삭제합니다.  | 
|  유효한 JSON  |  일반 문자열  |  Lambda가 메시지를 삭제합니다.  | 
|  유효한 JSON  |  데이터 속성에 대한 필터 패턴 없음  |  Lambda는 필터 기준에 따라(다른 메타데이터 속성에만 해당) 필터링합니다.  | 
|  유효한 JSON  |  유효한 JSON  |  Lambda는 필터 기준에 따라 필터링합니다.  | 

# 자습서: Amazon SQS에서 Lambda 사용
<a name="with-sqs-example"></a>

이 자습서에서는 [Amazon Simple Queue Service(Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 대기열에서 메시지를 사용하는 Lambda 함수를 생성합니다. Lambda 함수는 새 메시지가 대기열에 추가될 때마다 실행됩니다. 이 함수는 메시지를 Amazon CloudWatch Logs 스트림에 기록합니다. 다음 다이어그램은 자습서를 완료하는 데 사용하는 AWS 리소스를 보여 줍니다.

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


이 자습서를 완료하려면 다음 단계를 수행하세요.

1. CloudWatch Logs에 메시지를 작성하는 Lambda 함수를 생성합니다.

1. Amazon SQS 대기열을 생성합니다.

1. Lambda 이벤트 소스 매핑을 생성합니다. 이벤트 소스 매핑은 Amazon SQS 대기열을 읽고 새 메시지가 추가되면 Lambda 함수를 간접적으로 간접 호출합니다.

1. 대기열에 메시지를 추가하고 CloudWatch Logs에서 결과를 모니터링하여 설정을 테스트합니다.

## 사전 조건
<a name="with-sqs-prepare"></a>

### AWS Command Line Interface 설치
<a name="install_aws_cli"></a>

아직 AWS Command Line Interface를 설치하지 않은 경우 [AWS CLI의 최신 버전 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)에서 설명하는 단계에 따라 설치하세요.

이 자습서에서는 명령을 실행할 셸 또는 명령줄 터미널이 필요합니다. Linux 및 macOS에서는 선호하는 셸과 패키지 관리자를 사용합니다.

**참고**  
Windows에서는 Lambda와 함께 일반적으로 사용하는 일부 Bash CLI 명령(예:`zip`)은 운영 체제의 기본 제공 터미널에서 지원되지 않습니다. Ubuntu와 Bash의 Windows 통합 버전을 가져오려면 [Linux용 Windows Subsystem을 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)합니다.

## 실행 역할 생성
<a name="with-sqs-create-execution-role"></a>

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


[실행 역할](lambda-intro-execution-role.md)은 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 Lambda 함수에 부여하는 AWS Identity and Access Management(IAM) 역할입니다. 함수가 Amazon SQS에서 항목을 읽을 수 있도록 허용하려면 **AWSLambdaSQSQueueExecutionRole** 권한 정책을 연결합니다.

**실행 역할을 생성하고 Amazon SQS 권한 정책을 연결하려면**

1. IAM 콘솔에서 [역할 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 엔터티 유형**에서 **AWS 서비스**를 선택합니다.

1. **사용 사례**에서 **Lambda**를 선택합니다.

1. **다음**을 선택합니다.

1. **권한 정책** 검색 상자에 **AWSLambdaSQSQueueExecutionRole**을 입력합니다.

1. **AWSLambdaSQSQueueExecutionRole** 정책을 선택한 후 **다음**을 선택합니다.

1. **역할 세부 정보**에서 **역할 이름**에 **lambda-sqs-role**을 입력한 다음 **역할 생성**을 선택합니다.

역할을 생성한 후에는 실행 역할의 Amazon 리소스 이름(ARN)을 기록해 둡니다. 이는 이후 단계에서 필요합니다.

## 함수 생성
<a name="with-sqs-create-function"></a>

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


Amazon SQS 메시지를 처리하는 Lambda 함수를 생성합니다. 함수 코드는 Amazon SQS 메시지 본문을 CloudWatch Logs에 로그합니다.

이 자습서에서는 Node.js 24 런타임을 사용하지만 다른 런타임 언어의 예제 코드도 제공했습니다. 다음 상자에서 탭을 선택하여 관심 있는 런타임에 대한 코드를 볼 수 있습니다. 이 단계에서 사용할 JavaScript 코드는 **JavaScript** 탭에 표시된 첫 번째 예제입니다.

------
#### [ .NET ]

**SDK for .NET**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
.NET을 사용하여 Lambda로 SQS 이벤트 사용  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
﻿using Amazon.Lambda.Core;
using Amazon.Lambda.SQSEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace SqsIntegrationSampleCode
{
    public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context)
    {
        foreach (var message in evnt.Records)
        {
            await ProcessMessageAsync(message, context);
        }

        context.Logger.LogInformation("done");
    }

    private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context)
    {
        try
        {
            context.Logger.LogInformation($"Processed message {message.Body}");

            // TODO: Do interesting work based on the new message
            await Task.CompletedTask;
        }
        catch (Exception e)
        {
            //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ.
            context.Logger.LogError($"An error occurred");
            throw;
        }

    }
}
```

------
#### [ Go ]

**SDK for Go V2**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Go를 사용하여 Lambda로 SQS 이벤트를 사용합니다.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package integration_sqs_to_lambda

import (
	"fmt"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(event events.SQSEvent) error {
	for _, record := range event.Records {
		err := processMessage(record)
		if err != nil {
			return err
		}
	}
	fmt.Println("done")
	return nil
}

func processMessage(record events.SQSMessage) error {
	fmt.Printf("Processed message %s\n", record.Body)
	// TODO: Do interesting work based on the new message
	return nil
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Java를 사용하여 Lambda로 SQS 이벤트 사용  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;

public class Function implements RequestHandler<SQSEvent, Void> {
    @Override
    public Void handleRequest(SQSEvent sqsEvent, Context context) {
        for (SQSMessage msg : sqsEvent.getRecords()) {
            processMessage(msg, context);
        }
        context.getLogger().log("done");
        return null;
    }

    private void processMessage(SQSMessage msg, Context context) {
        try {
            context.getLogger().log("Processed message " + msg.getBody());

            // TODO: Do interesting work based on the new message

        } catch (Exception e) {
            context.getLogger().log("An error occurred");
            throw e;
        }

    }
}
```

------
#### [ JavaScript ]

**SDK for JavaScript (v3)**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/blob/main/integration-sqs-to-lambda) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
JavaScript를 사용하여 Lambda로 SQS 이벤트 사용  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const message of event.Records) {
    await processMessageAsync(message);
  }
  console.info("done");
};

async function processMessageAsync(message) {
  try {
    console.log(`Processed message ${message.body}`);
    // TODO: Do interesting work based on the new message
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```
TypeScript를 사용하여 Lambda로 SQS 이벤트 사용  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { SQSEvent, Context, SQSHandler, SQSRecord } from "aws-lambda";

export const functionHandler: SQSHandler = async (
  event: SQSEvent,
  context: Context
): Promise<void> => {
  for (const message of event.Records) {
    await processMessageAsync(message);
  }
  console.info("done");
};

async function processMessageAsync(message: SQSRecord): Promise<any> {
  try {
    console.log(`Processed message ${message.body}`);
    // TODO: Do interesting work based on the new message
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```

------
#### [ PHP ]

**SDK for PHP**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
PHP를 사용하여 Lambda로 SQS 이벤트를 사용합니다.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\InvalidLambdaEvent;
use Bref\Event\Sqs\SqsEvent;
use Bref\Event\Sqs\SqsHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler extends SqsHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws InvalidLambdaEvent
     */
    public function handleSqs(SqsEvent $event, Context $context): void
    {
        foreach ($event->getRecords() as $record) {
            $body = $record->getBody();
            // TODO: Do interesting work based on the new message
        }
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

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

**SDK for Python(Boto3)**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Python을 사용하여 Lambda로 SQS 이벤트를 사용합니다.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event, context):
    for message in event['Records']:
        process_message(message)
    print("done")

def process_message(message):
    try:
        print(f"Processed message {message['body']}")
        # TODO: Do interesting work based on the new message
    except Exception as err:
        print("An error occurred")
        raise err
```

------
#### [ Ruby ]

**SDK for Ruby**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Ruby를 사용하여 Lambda로 SQS 이벤트를 사용합니다.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event:, context:)
  event['Records'].each do |message|
    process_message(message)
  end
  puts "done"
end

def process_message(message)
  begin
    puts "Processed message #{message['body']}"
    # TODO: Do interesting work based on the new message
  rescue StandardError => err
    puts "An error occurred"
    raise err
  end
end
```

------
#### [ Rust ]

**SDK for Rust**  
 GitHub에 더 많은 내용이 있습니다. [서버리스 예제](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda) 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.
Rust를 사용하여 Lambda로 SQS 이벤트를 사용합니다.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::sqs::SqsEvent;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<(), Error> {
    event.payload.records.iter().for_each(|record| {
        // process the record
        tracing::info!("Message body: {}", record.body.as_deref().unwrap_or_default())
    });

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**Node.js Lambda 함수를 생성하려면**

1. 프로젝트에 대한 디렉터리를 생성하고 해당 디렉터리로 전환합니다.

   ```
   mkdir sqs-tutorial
   cd sqs-tutorial
   ```

1. 샘플 JavaScript 코드를 새로운 `index.js` 파일에 복사합니다.

1. 다음 `zip` 명령을 사용하여 배포 패키지를 생성합니다.

   ```
   zip function.zip index.js
   ```

1. [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) AWS CLI 명령을 사용하여 Lambda 함수를 생성합니다. `role` 파라미터에 앞서 생성한 실행 역할의 ARN을 입력합니다.
**참고**  
Lambda 함수와 Amazon SQS 대기열은 같은 AWS 리전에 있어야 합니다.

   ```
   aws lambda create-function --function-name ProcessSQSRecord \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/lambda-sqs-role
   ```

## 함수 테스트
<a name="with-sqs-create-test-function"></a>

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


`invoke` AWS CLI 명령 및 샘플 Amazon SQS 이벤트를 사용하여 Lambda 함수를 수동으로 간접 호출합니다.

**샘플 이벤트를 사용하여 Lambda 함수를 간접적으로 간접 호출하려면**

1. 다음 JSON을 `input.json`라는 파일로 저장합니다. 이 JSON은 Amazon SQS가 `"body"`에 대기열의 실제 메시지를 포함하는 Lambda 함수로 보낼 수 있는 이벤트를 시뮬레이션합니다. 이 예제에서 메시지는 `"test"`입니다.  
**Example Amazon SQS 이벤트**  

   이는 테스트 이벤트이므로 메시지나 계정 번호를 변경할 필요가 없습니다.

   ```
   {
       "Records": [
           {
               "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
               "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
               "body": "test",
               "attributes": {
                   "ApproximateReceiveCount": "1",
                   "SentTimestamp": "1545082649183",
                   "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                   "ApproximateFirstReceiveTimestamp": "1545082649185"
               },
               "messageAttributes": {},
               "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
               "eventSource": "aws:sqs",
               "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:my-queue",
               "awsRegion": "us-east-1"
           }
       ]
   }
   ```

1. 다음 AWS CLI [간접 호출](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html) 명령을 실행합니다. 이 명령은 응답으로 CloudWatch 로그를 반환합니다. 로그 검색에 대한 자세한 내용은 [AWS CLI를 사용한 로그 액세스](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-cli) 단원을 참조하십시오.

   ```
   aws lambda invoke --function-name ProcessSQSRecord --payload file://input.json 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에서 참조하세요.

1. 응답에서 `INFO` 로그를 찾습니다. 여기에 Lambda 함수가 메시지 본문을 기록합니다. 다음과 유사한 로그가 표시되어야 합니다.

   ```
   2023-09-11T22:45:04.271Z	348529ce-2211-4222-9099-59d07d837b60	INFO	Processed message test
   2023-09-11T22:45:04.288Z	348529ce-2211-4222-9099-59d07d837b60	INFO	done
   ```

## Amazon SQS 대기열 생성
<a name="with-sqs-configure-sqs"></a>

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


Lambda 함수가 이벤트 소스로 사용할 수 있는 Amazon SQS 대기열을 생성합니다. Lambda 함수와 Amazon SQS 대기열은 같은 AWS 리전에 있어야 합니다.

**대기열 생성**

1. [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs)을 엽니다.

1. **Create queue**(대기열 생성)를 선택합니다.

1. 대기열의 이름을 입력합니다. 다른 모든 옵션은 기본 설정으로 둡니다.

1. **대기열 생성**을 선택합니다.

대기열을 생성한 후 해당 ARN을 기록해 둡니다. 다음 단계에서 대기열을 Lambda 함수와 연결할 때 필요합니다.

## 이벤트 소스 구성
<a name="with-sqs-attach-notification-configuration"></a>

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


[이벤트 소스 매핑](invocation-eventsourcemapping.md)을 생성하여 Amazon SQS 대기열을 Lambda 함수에 연결합니다. 이벤트 소스 매핑은 Amazon SQS 대기열을 읽고 새 메시지가 추가되면 Lambda 함수를 간접적으로 간접 호출합니다.

Amazon SQS 대기열과 Lambda 함수 간에 매핑을 생성하려면 AWS CLI [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html) 명령을 사용합니다. 예제:

```
aws lambda create-event-source-mapping --function-name ProcessSQSRecord  --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:111122223333:my-queue
```

이벤트 소스 매핑 목록을 가져오려면 [list-event-source-mappings](https://awscli.amazonaws.com/v2/documentation/api/2.1.29/reference/lambda/list-event-source-mappings.html) 명령을 사용합니다. 예제:

```
aws lambda list-event-source-mappings --function-name ProcessSQSRecord
```

## 테스트 메시지 보내기
<a name="with-sqs-test-message"></a>

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


**Amazon SQS 메시지를 Lambda 함수로 보내려면**

1. [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs)을 엽니다.

1. 이전에 생성한 대기열을 선택합니다.

1. [**메시지 전송 및 수신(Send and receive messages)**]을 선택합니다.

1. **메시지 본문**에 테스트 메시지(예: “이것은 테스트 메시지입니다.”)를 입력합니다.

1. **메시지 전송**을 선택합니다.

Lambda는 업데이트를 위해 대기열을 폴링합니다. 새 메시지가 있는 경우 Lambda는 대기열에서 이 새 이벤트 데이터를 사용하여 함수를 간접 호출합니다. 함수 핸들러가 예외 없이 반환되면 Lambda는 메시지가 성공적으로 처리된 것으로 간주하고 대기열의 새 메시지 읽기를 시작합니다. 메시지를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 자동으로 삭제합니다. 핸들러가 예외를 발생시키면 Lambda는 메시지 배치가 성공적으로 처리되지 않은 것으로 간주하고 Lambda는 동일한 메시지 배치로 함수를 간접 호출합니다.

## CloudWatch Logs 확인
<a name="with-sqs-check-logs"></a>

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


**함수가 메시지를 처리했는지 확인하려면**

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

1. **ProcessSQSRecord** 함수를 선택합니다.

1. **모니터(Monitor)**를 선택합니다.

1. **CloudWatch 로그 보기**를 선택합니다.

1. CloudWatch 콘솔에서 함수의 **로그 스트림**을 선택합니다.

1. `INFO` 로그를 찾습니다. 여기에 Lambda 함수가 메시지 본문을 기록합니다. Amazon SQS 대기열을 통해 보낸 메시지가 표시됩니다. 예제:

   ```
   2023-09-11T22:49:12.730Z b0c41e9c-0556-5a8b-af83-43e59efeec71 INFO Processed message this is a test message.
   ```

## 리소스 정리
<a name="cleanup"></a>

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

**집행 역할 삭제**

1. IAM 콘솔에서 [역할 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. 생성한 실행 역할을 선택합니다.

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

1. 텍스트 입력 필드에 역할의 이름을 입력하고 **Delete**(삭제)를 선택합니다.

**Lambda 함수를 삭제하려면**

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

1. 생성한 함수를 선택합니다.

1. **작업**, **삭제**를 선택합니다.

1. 텍스트 입력 필드에 **confirm**를 입력하고 **Delete**(삭제)를 선택합니다.

**Amazon SQS 대기열을 삭제하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/)에서 Amazon SQS 콘솔을 엽니다.

1. 생성한 대기열을 선택합니다.

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

1. 텍스트 입력 필드에 **confirm**을 입력합니다.

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

# 자습서: 교차 계정 Amazon SQS 대기열을 이벤트 소스로 사용
<a name="with-sqs-cross-account-example"></a>

이 자습서에서는 다른 AWS 계정의 Amazon Simple Queue Service(Amazon SQS) 대기열에서 메시지를 사용하는 Lambda 함수를 생성합니다. 이 자습서에는 2개의 AWS 계정, 즉 Lambda 함수가 포함된 계정을 나타내는 **계정 A**와 Amazon SQS 대기열이 포함된 계정을 나타내는 **계정 B**가 사용됩니다.

## 사전 조건
<a name="with-sqs-cross-account-prepare"></a>

### AWS Command Line Interface 설치
<a name="install_aws_cli"></a>

아직 AWS Command Line Interface를 설치하지 않은 경우 [AWS CLI의 최신 버전 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)에서 설명하는 단계에 따라 설치하세요.

이 자습서에서는 명령을 실행할 셸 또는 명령줄 터미널이 필요합니다. Linux 및 macOS에서는 선호하는 셸과 패키지 관리자를 사용합니다.

**참고**  
Windows에서는 Lambda와 함께 일반적으로 사용하는 일부 Bash CLI 명령(예:`zip`)은 운영 체제의 기본 제공 터미널에서 지원되지 않습니다. Ubuntu와 Bash의 Windows 통합 버전을 가져오려면 [Linux용 Windows Subsystem을 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)합니다.

## 실행 역할 생성(계정 A)
<a name="with-sqs-cross-account-create-execution-role"></a>

**계정 A**에서 필요한 AWS 리소스에 액세스하는 함수 권한을 부여하는 [실행 역할](lambda-intro-execution-role.md)을 만듭니다.

**실행 역할을 만들려면**

1. AWS Identity and Access Management(IAM) 콘솔에서 [역할(Roles) 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. **역할 생성**을 선택합니다.

1. 다음 속성을 사용하여 역할을 만듭니다.
   + **신뢰할 수 있는 엔터티** – **AWS Lambda**
   + **권한** – **AWSLambdaSQSQueueExecutionRole**
   + **역할 이름** – **cross-account-lambda-sqs-role**

**AWSLambdaSQSQueueExecutionRole** 정책은 함수가 Amazon SQS에서 항목을 읽고 Amazon CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다.

## 함수 생성(계정 A)
<a name="with-sqs-cross-account-create-function"></a>

**계정 A**에서 Amazon SQS 메시지를 처리하는 Lambda 함수를 생성합니다. Lambda 함수와 Amazon SQS 대기열은 같은 AWS 리전에 있어야 합니다.

다음 Node.js 코드 예는 각 메시지를 CloudWatch Logs의 로그에 기록합니다.

**Example index.mjs**  

```
export const handler = async function(event, context) {
  event.Records.forEach(record => {
    const { body } = record;
    console.log(body);
  });
  return {};
}
```

**함수를 만들려면**
**참고**  
다음 단계에 따라 Node.js 함수를 생성합니다. 다른 언어의 경우 단계는 비슷하지만 일부 세부 사항은 다릅니다.

1. 예제 코드를 `index.mjs`라는 파일로 저장합니다.

1. 배포 패키지를 만듭니다.

   ```
   zip function.zip index.mjs
   ```

1. `create-function` AWS Command Line Interface(AWS CLI) 명령을 사용하여 함수를 만듭니다. `arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role`을 이전에 생성한 실행 역할의 ARN으로 변경합니다.

   ```
   aws lambda create-function --function-name CrossAccountSQSExample \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role
   ```

## 함수 테스트(계정 A)
<a name="with-sqs-cross-account-create-test-function"></a>

**계정 A**에서 `invoke` AWS CLI 명령 및 샘플 Amazon SQS 이벤트를 사용하여 Lambda 함수를 수동으로 테스트합니다.

핸들러가 예외 없이 정상적으로 반환되면 Lambda는 메시지가 성공적으로 처리된 것으로 간주하고 대기열의 새 메시지 읽기를 시작합니다. 메시지를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 자동으로 삭제합니다. 핸들러가 예외를 발생시키면 Lambda는 메시지 배치가 성공적으로 처리되지 않은 것으로 간주하고 Lambda는 동일한 메시지 배치로 함수를 간접 호출합니다.

1. 다음 JSON을 `input.txt`라는 파일로 저장합니다.

   ```
   {
       "Records": [
           {
               "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
               "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
               "body": "test",
               "attributes": {
                   "ApproximateReceiveCount": "1",
                   "SentTimestamp": "1545082649183",
                   "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                   "ApproximateFirstReceiveTimestamp": "1545082649185"
               },
               "messageAttributes": {},
               "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
               "eventSource": "aws:sqs",
               "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:example-queue",
               "awsRegion": "us-east-1"
           }
       ]
   }
   ```

   앞의 JSON은 Amazon SQS가 `"body"`에 대기열의 실제 메시지를 포함하는 Lambda 함수로 보낼 수 있는 이벤트를 시뮬레이션합니다.

1. 다음 `invoke` AWS CLI 명령을 실행합니다.

   ```
   aws lambda invoke --function-name CrossAccountSQSExample \
   --cli-binary-format raw-in-base64-out \
   --payload file://input.txt outputfile.txt
   ```

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

1. `outputfile.txt` 파일의 출력을 확인합니다.

## Amazon SQS 대기열 생성(계정 B)
<a name="with-sqs-cross-account-configure-sqs"></a>

**계정 B**에서 **계정 A**의 Lambda 함수가 이벤트 소스로 사용할 수 있는 Amazon SQS 대기열을 생성합니다. Lambda 함수와 Amazon SQS 대기열은 같은 AWS 리전에 있어야 합니다.

**대기열 생성**

1. [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs)을 엽니다.

1. **Create queue**(대기열 생성)를 선택합니다.

1. 다음 속성을 사용하여 대기열을 만듭니다.
   + **Type** – **Standard**
   + **Name** – **LambdaCrossAccountQueue**
   + **Configuration** - 기본 설정을 유지합니다.
   + **Access policy** – **Advanced**를 선택합니다. 다음 JSON 정책을 붙여 넣습니다. 다음 값을 교체합니다.
     + `111122223333`: **계정 A**의 AWS 계정 ID
     + `444455556666`: **계정 B**의 AWS 계정 ID

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Id": "Queue1_Policy_UUID",
         "Statement": [
             {
                 "Sid": "Queue1_AllActions",
                 "Effect": "Allow",
                 "Principal": {
                     "AWS": [
                         "arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role"
                     ]
                 },
                 "Action": "sqs:*",
                 "Resource": "arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue"
             }
         ]
     }
     ```

------

     이 정책은 이 Amazon SQS 대기열에서 발생하는 메시지를 사용할 수 있는 **계정 A** 권한에 Lambda 실행 역할을 부여합니다.

1. 대기열을 만든 후 대기열의 Amazon 리소스 이름(ARN)을 기록합니다. 다음 단계에서 대기열을 Lambda 함수와 연결할 때 필요합니다.

## 이벤트 소스 구성(계정 A)
<a name="with-sqs-cross-account-event-source"></a>

다음 `create-event-source-mapping` AWS CLI 명령을 실행하여, **계정 A**에서 **계정 B**의 Amazon SQS 대기열 간에 이벤트 소스 매핑과 Lambda 함수를 생성합니다. `arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue`을 이전 단계에서 생성한 Amazon SQS 대기열의 ARN으로 변경합니다.

```
aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
```

이벤트 소스 매핑 목록을 가져오려면 다음 명령을 실행합니다.

```
aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
```

## 설정 테스트
<a name="with-sqs-final-integration-test-no-iam"></a>

이제 다음과 같이 설정을 테스트할 수 있습니다.

1. **계정 B**에서 [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs)을 엽니다.

1. 앞서 생성한 **LambdaCrossAccountQueue**를 선택합니다.

1. [**메시지 전송 및 수신(Send and receive messages)**]을 선택합니다.

1. **메시지 본문** 아래에 테스트 메시지를 입력합니다.

1. **메시지 전송**을 선택합니다.

**계정 A**의 Lambda 함수가 이 메시지를 수신해야 합니다. Lambda는 계속해서 업데이트를 위해 대기열을 폴링합니다. 새 메시지가 있는 경우 Lambda는 대기열에서 이 새 이벤트 데이터를 사용하여 함수를 간접 호출합니다. 함수는 Amazon CloudWatch에서 로그를 실행하고 생성합니다. [CloudWatch 콘솔](https://console.aws.amazon.com/cloudwatch)에서 로그를 확인할 수 있습니다.

## 리소스 정리
<a name="cleanup"></a>

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

**계정 A**에서 실행 역할 및 Lambda 함수를 정리합니다.

**집행 역할 삭제**

1. IAM 콘솔에서 [역할 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. 생성한 실행 역할을 선택합니다.

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

1. 텍스트 입력 필드에 역할의 이름을 입력하고 **Delete**(삭제)를 선택합니다.

**Lambda 함수를 삭제하려면**

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

1. 생성한 함수를 선택합니다.

1. **작업**, **삭제**를 선택합니다.

1. 텍스트 입력 필드에 **confirm**를 입력하고 **Delete**(삭제)를 선택합니다.

**계정 B**에서 Amazon SQS 대기열을 정리합니다.

**Amazon SQS 대기열을 삭제하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/)에서 Amazon SQS 콘솔을 엽니다.

1. 생성한 대기열을 선택합니다.

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

1. 텍스트 입력 필드에 **confirm**을 입력합니다.

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