EC2 서비스나 서버에서 Cron job을 만들어 배치작업을 돌리는 경우가 많죠. 하지만 배치가 잦게 돌아가는 것이 아닌 1-2주에 한번 잠깐 사용해야한다면? 비용면에서나 관리면에서 AWS 람다를 사용하는 것이 유리할 것 입니다.
AWS 서비스에서 제공해주는 람다를 이용하여 함수를 생성 및 설정 방법에 대해 설명하려합니다.
저는 AWS 람다함수를 이용하여 RDS에 있는 데이터를 조회하고 해당 파일을 JSON형식으로 S3에 담으려고합니다.
# Library import
import boto3
import json
import pymysql
def lambda_handler(event, context):
# MySQL 데이터베이스 연결
conn = pymysql.connect(
host='hostname'
,user='username'
,password='password'
,database='database'
)
# Athena 쿼리
query = """
SELECT
t.name,
t.address,
t.latitude,
t.longitude,
from table t
join table2 t2 on(t.id = t2.seller_id)
WHERE 1=1
and DATE_FORMAT(t.created_datetime + interval '9' hour,'%Y-%m-%d') >= DATE_FORMAT(current_date - interval '14' day,'%Y-%m-%d')
"""
# 데이터 조회 및 JSON 생성
cursor = conn.cursor()
cursor.execute(query)
data = cursor.fetchall()
columns = [column[0] for column in cursor.description]
json_data = []
# 한국어 인코딩을 위해 ensure_ascii=False
for row in data:
json_data.append(dict(zip(columns, row)))
json_string = json.dumps(json_data, ensure_ascii=False, default=str)
# S3 버킷에 결과를 업로드합니다.
s3 = boto3.client('s3')
s3.put_object(Bucket='My-bucket', Key='key.json', Body=json_string)
return {
'statusCode': 200,
'body': json.dumps('Athena query results saved to S3')
}
Lambda > 구성 > 일반 구성 에서 제한시간을 늘려주는 작업이 필요합니다.(디폴트값 : 3초)
그렇기에 저는 최대로 늘릴 수 있는 시간인 15분으로 늘려 주었습니다.
이젠 배치 작업을 위해 EventBridge 트리거를 생성하러 갑시다!
예약 표현식에서 저는 2주마다 배치를 돌릴 예정이기에 rate(14 days)
로 설정해두었습니다.
예약표현식에 대해 자세하게 알고 싶다면 공식문서를 참고하시면 됩니다.