본문 바로가기
공부/AWS

[AWS][Lambda] Lambda와 RDS 연동하기 (3)

by 웅대 2023. 4. 6.
728x90
반응형

https://growth-coder.tistory.com/148

이전 포스팅에서 Lambda와 API gateway를 사용하여 api를 배포하는 것을 배워보았다.

 

이번 시간에는 RDS를 연동하여 Lambda 함수에서 mysql 데이터베이스에 접근하는 방법에 대해서 공부해보려고 한다.

 

언어는 파이썬을 사용할 예정이다.

 

우선 AWS로 로그인을 하고 RDS 콘솔창에 들어간다.

 

좌측 메뉴의 데이터베이스 -> 데이터베이스 생성으로 들어간다.

표준 생성, mysql을 선택한다.

템플릿은 프리 티어를 선택한다.

사용자 이름과 암호를 작성한다. 나는 그냥 암호 자동 생성을 선택했지만 원하는 암호를 직접 적어도 된다.

그리고 하단에 추가 구성이 있는데 초기 데이터베이스 이름을 설정해야 한다. 나는 practice라고 정했다.

 

나머지는 기본 설정으로 두고 데이터베이스를 생성한다.

 

초기 데이터베이스 이름, 마스터 사용자 이름, 암호, rds 엔드포인트, DB 인스턴스 식별자는 코드로 데이터베이스에 접글할 때 사용하므로 기억해둔다.

 

또한 VPC, 서브넷, VPC 보안 그룹의 값은 lambda가 rds에 접근할 수 있게 설정할 때 사용하므로 기억해둔다.

 

람다 함수를 생성하기 전에 람다 함수에게 권한을 부여해야 한다.

 

IAM 서비스로 이동한 후 좌측의 역할 -> 역할 만들기를 클릭한다.

AWS 서비스와 Lambda를 선택한다.

AWSLambdaVPCAccessExecutionRole를 검색하여 추가하고 다음을 클릭한다.

역할 이름을 정하고

권한 추가가 잘 되어있는지 확인하고 다음을 클릭한다.

생성한 역할의 ARN은 나중에 사용할 예정이다.

이제 람다 함수를 만들어야 한다.

 

데이터베이스에 접근하기 위해서는 pymysql 라이브러리가 필요한데, 로컬에서 람다 함수와 pymysql을 설치한 후 .zip 파일로 압축하여 람다 함수에 올릴 예정이다.

 

우선 람다 함수가 되는 파이썬 코드의 이름은 lambda_function.py로 정한다.

 

그리괴 lambda_function.py와 같은 위치에서 pymysql을 설치해야 한다.

 

나는 C 드라이브 아래 lambda-rds 폴더를 만들어서 그 안에 lambda_function.py를 만들었고 같은 위치에 pymysql 라이브러리를 설치할 예정이다.

 

c드라이브 안에 들어가서 터미널을 열고 pip install --target lambda-rds pymysql --no-user 명령어를 입력한다.

폴더 안에 아래와 같은 폴더들이 생성되어 있으면 잘 생성된 것이다.

 

설치가 완료되면 lambda_function.py 파일을 작성할 차례이다.

 

유저 이름과 비밀번호를 입력받아 데이터베이스에 저장하는 코드이다.

 

<lambda_function.py>

import sys
import logging
import pymysql
import json
rds_host  = "rds 엔드포인트"
user_name = "마스터 사용자 이름"
password = "password"
db_name = "초기 데이터베이스 이름"

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

try:
    conn = pymysql.connect(host=rds_host, user=user_name, passwd=password, db=db_name, connect_timeout=5)
except pymysql.MySQLError as e:
    logger.error("연결 실패!")
    logger.error(e)
    sys.exit()

logger.info("연결 성공!")

def lambda_handler(event, context):
    username = event['username']
    password = event['password']

    item_count = 0
    sql_string = f"insert into USER (username, password) values('{username}', '{password}')"
    
    with conn.cursor() as cur:
        cur.execute("create table if not exists USER ( username varchar(20) PRIMARY KEY, password varchar(20) NOT NULL)")
        cur.execute(sql_string)
        conn.commit()

    return "회원가입 성공!"

이제 두 폴더 폴더와 lambda_function.py 파일을 lambda_functioin 이라는 이름으로 압축한다.

이제 람다 함수에 이 압축 파일을 올려야 한다.

 

람다에 접속한다. 함수를 생성한다.

새로 작성을 선택하고 함수 이름을 작성한다.

 

런타임 언어는 python으로 설정하고 나머지는 그대로 둔 상태로 함수를 생성한다.

upload from에서 .zip 파일을 선택한다.

 

.zip 파일을 선택하고 업로드하면 아래와 같이 우리가 만든 폴더와 파일이 잘 보인다.

이제 lambda가 rds에 접근할 수 있도록 설정을 해줘야 한다.

 

lambda 함수의 구성 -> 권한 -> 실행 역할 편집에 들어간다.

 

기존 역할에서 우리가 이전에 만든 AWSLambdaVPCAccessExecutionRole 권한이 있는 역할로 바꾼다.

이제 lambda 함수의 VPC를 설정할 수 있다.

 

rds에 접근하기 위해서는 lambda 함수의 VPC와 rds의 VPC가 동일해야 한다.

 

lambda 함수의 구성 -> VPC 편집에 들어간다.

 나오는 창에서 VPC, 서브넷, VPC 보안 그룹을 rds와 똑같이 설정한다.

 

이제 모든 준비가 완료되었다.

 

람다 함수의 TEST를 누른다.

현재 이벤트가 없기 때문에 새로 만들어야 한다. 아래와 같이 이벤트 JSON을 만든다.

 

이제 테스트를 실행해보면 rds에 값을 넣는게 성공했을 때 나오는 return 값을 받아오는 것을 알 수 있다.

다음 포스팅에서는 API 게이트웨이 설정을 해서 외부에서 값을 넣을 수 있도록 설정해볼 예정이다.

728x90
반응형

댓글