S3 버킷에 객체를 저장했을 때 실행되는 람다 함수의 성공, 실패에 대한 메시지를 받는 SQS대기열을 작성해봤습니다.

2021.11.26

안녕하세요, 임채정입니다.
이번 블로그에서는 S3 버킷에 객체를 저장했을 때 실행되는 람다 함수의 성공, 실패에 대한 메시지를 받는 SQS대기열에 대해 정리해보려고 합니다.

아젠다

  1. 람다 함수 작성 및 S3 버킷 트리거로 추가
  2. SQS 작성
  3. 람다 함수 대상 추가
  4. 테스트
  5. 마무리

1. 람다 함수 작성 및 S3 버킷 트리거로 추가

람다 함수의 작성과 S3버킷을 트리거로 추가하는 작업은 아래 블로그에 자세하게 정리했기 때문에 참고해주시기 바랍니다.

2. SQS 작성

먼저 SQS를 작성하겠습니다. 이번에는 람다 함수가 성공했을 때와 실패했을 때에 다른 SQS에 메시지를 보내도록 할 것이기 때문에 두 개의 SQS큐를 작성하겠습니다.

먼저 성공했을 때의 SQS큐를 작성합니다.
이름 : s3-event-success

다음으로는 실패했을 때 메시지가 보내질 SQS도 작성해줍니다.
이름 : s3-event-failure

작성을 완료했습니다.

3. 람다 함수 대상 추가

그럼 이제 람다 함수로 돌아가서 대상을 추가해보겠습니다.
[대상 추가]버튼을 클릭해줍니다.

먼저 람다 함수가 성공 했을 때 메시지를 보낼 대상부터 추가해주겠습니다.
소스 : 비동식 호출
조건 : 성공 시
대상 유형 : SQS 대기열
대상 : s3-event-success(위에서 생성한 SQS)

이번에는 람다 함수가 실패했을 때 메시지를 보낼 대상을 추가하겠습니다.
소스 : 비동식 호출
조건 : 실패 시
대상 유형 : SQS 대기열
대상 : s3-event-failure(위에서 생성한 SQS)

대상을 추가한 후에 람다 함수의 [구성]탭의 대상 부분에서 확인해보면 위에서 추가한 두 개의 대상을 확인할 수 있습니다.

또한, 같은 [구성]탭의 권한에서 역할 이름을 클릭해서 역할을 확인해보면SQS에 쓸 수 있는 정책의 리소스에 위에서 대상으로 설정해준 SQS 대기열이 들어가 있는 것을 확인할 수 있습니다.

4. 테스트

다음으로는 실제로 테스트를 해봅시다.
테스트는 S3에 객체 생성 이벤트를 발생시키고 람다 함수가 실행되었을 때 성공하는 경우와 실패하는 경우로 나눠서 진행하겠습니다.

4-1. 성공 테스트

먼저 성공 테스트입니다.
S3버킷에 새로운 객체를 넣어줍니다.

이렇게 되면 람다가 실행되고 그 메시지가 SQS에 보내졌을 것이기 때문에 SQS 대기열(s3-event-success)에서 [메시지 전송 및 수신]을 클릭합니다.

[메시지 폴링]을 클릭해서 메시지를 가져고 옵니다.

메시지를 가지고 왔습니다. ID를 클릭해보면 자세한 정보를 확인할 수 있습니다.

메시지를 확인해봅시다.

{"version":"1.0","timestamp":"2021-11-25T16:16:26.729Z","requestContext":{"requestId":"484d45ac-c977-4a2c-9611-b33de0cf1633","functionArn":"arn:aws:lambda:ap-northeast-2:763723081076:function:lambda-s3-sqs:$LATEST","condition":"Success","approximateInvokeCount":1},"requestPayload":{"Records":[{"eventVersion":"2.1","eventSource":"aws:s3","awsRegion":"ap-northeast-2","eventTime":"2021-11-25T16:16:24.366Z","eventName":"ObjectCreated:Put","userIdentity":{"principalId":"AWS:AROA3DULRMV2KZDIEM6JT:cm-lim.chaejeong"},"requestParameters":{"sourceIPAddress":"xxx.xx.xx.xxx"},"responseElements":{"x-amz-request-id":"36R54D48Z0EKY57R","x-amz-id-2":"z/N3c0HkTvr32kPhxJC25vhjTErssRn6Y3He40UTg4lFiIOSZkBXeK0Btjg/7drzHo85TMTIPItE9Fj7SZve1whDcejeFYi4XrqnKPF4tCc="},"s3":{"s3SchemaVersion":"1.0","configurationId":"invokeLambda","bucket":{"name":"s3-event-20211126","ownerIdentity":{"principalId":"A1SJWXS7HOTAF5"},"arn":"arn:aws:s3:::s3-event-20211126"},"object":{"key":"test.png","size":1844899,"eTag":"e3b11cd3cbe00b7b1b5d029d1651d144","sequencer":"00619FB6D84AD12340"}}}]},"responseContext":{"statusCode":200,"executedVersion":"$LATEST"},"responsePayload":{"statusCode": 200, "body": "\"Hello from Lambda!\""}}

