Amazon Simple Queue Service(Amazon SQS) 대기열의 메시지를 처리하도록 AWS Lambda 함수를 구성했습니다. 그러나 Lambda 함수가 호출되지 않고 대기열에 있는 메시지를 처리하지 않습니다.
해결 방법
전제 조건
- Lambda 함수가 Amazon SQS를 이벤트 소스로 사용하여 구성되어 있는지 확인합니다.
- Lambda 함수의 AWS Identity and Access Management(IAM) 역할에 SQS 대기열에서 메시지를 가져오는 데 필요한 권한이 있는지 확인합니다.
- 간접 호출 및 SQS 대기열에 대한 함수의 Amazon CloudWatch 지표를 확인하여 대기열에 사용 가능한 메시지가 있는지 확인하세요. 메시지가 보이지 않거나 SQS 대기열로 전송되지 않는 경우 프로듀서에게 필요한 권한이 있는지 확인하세요. 사용자 또는 역할에는 다음과 같은 Amazon SQS 및 AWS Key Management Service(AWS KMS) 권한이 있어야 합니다.
sqs:SendMessage
kms:GenerateDataKey
kms:Decrypt
**참고:**대기열이 암호화되지 않은 경우 AWS KMS 권한이 필요하지 않습니다.
Lambda 함수와 SQS 대기열 URL이 올바른지 확인
Lambda 함수의 이벤트 소스 매핑에 있는 Lambda 함수 Amazon 리소스 이름(ARN) 및 SQS 대기열 URL이 올바른지 확인합니다. 또한 이벤트 소스 매핑을 켜세요.
- Lambda 콘솔을 엽니다.
- 탐색 창에서 함수를 선택합니다.
- 확인하려는 함수를 선택합니다.
- SQS 트리거를 선택하고 확장하여 SQS 대기열 URL이 올바른지 확인합니다. 또한 트리거 상태가 켜져 있는지 확인합니다. 자세한 내용을 보려면 Lambda Amazon SQS 트리거가 비활성화된 이유는 무엇인가요?를 참조하세요.
이러한 검사를 수행하기 위해 list-event-source-mapping 명령을 실행할 수도 있습니다.
예시:
aws lambda list-event-source-mappings --function-name <my-function> --region <region-name>
참고: 대체 **<my-function>**을(를) Lambda 함수 이름으로 바꾸고 **<region name>**을(를) 해당 AWS 리전으로 바꾸세요.
Lambda 함수 권한 확인
Lambda IAM 역할에 SQS 대기열의 메시지를 폴링할 권한이 있는 경우 SQS 대기열의 액세스 정책을 확인하세요. Lambda 함수를 제한할 수 있는 거부 규칙을 찾아보세요.
- Amazon SQS 콘솔을 엽니다.
- 탐색 창에서 대기열을 선택합니다.
- SQS 대기열을 선택한 다음 액세스 정책 탭을 선택합니다.
- 정책을 검토하여 Lambda 트래픽을 차단할 수 있는 거부 정책이 있는지 확인하세요. 트래픽을 차단하는 정책이 있는 경우 거부 명령문에 Lambda에서 들어오는 요청을 무시하는 조건을 추가하세요.
Lambda 함수 IAM에는 다음과 같은 권한이 있어야 합니다.
- DeleteMessage
- GetQueueAttributes
- ReceiveMessage
대기열의 암호화 설정을 확인합니다.
대기열이 암호화된 경우 Lambda 함수의 IAM 역할에 AWS KMS 작업을 수행할 권한이 필요합니다. 필요한 권한이 없으면 Lambda 함수는 SQS 대기열의 메시지를 사용할 수 없습니다. Amazon SQS 대기열이 AWS KMS 암호화로 구성된 경우 다음 작업을 완료하세요.
- AWS KMS 키가 존재하는지 확인하세요.
- Lambda 함수 역할에 kms:Decrypt permissions가 있는지 확인하세요.
- AWS KMS 키 정책 권한이 Lambda 역할의 작업을 허용하도록 구성되어 있는지 확인하세요.
**참고:**기본 키(Amazon SQS의 경우 AWS KMS 키)를 사용하는 Amazon SQS 대기열은 다른 AWS 계정에서 Lambda 함수를 간접 호출할 수 없습니다.
특정 Lambda 함수가 병목 현상이 발생하는지 확인
Lambda에는 리전 동시 실행 제한이 있습니다. AWS 리전의 다른 함수에서 이 용량을 최대로 사용할 경우 함수에서 스로틀이 발생할 수 있습니다. 이는 함수 자체가 최대 용량에 도달하지 않더라도 발생할 수 있습니다.
함수에서 예약된 동시성을 0으로 설정하면 함수에서 간접 호출이 발생하지 않습니다. Amazon SQS의 모든 메시지는 병목 현상이 발생합니다. Amazon CloudWatch에서 리전의 ConcurrentExecutions(최대) 지표와 함수의 스로틀(SUM) 지표를 확인하세요. 리전 용량이 가득 찼는지, 기능이 스로틀되었는지 확인합니다. 함수를 간접 호출하고 SQS 메시지를 처리하기에 충분한 용량이 있는지 확인하세요.
동일한 SQS 대기열에 다른 활성 소비자가 없는지 확인
SQS 대기열에 활성 고객이 한 명 이상인 경우 해당 고객이 메시지를 소비할 수 있습니다. SQS 메시지는 한 고객이 한 번에 메시지를 사용하도록 설계되었습니다. 다른 고객이 SQS 대기열을 사용하는 경우 Lambda 함수가 SQS 대기열을 폴링할 때 메시지를 받지 못할 수 있습니다. Amazon SQS 콘솔을 사용하여 활성 상태인 다른 Lambda 간접 호출이나 Amazon SQS 간접 호출이 없는지 확인하세요.
참고: 다른 고객은 프로그래밍 방식으로 SQS 대기열에서 메시지를 가져올 수 있습니다. 이러한 가져오기는 콘솔에 나타나지 않습니다.
SQS 이벤트 소스가 필터로 구성되어 있는지 확인
SQS 이벤트 소스에 필터가 구성되어 있는지 확인합니다. SQS 이벤트 소스가 필터로 구성된 경우 Amazon SQS 메시지를 필터링하지 않도록 하세요.
- Lambda 콘솔을 엽니다.
- 탐색 창에서 함수를 선택합니다.
- 확인하려는 함수를 선택합니다.
- SQS 트리거를 선택한 다음 필터 기준을 확인합니다. 트리거 구성에 키 이름이 표시되지 않으면 필터가 구성되지 않은 것입니다. 필터 기준이 구성된 경우 필터를 검토하여 Lambda가 유효한 메시지를 처리할 수 있는지 확인하세요. 필터 기준을 일시적으로 제거하려면 편집을 선택합니다.
- 필터를 제거한 후 함수가 호출되면 사용 사례에 맞게 필터 기준을 수정합니다.
자세한 내용을 보려면 Amazon SQS를 사용한 필터링 및 Lambda 이벤트 필터링 구현 모범 사례를 참조하세요.
관련 정보
Amazon SQS에서 Lambda 사용
Amazon SQS 이벤트 소스가 포함된 Lambda 함수가 최적으로 조정되지 않는 이유는 무엇인가요?
Lambda 함수가 유효한 Amazon SQS 메시지를 재시도하여 DLQ(Dead Letter Queue)에 배치하는 이유는 무엇인가요?