사용 목적
- S3에 데이터가 적재되었을 경우, 해당 이벤트를 자동으로 감지 후 Lambda 함수 실행시키고자 한다.
- S3 파일 적재 --(Lambda 이벤트감지)--> 파일 읽기 -> 파일 데이터 추가 -> S3 파일 업데이트
Lambda란
- 서버리스 컴퓨팅 서비스로 서버를 프로비저닝 할 필요 없이 특정 이벤트에 대한 응답으로 코드실행 가능
- 이벤트가 트리거되면 코드 실행
- 상태 비저장 코드 실행
- 완전 관리형 컴퓨팅 서비스
- 사용한 만큼만 요금부과
Lambda 사용이 필요한 경우
- 코드를 특정한 시기에만 실행시켜야 하는 경우
- 트리거가 실행될때만 실행시켜야 하는 경우
Lambda 사용방법
1. Lambda 함수 선택 -> 함수 생성 선택
2. 블루프린트사용하면 기본 코드를 작성에 도움 받을 수 있다.
블루 프린트 사용 -> 블루프린트 이름(원하는 서비스) 선택 -> 함수이름 입력 -> 역할 선택
* 역할선택 : 해당 역할의 권한은 사용자가 작성하는 코드에 따라 달라진다. 현재 내가 하려고 하는 작업은 S3데이터 가져오기, CloudWatchLogs 권한이 필요하여 설정해 놓았다.
3. 아래와 같은 함수가 만들어진다. 코드 수정은 함수가 생성된 후 작성 예정이다.
4. S3의 객체가 create 될 경우 트리거가 실행되어야 하므로 S3트리거를 선택한다.
Bucket 선택 -> 이벤트 감지 액션 선택 -> prefix(원하는 폴더 path지정) -> 재귀호출 동의 체크
4. 코드에 Pandas 라이브러리를 사용해야 하기에 Pandas 계층을 추가했다.
5. 호환되는 런타임 Python으로 선택하여 Layer를 추가한다.
6. 코드는 아래와 같이 수정하였다.
import io
import os
import json
import boto3
import urllib.parse
import pandas as pd
from io import StringIO
s3 = boto3.client('s3')
def lambda_handler(event, context):
#EventBridge
#bucket = event['detail']['bucket']['name']
#key = event['detail']['object']['key']
#S3 Trigger
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
try:
response = s3.get_object(Bucket=bucket, Key=key)
csv_df = pd.read_csv(io.BytesIO(response["Body"].read()))
csv_df['lambda_test'] = 'test'
save_csv_to_s3(bucket, key, csv_df)
return True
except Exception as e:
raise e
def save_csv_to_s3(bucket, key, csv_df):
with io.StringIO() as csv_buffer:
csv_df.to_csv(csv_buffer, index=False)
response = s3.put_object(Bucket=bucket, Key=key, Body=csv_buffer.getvalue())
코드를 간략히 설명하자면
1. (현재 예시에서는 사용하지 않았지만 EventBridge 이벤트 감지를 사용할 경우)
EventBridge의 return 되는 event 구조는 S3 트리거에서 가져오는 형식과 다르다.
아래와 같으며 현재 가져와야 할 값은 bucket 명과 key로 코드를 작성했다.
{
"version": "0",
"id": "17793124-05d4-b198-2fde-7ededc63b103",
"detail-type": "Object Created",
"source": "aws.s3",
"account": "111122223333",
"time": "2021-11-12T00:00:00Z",
"region": "ca-central-1",
"resources": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET1"
],
"detail": {
"version": "0",
"bucket": {
"name": "DOC-EXAMPLE-BUCKET1"
},
"object": {
"key": "example-key",
"size": 5,
"etag": "b1946ac92492d2347c6235b4d2611184",
"version-id": "IYV3p45BT0ac8hjHg1houSdS1a.Mro8e",
"sequencer": "617f08299329d189"
},
"request-id": "N4N7GDK58NMKJ12R",
"requester": "123456789012",
"source-ip-address": "1.2.3.4",
"reason": "PutObject"
}
}
2. S3 트리거를 사용하여 이벤트 감지를 할 경우 bucket명과 create 된 파일 명(key)을 가져오는 코드이다.
3. 예외 없이 실행된다면 s3 버켓의 해당 파일을 읽어서 csv_df에 Dataframe 형식으로 저장한다
4. 해당 Dataframe에 새로운 열을 추가하였고 s3에 저장하는 함수를 호출시켜 s3에 적재하였다.
5. save_csv_to_s3는 bucket명과 key, 데이터를 가지고 s3에 적재할 수 있는 함수이다.
마무리
Lambda를 처음으로 작업해 보면서 생각보다 작업 방법이 어렵지 않았다.
또한 서버리스라는 장점을 가지고 있기 때문에 다른 업무에서도 자주 사용하게 될 것으로 느껴진다.
'AWS' 카테고리의 다른 글
Eventbridge 개념 및 사용 방법 (0) | 2024.04.15 |
---|
댓글