Lambda 비동기 호출 레코드 캡처
Lambda는 비동기 호출 레코드를 다음 중 하나로 전송할 수 있습니다. AWS 서비스
-
Amazon SQS - 표준 SQS 대기열
-
Amazon SNS - 표준 SNS 주제
-
Amazon S3 - Amazon S3 버킷(실패한 경우에만)
-
AWS Lambda - Lambda 함수
-
Amazon EventBridge - EventBridge 이벤트 버스
호출 레코드에는 JSON 형식의 요청 및 응답에 대한 세부 정보가 포함되어 있습니다. 처리에 성공한 이벤트와 모든 처리 시도에서 실패한 이벤트에 대해 별도의 대상을 구성할 수 있습니다. 또는 삭제된 이벤트에 대해 표준 Amazon SQS 대기열 또는 표준 Amazon SNS 주제를 배달 못한 편지 대기열로 구성할 수 있습니다. 배달 못한 편지 대기열의 경우 Lambda는 응답에 대한 세부 정보 없이 이벤트의 콘텐츠만 전송합니다.
Lambda에서 구성한 대상으로 레코드를 전송할 수 없는 경우 Amazon CloudWatch로 DestinationDeliveryFailures
지표를 전송합니다. 이는 구성에 Amazon SQS FIFO 대기열 또는 Amazon SNS FIFO 주제와 같이 지원되지 않는 대상 유형이 포함된 경우 발생할 수 있습니다. 전송 오류는 권한 오류 및 크기 제한으로 인해 발생할 수도 있습니다. Lambda 호출 지표에 대한 자세한 내용은 호출 지표의 내용을 참조하세요.
참고
함수가 트리거되지 않도록 함수에 예약된 동시성을 0으로 설정할 수 있습니다. 비동기적으로 간접 호출된 함수에 대해 예약된 동시성을 0으로 설정하면 Lambda는 모든 이벤트를 구성된 DLQ(Dead Letter Queue) 또는 실패 시 이벤트 대상으로 새 이벤트를 보내기 시작합니다. 예약된 동시성이 0으로 설정된 상태에서 전송된 이벤트를 처리하려면 DLQ(Dead Letter Queue) 대기열 또는 실패 시 이벤트 대상에서 이벤트를 반드시 사용해야 합니다.
대상 추가
비동기 호출 레코드를 유지하려면 함수에 대상을 추가합니다. 성공한 또는 실패한 간접 호출을 대상으로 전송하도록 선택할 수 있습니다. 각 함수에는 여러 대상이 있을 수 있으므로 성공 및 실패한 이벤트에 대해 별도의 대상을 구성할 수 있습니다. 대상으로 전송되는 각 레코드는 간접 호출에 대한 세부 정보가 포함된 JSON 문서입니다. 오류 처리 설정과 마찬가지로 함수, 함수의 버전 또는 별칭에 대상을 구성할 수 있습니다.
작은 정보
Amazon Kinesis, Amazon DynamoDB, 자체 관리형 Apache Kafka 및 Amazon MSK와 같은 이벤트 소스 매핑 유형에 대해 실패한 간접 호출 기록을 유지할 수도 있습니다.
다음 표는 비동기 호출 레코드를 위해 지원되는 대상을 나열합니다. Lambda가 선택한 목적지로 레코드를 성공적으로 전송하려면 함수의 실행 역할에도 관련 권한이 포함되어야 합니다. 또한 표에는 각 대상 유형이 JSON 간접 호출 레코드를 수신하는 방법도 설명되어 있습니다.
대상 유형 | 필수 권한 | 대상별 JSON 형식 |
---|---|---|
Amazon SQS 대기열 |
Lambda는 간접 호출 레코드를 |
|
Amazon SNS 주제 |
Lambda는 간접 호출 레코드를 |
|
Amazon S3 버킷(실패한 경우에만) |
|
|
Lambda 함수 |
Lambda는 간접 호출 레코드를 페이로드로 함수에 전달합니다. |
|
EventBridge |
|
참고
Amazon S3 대상의 경우 KMS 키를 사용하여 버킷에서 암호화를 활성화하면 함수에 kms:GenerateDataKey 권한도 필요합니다.
다음 단계에서는 Lambda 콘솔과 AWS CLI를 사용하여 함수의 대상을 구성하는 방법을 설명합니다.
Amazon S3에 대한 보안 모범 사례
함수 구성에서 대상을 제거하지 않고 대상으로 구성된 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:::*/*", "Condition": { "StringEquals": { "s3:ResourceAccount":
"111122223333"
} } } ] }
AWS Management Console 또는 AWS CLI를 사용하여 함수의 실행 역할에 권한 정책을 추가하려면 다음 절차의 지침을 참조하세요.
간접 호출 레코드 예제
호출이 조건과 일치하면 Lambda는 호출에 대한 세부 정보가 포함된 JSON 문서를 대상으로 전송합니다. 다음 예제에서는 함수 오류로 인해 처리에 연속 3회 실패한 이벤트에 대한 호출 레코드를 보여 줍니다.
{
"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"
}
}
호출 레코드에는 이벤트, 응답 및 레코드가 전송된 이유에 대한 세부 정보가 포함되어 있습니다.
목적지로 향하는 요청 추적
AWS X-Ray을 사용하면 대기열에 추가되고, Lambda 함수에서 처리되고, 대상 서비스로 전달되는 각 요청의 연결된 보기를 볼 수 있습니다. 함수 또는 함수를 간접 호출하는 서비스에 대해 X-Ray 추적을 활성화하면 Lambda는 요청에 X-Ray 헤더를 추가하고 헤더를 대상 서비스에 전달합니다. 업스트림 서비스의 추적은 다운스트림 Lambda 함수 및 대상 서비스의 추적과 자동으로 연결되므로 전체 애플리케이션을 종합적으로 파악할 수 있습니다. 추적에 대한 자세한 내용은 AWS X-Ray로 Lambda 함수 간접 호출 시각화의 내용을 참조하세요.
DLQ(Dead Letter Queue) 추가
on-failure 대상의 대안으로, 이후 처리를 위해 폐기된 이벤트를 저장하기 위해 배달 못한 편지 대기열을 사용하여 함수를 구성할 수 있습니다. 배달 못한 편지 대기열은 이벤트가 모든 처리 시도에 실패하거나 처리되지 않고 만료될 때 사용된다는 점에서 on-failure 대상과 동일하게 작동합니다. 그러나 DLQ(Dead Letter Queue)은 함수 수준에서만 추가하거나 제거할 수 있습니다. 함수 버전은 게시되지 않은 버전($LATEST)과 동일한 DLQ(Dead Letter Queue) 설정을 사용합니다. On-failure 대상은 추가 대상도 지원하며, 호출 레코드에 함수의 응답에 관한 세부 정보를 포함합니다.
DLQ의 이벤트를 다시 처리하려면 Lambda 함수의 이벤트 소스로 설정하면 됩니다. 또는 수동으로 이벤트를 검색할 수도 있습니다.
배달 못한 편지 대기열에 대한 Amazon SQS 표준 대기열 또는 Amazon SNS 표준 주제를 선택할 수 있습니다. FIFO 대기열과 Amazon SNS FIFO 주제는 지원되지 않습니다.
-
Amazon SQS 대기열 – 대기열은 실패한 이벤트를 검색될 때까지 보관합니다. Lambda 함수 또는 CloudWatch 경보와 같은 단일 엔터티가 실패한 이벤트를 처리해야 하는 경우 Amazon SQS 표준 대기열을 선택합니다. 자세한 내용은 Amazon SQS에서 Lambda 사용 단원을 참조하십시오.
-
Amazon SNS 주제 – 주제는 실패한 이벤트를 한 개 이상의 대상으로 전달합니다. 실패한 이벤트에 대해 여러 엔터티가 작동할 것으로 예상되는 경우 Amazon SNS 표준 주제를 선택합니다. 예를 들어 이벤트를 이메일 주소, Lambda 함수 및/또는 HTTP 엔드포인트로 전송하도록 주제를 구성할 수 있습니다. 자세한 내용은 Amazon SNS 알림을 사용하여 Lambda 함수 간접 호출 단원을 참조하십시오.
대기열 또는 주제로 이벤트를 전송하려면 함수에 추가 권한이 필요합니다. 함수의 실행 역할에 필요한 권한이 있는 정책을 추가합니다.
대상 대기열 또는 주제가 고객 관리형 키로 암호화되는 경우, 실행 역할은 키의 리소스 기반 정책의 사용자여야 합니다.
대상을 생성하고 함수의 실행 역할을 업데이트한 후 배달 못한 편지 대기열을 함수에 추가합니다. 여러 함수에서 동일한 대상으로 이벤트를 전송하도록 구성할 수 있습니다.
Lambda는 이벤트를 속성 관련 추가 정보와 함께 배달 못한 편지 대기열에 있는 그대로 보냅니다. 이 정보를 사용해 함수가 반환한 오류를 식별하거나 이벤트와 로그 또는 AWS X-Ray 트레이스의 상관 관계를 알 수 있습니다.
배달 못한 편지 대기열 메시지 속성
-
RequestID(문자열) – 호출 요청의 ID입니다. 요청 ID는 함수 로그에 표시됩니다. X-Ray SDK를 사용하여 트레이스의 속성에 대한 요청 ID를 기록할 수도 있습니다. 그런 다음 X-Ray 콘솔에서 요청 ID로 트레이스를 검색할 수 있습니다.
-
ErrorCode(숫자) – HTTP 상태 코드입니다.
-
ErrorMessage(문자열) – 오류 메시지의 첫 1KB입니다.
Lambda는 배달 못한 편지 대기열로 메시지를 전송할 수 없는 경우 이벤트를 삭제하고 DeadLetterErrors 지표를 내보냅니다. 이것은 권한이 없는 경우나 메시지 총 크기가 대상 대기열이나 주제의 한도를 초과하는 경우에 발생할 수 있습니다. 예를 들어 본문의 크기가 256KB에 가까운 Amazon SNS 알림이 함수를 트리거하여 오류가 발생한다고 가정합니다. 이 경우 Amazon SNS가 추가하는 이벤트 데이터가 Lambda가 추가하는 속성과 결합되어 메시지가 DLQ(Dead Letter Queue)에서 허용하는 최대 크기를 초과하게 될 수 있습니다.
Amazon SQS를 이벤트 소스로 사용하는 경우, Lambda 함수가 아닌 Amazon SQS 대기열 자체에 배달 못한 편지 대기열을 구성합니다. 자세한 내용은 Amazon SQS에서 Lambda 사용 단원을 참조하십시오.