1. 개요

lambda 함수에서 RDS 데이터를 이용하여 처리하는 내용


2. 파이썬 코드

  • 만약 MySQL 포트가 기본 포트가 아니라면 pymysql.connect 에서 port= 를 추가해야 한다.
  • 만약 한글을 사용한다면 pymysql.connect 에서 charset='utf8' 을 추가해야 한다.
import sys
import logging
import rds_config
import pymysql
#rds settings
rds_host  = "rds-instance-endpoint"
name = rds_config.db_username
password = rds_config.db_password
db_name = rds_config.db_name

logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
    conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
except:
    logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
    sys.exit()

logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
def handler(event, context):
    """
    This function fetches content from mysql RDS instance
    """

    item_count = 0

    with conn.cursor() as cur:
        cur.execute("create table Employee3 ( EmpID  int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (EmpID))")  
        cur.execute('insert into Employee3 (EmpID, Name) values(1, "Joe")')
        cur.execute('insert into Employee3 (EmpID, Name) values(2, "Bob")')
        cur.execute('insert into Employee3 (EmpID, Name) values(3, "Mary")')
        conn.commit()
        cur.execute("select * from Employee3")
        for row in cur:
            item_count += 1
            logger.info(row)
            #print(row)

    return "Added %d items from RDS MySQL table" %(item_count)

3. 패키지화

자세한 방법은 https://sarc.io/index.php/aws/805-aws-lambda-zip-python 링크를 확인한다.

3.1. py 파일 생성

위 코드를 py 파일로 만든다.

3.2. pymysql 패키지 설치

$ pip3 install pymysql
Collecting pymysql
  Downloading https://files.pythonhosted.org/packages/e5/07/c0f249aa0b7b0517b5843eeab689b9ccc6a6bb0536fc9d95e65901e6f2ac/PyMySQL-0.8.0-py2.py3-none-any.whl (83kB)
    100% |████████████████████████████████| 92kB 865kB/s
Installing collected packages: pymysql
Successfully installed pymysql-0.8.0

패키지 설치 시에 distutils.errors.DistutilsOptionError: must supply either home or prefix/exec-prefix -- not both 에러가 발생한다면 다음의 아티클을 참조하자.

3.3. zip 파일 생성


4. 역할(role) 생성

4.1. 이름

예: role-lambda-execution

4.2. Lambda 대상

4.3. 정책 연결

  • AWSLambdaVPCAccessExecutionRole

5. 알아두면 좋은 것들

5.1. Security Group

  • Lambda는 RDS와 동일 VPC에 넣고 Lambda에 Security Group 할당
    -> 위에서 말한대로 Lambda의 실행 역할(Role)에 AWSLambdaVPCAccessExecutionRole가 포함되어야 있어야 함
  • RDS Security Group 인바운드에 위에서 만든 Lambda용 Security Group 설정

5.2. 한글 깨짐

  • Lambda에서는 한글이 잘 표시되는 것을 확인하였으나 API Gateway에서 한글이 정상 출력되지 않음 (예: \uc2a4)
  • API Gateway의 Response Body에 charset을 utf-8로 세팅했음에도 안됨