Amazon Kinesis Data Streams을 처리하기 위해 이벤트 소스로 AWS Lambda를 Amazon Kinesis 데이터 스트림과 통합했지만 함수가 호출되지 않습니다.
간략한 설명
Lambda 함수 오류의 일반적인 원인은 다음과 같습니다.
- Lambda 함수의 실행 역할에 권한이 충분하지 않음
- Kinesis 데이터 스트림에 들어오는 데이터 없음
- Kinesis 데이터 스트림, Lambda 함수 또는 Lambda 실행 역할의 재생성으로 인해 발생된 비활성 이벤트 소스 매핑
- 최대 실행 시간을 초과하여 Lambda 함수에서 시간 초과 오류를 일으키는 Lambda 함수
- Lambda가 동시 실행 제한을 위반
Lambda 함수 오류가 발생하면 함수가 호출되지 않습니다. 또한 이 함수는 배치의 레코드도 처리하지 않습니다. 오류가 발생하면 Lambda는 프로세스가 성공하거나 배치가 만료될 때까지 레코드 배치를 다시 시도할 수 있습니다. Lambda 함수 및 Kinesis 오류에 대한 자세한 내용은 Amazon Kinesis에서 AWS Lambda 사용을 참고하세요.
해결 방법
Lambda 함수 문제 해결
Lambda 함수가 호출되지 않는 이유를 확인하려면 다음 단계를 완료하세요.
-
Lambda 함수에 대해 Sum으로 설정된 통계가 있는 Amazon CloudWatch의 Invocations 지표를 확인합니다. Invocations 지표는 Lambda 함수가 호출되었는지 확인하는 데 도움이 될 수 있습니다.
-
IteratorAge 지표를 확인하여 배치의 마지막 레코드가 얼마나 오래되었는지 또는 프로세스가 언제 완료되었는지 확인하세요. Lambda 소비자가 호출할 수 없는 경우 스트림의 이터레이터 수명이 증가합니다.
-
Lambda 함수의 CloudWatch 로그를 확인하세요. 로그는 이름에 .../aws/lambda/function_name 형식을 사용합니다. 함수 오류에 해당하는 항목을 찾습니다. 예를 들어, Lambda의 AWS Identity and Access Management(AWS IAM) 역할 권한으로 인해 오류가 발생하는 경우, IAM 역할 정책을 수정하세요.
-
IAM 역할에 CloudWatch에 액세스할 수 있는 적절한 권한이 있는지 확인하세요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
-
(선택 사항) 권한 오류가 발생하는 경우 Lambda 함수 정책을 업데이트하고 Kinesis Data Streams에 대한 액세스 권한을 부여하세요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kinesis:DescribeStream",
"kinesis:DescribeStreamSummary",
"kinesis:GetRecords",
"kinesis:GetShardIterator",
"kinesis:ListShards",
"kinesis:ListStreams",
"kinesis:SubscribeToShard",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
참고: AWSLambdaKinesisExecutionRole 정책에는 이러한 권한이 포함되어 있습니다.
추가 문제 해결
추가 문제 해결을 수행하려면 다음 작업을 완료합니다.
Lambda 실행 함수 시간 초과
오류가 Lambda 실행 함수 시간 초과와 관련된 경우 더 빠른 처리를 위해 시간 초과 값을 늘리세요.
AWS KMS 암호화된 데이터 스트림
AWS Key Management Service(AWS KMS)를 사용하여 Kinesis 데이터 스트림을 암호화하는 경우 소비자와 생산자에게 적절한 액세스 권한이 있어야 합니다. Kinesis 데이터 스트림은 암호화 및 암호 해독에 사용되는 AWS KMS 키에 액세스할 수 있어야 합니다. 또한 Lambda 함수의 실행 역할은 Kinesis 데이터 스트림에서 데이터를 성공적으로 읽으려면 KMS 키에 대한 읽기 액세스 권한이 있어야 합니다.
내부 Lambda 함수 오류
내부 Lambda 함수 오류로 인해 오류가 발생한 경우 스트림 처리에 문제가 있는 것입니다. 컨트롤 플레인 API 스로틀링을 방지하려면 각 스트림을 4~5개의 이벤트 소스 매핑으로 제한하세요. 이러한 제한은 동일한 데이터 스트림에 너무 많은 이벤트 소스 매핑을 방지하는 데 도움이 됩니다. 동일한 스트림을 사용하는 이벤트 소스 매핑이 여러 개 있으면 Kinesis 및 Amazon DynamoDB 제어 영역 제한을 위반하게 될 수 있습니다.
연결 시간 초과 오류
연결 시간 초과 오류가 발생하면 코드에서 API 직접 호출 전후에 로깅 문을 추가하세요. 그런 다음 함수가 실패하기 시작하는 정확한 코드 줄을 식별하세요.
느리거나 지연된 샤드
느리거나 지연된 샤드가 있는 경우, 더 작은 배치 크기로 재시도하도록 이벤트 소스 매핑을 구성하세요. 재시도 횟수를 제한하거나 오래된 레코드를 삭제할 수도 있습니다.
“메모리 사용” 오류
CloudWatch 로그에 "메모리 사용됨" 오류 메시지가 표시되면 Lambda 함수의 메모리를 늘리세요.
최대 시간 초과됨
Lambda 함수의 최대 시간 초과를 초과한 경우 클라이언트 라이브러리 및 클라이언트 시간 초과를 수정하세요. Lambda 컨테이너의 남은 시간을 기준으로 시간 초과 세션을 수정하려면 context.GetRemainingTimeInMillis 함수를 사용합니다. context.GetRemainingTimeInMillis 함수는 시간 초과가 발생하기 전까지 Lambda 컨테이너에 남은 시간을 반환합니다.
Lambda 함수 코드 오류
Lambda 함수의 코드에서 오류가 발생하면 Lambda 함수가 동일한 레코드를 시도하다가 멈출 수 있습니다. try-catch 블록을 사용하여 실패한 데이터를 포착하세요. 그런 다음 Amazon Simple Queue Service(Amazon SQS) 대기열 또는 Amazon Simple Notification Service(Amazon SNS) 토픽을 사용하여 이를 기록합니다. 실패한 요청을 별도로 재시도하는 처리 로직이 포함된 람다 트리거를 Amazon SQS 대기열에 추가할 수도 있습니다.
SQS DLQ
Lambda 함수를 수동으로 호출하기 위해 Amazon Dead Letter Queue(DLQ)를 설정합니다. Lambda 함수를 만들거나 업데이트할 때 DeadLetterConfig 속성을 구성하세요. DLQ의 TargetArn로 Amazon SQS 대기열 또는 Amazon SNS 토픽을 제공할 수 있습니다. 그러면 표준 재시도 정책이 모두 소진된 후 Lambda가 이벤트 개체를 쓰고 지정된 엔드포인트에 Lambda 함수를 호출합니다.
X-Ray를 사용한 Lambda
Lambda와 AWS X-Ray를 사용하여 Lambda 애플리케이션의 성능 문제를 탐지, 분석 및 최적화합니다. X-Ray는 Lambda 서비스에서 메타데이터를 수집하고 Lambda 애플리케이션의 성능에 영향을 미치는 문제를 나타내는 그래프를 생성합니다. 예를 들어, 실행하는 데 시간이 오래 걸리는 호출이 있는 경우 AWS X-Ray를 사용하여 문제를 확인할 수 있습니다