AWS Lambda로 간단하게 배치 작업을 돌려보자!

92·2023년 4월 22일
0
post-thumbnail

EC2 서비스나 서버에서 Cron job을 만들어 배치작업을 돌리는 경우가 많죠. 하지만 배치가 잦게 돌아가는 것이 아닌 1-2주에 한번 잠깐 사용해야한다면? 비용면에서나 관리면에서 AWS 람다를 사용하는 것이 유리할 것 입니다.

AWS 서비스에서 제공해주는 람다를 이용하여 함수를 생성 및 설정 방법에 대해 설명하려합니다.

저는 AWS 람다함수를 이용하여 RDS에 있는 데이터를 조회하고 해당 파일을 JSON형식으로 S3에 담으려고합니다.

AWS Lambda 생성

  • 처음 AWS 람다 생성을 해주고 python or node js 를 선택줍니다.(저는 python으로 했습니다.)
  • 이후 VPC 활성화를 한 이후 같은 네트워크에 위치하도록 설정이 필요합니다.
    이것은 같은 VPC(네트워크)상에 S3와 Lambda가 같은 위치에 있어야 하기 때문에 설정해 주었습니다.

lambda_handler 함수 작성

  • 이후 lambda handler 코드 작성해줍시다.
    여기서 임포트한 라이브러리를 사용 하기 위해 layer를 생성해주어야 합니다..! 저는 Pymysql을 사용하기 위함이었는데요.
  • Lambda layer를 추가해주는 방법은 아래 해당 링크가 잘 설명 되어 있습니다.
    https://jsikim1.tistory.com/180
# 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 제한 시간 늘려주기

  • Lambda > 구성 > 일반 구성 에서 제한시간을 늘려주는 작업이 필요합니다.(디폴트값 : 3초)
    그렇기에 저는 최대로 늘릴 수 있는 시간인 15분으로 늘려 주었습니다.

  • 이젠 배치 작업을 위해 EventBridge 트리거를 생성하러 갑시다!

작성된 함수 배치 작업

  • 위와 같이 Lambda_handler 함수를 모두 작성해주고 나면, 배치작업을 위해
    '트리거 추가' > EventBridge(CloudWatch Events)를 추가해줍시다.

예약 표현식에서 저는 2주마다 배치를 돌릴 예정이기에 rate(14 days) 로 설정해두었습니다.
예약표현식에 대해 자세하게 알고 싶다면 공식문서를 참고하시면 됩니다.

profile
{ "ME" : "DataEngineer, DataAnalyst" }

0개의 댓글