메시지를 살펴보면 "requestContext": 부분에 "condition":"Success"으로 성공 여부를 확인할 수 있고
S3버킷 정보 : "s3":
객체 정보 : "object":
등도 확인할 수 있습니다.

4-2. 실패 테스트

다음으로 실패 테스트를 해보겠습니다.
이번에는 람다 함수를 강제로 실패하도록 코드를 변경하고 Deploy를 해주겠습니다.

import json

def lambda_handler(event, context):
    print(event)
    raise Exception("fail,,")

그 후에 실제로 테스트를 해보기 위해 S3버킷에 새로운 객체를 넣어줍니다.

성공 테스트에서는 바로 SQS 대기열에 가서 확인했지만 실패 테스트의 경우는 바로 SQS 대기열에 이동해도 메시지가 보이지 않습니다.
그 이유는 람다 함수의 [구성]탭에 비동기식 호출 부분에 가보면 재시도 횟수가 2라고 적혀 있습니다.
이 의미는 람다 함수가 실패했을 때 SQS 대기열에 메시지를 바로 보내는 게 아니라 2번 더 실행을 해보고 대기열에 실패 메시지를 전송한다는 의미입니다.

그렇기 때문에 몇 분 정보 기다린 후 SQS를 확인하면 메시지가 와있습니다.

메시지 ID를 클릭하면 메시지에 대한 자세한 정보를 확인할 수 있습니다.

{"version":"1.0","timestamp":"2021-11-25T16:48:00.459Z","requestContext":{"requestId":"3a63ad3d-e31d-4a4e-b807-3756580fe72f","functionArn":"arn:aws:lambda:ap-northeast-2:763723081076:function:lambda-s3-sqs:$LATEST","condition":"RetriesExhausted","approximateInvokeCount":3},"requestPayload":{"Records":[{"eventVersion":"2.1","eventSource":"aws:s3","awsRegion":"ap-northeast-2","eventTime":"2021-11-25T16:44:47.103Z","eventName":"ObjectCreated:Put","userIdentity":{"principalId":"AWS:AROA3DULRMV2KZDIEM6JT:cm-lim.chaejeong"},"requestParameters":{"sourceIPAddress":"122.38.73.237"},"responseElements":{"x-amz-request-id":"1RRZXZEDZVN4R38H","x-amz-id-2":"DPO6roWw1VZQKUJn70RDssJia1YFA/gwXIfuApB8u9oXQdBK4ZQ6wKUnC6emA50M2/Ioxm5tY3dPcB2lG+sEbkQV5qDMyOyR"},"s3":{"s3SchemaVersion":"1.0","configurationId":"invokeLambda","bucket":{"name":"s3-event-20211126","ownerIdentity":{"principalId":"A1SJWXS7HOTAF5"},"arn":"arn:aws:s3:::s3-event-20211126"},"object":{"key":"index.html","size":1808,"eTag":"6ec4ba18552a312e4e43f68643ad2134","sequencer":"00619FBD7F095E923A"}}}]},"responseContext":{"statusCode":200,"executedVersion":"$LATEST","functionError":"Unhandled"},"responsePayload":{"errorMessage": "fail,,", "errorType": "Exception", "requestId": "3a63ad3d-e31d-4a4e-b807-3756580fe72f", "stackTrace": ["  File \"/var/task/lambda_function.py\", line 5, in lambda_handler\n    raise Exception(\"fail,,\")\n"]}}

메시지의 "requestContext": 부분에서 "condition":"RetriesExhausted"으로 람다 함수가 실패했다는 걸 알수 있고
S3버킷 정보 : "s3":
객체 정보 : "object":
"responseContext":에서 "errorMessage": "fail,,"등의 에러 메시지를 확인할 수 있습니다.

5. 마무리

이번 블로그에서는 S3 버킷에 객체를 저장했을 때 실행되는 람다 함수의 성공, 실패에 대한 메시지를 받는 SQS대기열을 작성해봤습니다.