s3 트리거를 사용해 lambda 함수 호출

Hyeyeon Kim·2024년 8월 25일
0

1. s3 세팅

ㅏㅏㄹ

2. 람다 코드 작성

PUT 이벤트 발생 시
이벤트에서 버킷 이름과 객체 키를 가져와 *원하는 파일을 가져오는 코드 작성
(아래 코드의 경우 현재에서 1시간 이전의 날짜로된 파일을 찾아오는 코드)

import json
import boto3
from datetime import datetime, timedelta
import pytz

def handler(event, context):
	# S3 클라이언트 생성
	s3 = boto3.client('s3')

	# 이벤트에서 버킷 이름과 객체 키 가져오기
	bucket_name = event['Records'][0]['s3']['bucket']['name']
	object_key = event['Records'][0]['s3']['object']['key']

	print(f"Bucket: {bucket_name}, Object Key: {object_key}")
	# 현재 서울 시간 가져오기
	seoul_tz = pytz.timezone('Asia/Seoul')
	now = datetime.now(seoul_tz)

	# 1시간 전 시간 계산
	one_hour_ago = now - timedelta(hours=1)

	# 언더플로우 처리: 0시에서 1시간 전은 전날 23시로 설정
	if one_hour_ago.hour == 23 and now.hour == 0:
		target_date = (now - timedelta(days=1)).strftime('%Y-%m-%d')
	else:
		target_date = one_hour_ago.strftime('%Y-%m-%d')

	target_hour = one_hour_ago.strftime('%H')

	# 예상되는 파일 이름 생성 (예: "dc crawling_data_YYYY-MM-DD_HH.json")
	expected_file_key = f'dc/{target_date}_{target_hour}.json'
	# expected_file_key = "hello"

	try:
		# 예상된 파일 읽기
		file_obj = s3.get_object(Bucket=bucket_name, Key=expected_file_key)
		file_content = file_obj['Body'].read().decode('utf-8')
		json_data = json.loads(file_content)
		send_llm(json_data)
		return {
			'statusCode': 200,
			'body': json.dumps(f"Processed file: {expected_file_key}")
		}

	except s3.exceptions.NoSuchKey:
		# 파일이 존재하지 않을 때의 처리
		return {
			'statusCode': 404,
			'body': json.dumps(f"No file found for {expected_file_key}")
		}
	
if __name__ == '__main__':
    handler()

3. 람다 생성

람다 세팅은 블로그 글 참고

4. 람다 테스트하기


람다에서 테스트 항목에서 s3-put을 선택해서
기본 테스트 코드에서 버킷명을 추가한다.

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-1",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "[버킷명]",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::[버킷명]"
        },
        "object": {
          "key": "test%2Fkey",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}
profile
성장하고 싶은 백엔드 주니어 개발자

0개의 댓글