[AWS] RDS Lambda 연결하기

그냥·2022년 7월 26일
2

AWS

목록 보기
5/9

RDS와 Lambda

  • 연결 이유:RDS와 Lambda를 연결하는 이유는 Lambda에서 DB에 접근해서 데이터 CRUD를 하기 위해서이다.
  • 전제: 이 방법을 진행하기 위해서는 우선 RDS의 인스터스와 Lambda의 함수가 생성되어 있어야 한다.



RDS와 Lambda의 VPC 통일

RDS VPC 설정

  • Lambda와 연결하고자 하는 RDS의 DB 인스턴스를 클릭한다.
  • 그러면 나오는 창에서 [연결&보안] > [VPC 보안 그룹] 을 클릭한다.
  • 나오는 창 아래에 [인바운드 규칙]과 [아웃바운드 규칙]이 있다. [인바운드 규칙]을 클릭하고 [인바운드 규칙 편집]을 클릭한다.
  • 유형은 자신이 생성한 DB 소프트웨어를 클릭한다(ex. MySQL로 인스턴스 생성 시 MYSQL/Aurora) 클릭
  • 유형을 클릭하면 프로토콜과 포트범위는 자동으로 정해지고 비활성화된다.
  • 소스는 가능하면 자신의 IP만 바라보게 하는 것이 보안상 좋지만 여기서는 빠른 연결을 위해서 Anywhere IPv4나 Anywhere IPv6를 클릭한다.
  • 혹시 몰라서 필자는 규칙을 추가해서 한 개는 Anywhere IPv4, Anywhere IPv6로 만들어 두었다.
  • 규칙을 저장하고 나온다.


Lambda VPC 설정

  • RDS와 연결할 Lambda 함수를 클릭한다.
  • Lambda 대시보드에서 [구성] > [VPC] > [편집]을 클릭한다.
  • VPC: VPC 편집 창에서 VPC는 RDS에 연결된 VPC를 클릭한다. RDS와 연결된 VPC는 RDS DB 클릭 하면 [연결&보안] > [VPC]에서 확인할 수 있다.
  • 서브넷: RDS DB에 연결된 모든 서브넷을 클릭한다.
  • 보안그룹: RDS DB에 연결된 보안 그룹을 선택한다.
  • 저장을 누르고 나온다.


pymysql로 DB 접근하는 방법

pymysql

  • 정의: pymysql이란 파이썬에서 mysql에 접근 하기 위한 서드 파티 라이브러리이다.
  • 현재 필자는 python으로 Lambda 함수를 생성하였기 때문에 pymysql을 사용하였다.

설치

  • 로컬에서 pymysql 라이브러리를 만들 디렉토리를 생성한다.
pip install pymysql {설치경로}
  • 위와 같이 마지막에 설치경로를 작성하면 그 경로에 설치 된다고 하였는데 오류가 발생하여 그냥 pymysql을 설치하였다.
  • mac을 사용하기 때문에 SPOTLIGHT를 사용하여 pymysql을 검색해서 아래 두 폴더를 복사해서 가져왔다.
pymysql
PyMySAL-1.0.2.dist-info
  • 생성한 디렉토리 안에 아래 dbinfo.py를 만들어 준다. 이는 DB 정보들로, 그대로 노출 시키면 안되기 때문에 만드는 것이다.
db_host = 'DB 엔드포인트'
db_username = 'DB username'
db_password = 'DB password'
db_name = 'DB 이름'
db_port = 포트
  • 생성한 디렉토리에 lambda_function.py도 만들어준다. Lambda에서 함수를 읽을 때 lambda_function.py 파일명으로 접근하기 때문에 꼭 lambda_function.py로 파일을 만들어야 한다.
import sys
import logging
import pymysql
import dbinfo
import json

connection = pymysql.connect(
    host = dbinfo.db_host,
    user = dbinfo.db_username,
    passwd = dbinfo.db_password,
    db = dbinfo.db_name,
    port = dbinfo.db_port
    ) # db 접근 하기 위한 정보 
    
def lambda_handler(event, context):
    cursor = connection.cursor() # DB에 접속 및 DB 객체를 가져옴
    cursor.execute("select * from ips;") # SQL 문장을 DB 서버에 보냄

    rows = cursor.fetchall() # 데이터를 DB로부터 가져온 후, Fetch 된 데이터를 사용

    for row in rows:
        print(f"{row[0]} {row[1]} {row[2]} {row[3]}")
        
    results = [{
        'ip' : row[0],
        'created_at' : row[1],
        'updated_at' : str(row[2])
    }for row in rows]
    
    return {
    'statusCode': 200,
    'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*'
        },
        'body': json.dumps(results),
        "isBase64Encoded": False
    }
    # return의 경우 REST API로 통신하기 때문에 headers와 body는 위와 같이 해주어야 한다.
    # 나머지는 없어도 된다.
  • 생성한 디렉토리를 압축한다.
  • Lambda 함수 대시보드에 접속한 후 오른쪽에 있는 [에서 업로드] > [zip 파일] > [압축 파일]을 클릭한다.
  • 그러면 Lambda 코드 소스 창에 로컬에서 작성한 파일들이 업로드 된다.
  • 위 코드로 테스트 혹은 API Gateway url로 접속하여 잘 되는지 확인해본다.

0개의 댓글