[AWS] Gateway + Lambda + PostgreSQL RDS

do yeon kim·2022년 9월 2일
0
Lambda + PostgreSQL RDS

AWS의 API Gateway, Lambda와 mySQL을 연동해서 간단한 API를 구현하는 과제를 수행했다.

대략적인 흐름은 API Gateway로 요청이 들어오면 요청이 트리거가 되어 Lambda함수에 작성된 내용을 수행하고 RDS에 저장하는 과정이다.


PostgreSQL과 mySQL

앞서 포스팅한 mySQL을 이용한 API호출과 대부분 비슷한 내용이다.
다른 점이 있다면, PostgreSQL을 python에서 이용하기 위한 라이브러리를 업로드 하는 방식의 차이이다.

mySQL의 경우 zip파일을 만들어서 직접 업로드해서 사용했지만, PostgreSQL의 경우 zip파일로 업로드하는 경우 오류가 발생한다.

그 이유는 PostgreSQL의 의존성문제와 연관된다.

그렇기 때문에 postgreSQL의 경우 AWS에서 사용하는 라이브러리를 layer형태로 만들어서 업로드해야 사용할 수 있다.

mkdir python
cd python

pip install aws-psycopg2 -t .

python 폴더에 있는 라이브러리를 압축해서 업로드 하면 사용가능하다.

중요함점은 반드시 라이브러리들을 python이라는 이름의 폴더에 넣고서 압축을 해야한다는 점이다.
그렇지 않으면 업로드 후 인식을 하지 못한다.



lambda_function.py작성**
import os
import psycopg2
import json

host        = os.environ["DB_HOST"]
user        = os.environ["DB_USERNAME"]
password    = os.environ["DB_PASSWORD"] 
db          = os.environ["DB_NAME"]
connect     = psycopg2.connect(host=host, user=user, password = password, dbname=db)
    
def lambda_handler(event, context):
    if event["requestContext"]["httpMethod"] == "POST":
       
        data = json.loads(event["body"])
        id = data["id"]
        name = data["name"]
        cursor = connect.cursor()
        sql = f"INSERT INTO member(id, name) VALUES ('{id}', '{name}')"
        
        cursor.execute(sql)
        connect.commit()
        
        return {
            "statusCode":200,
            "body": json.dumps("ok")
        }
    
    elif event["requestContext"]["httpMethod"] == "GET":
        cursor = connect.cursor()
        sql = "select * from member"
        cursor.execute(sql)
        
        rows = cursor.fetchall()
        result = []
        for row in rows:
            result.append({"id": row[0],"name":row[1]})
    
        return {
            "statusCode": 200,
            "body":json.dumps(result),
        }
        
        

PostgreSQL의 경우 SQL문의 사용에 있어서 기본적으로 mySQl과 비슷한 경향이 있지만, 아주 사소한 차이 만으로도 작동하지 않는다.

sql = f"INSERT INTO member(id, name) VALUES ('{id}', '{name}')"

위의 코드에서 '{id}','{name}'의 경우 작은 따음표로 감싸줘있다.
작은따음표가 없으면 동작하지 않는다.

이렇듯 사소한 차이로 동작하기도 오류가 나기도 한다.



0개의 댓글