[AWS] Gateway + Lambda + mySQL RDS

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

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

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


RDS 설정하기

파라미터 그룹 만들기
새로 생성하는 RDS 데이터베이스에 대한 설정을 미리 해주는 작업이다.

  • character-set : utf8mb4
  • collation_connection : utf8mb4_general_ci
  • collation_server : utf8mb4_unicodeci

인바운드 규칙 설정하기
RDS에 대한 외부 접근에 대한 설정이다.
현재 설정한 것은 외부로 부터 모든 접근을 허가한다.



Lambda 설정하기
  • 람다 생성하기




  • 람다 권한 설정하기

AWSLambdaVPCAccessExecutionRole : VPC 내부 통신을 위한 권한 설정이다.





  • mysql zip 파일 업로드

Lambda에서 기본적으로 제공하는 라이브러리가 아닌 이상, 필요한 라이브러리를 zip파일 형태로 업로드하거나 layer를 쌓아서 사용해야 한다.

  • zip파일의 경우는 해당 함수에만 적용할 때 사용하는 방법이다.

  • layer로 만드는 것은 다른 Lambda함수에서도 공통적으로 사용하는 경우 layer로 만들어 두고 저장된 layer를 추가함으로써 사용할 수 있다.

zip파일을 업로드 하게 되면 , 이전까지 작업하던 내용에 덮어씌어지기 때문에 조심해야한다. 그리고, 기본적으로 lambda가 실행되는 파일(lambda_fuction.py)을 만들어 주어야 한다.





  • 환경변수 설정

환경변수는 lambda파일에서 사용할 데이터로서 직접노출하는 것이 보안상 위험할 때 사용할 수 있다.





  • lambda_function.py작성
import os
import pymysql
import json

host        = os.environ["DB_HOST"]
user        = os.environ["DB_USERNAME"]
password    = os.environ["DB_PASSWORD"] 
db          = os.environ["DB_NAME"]

# mysql에 접속하는 코드이다.
connect     = pymysql.connect(host =host, user=user, password = password, port = 3306, db = 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 = "INSERT INTO users (id, name) VALUES (%s, %s)"
        val = (id, name)
        cursor.execute(sql, val)
        
        connect.commit()
        return {
            "statusCode":200,
            "body":json.dumps("SUCCESS")
        }
    
    
    elif event["requestContext"]["httpMethod"] == "GET":
        
        cursor = connect.cursor()
        
        sql = "select * from users"
        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),
        }       


API Gateway 작성하기

클라이언트가 들어오는 API Gateway를 설정해준다.
Endpoint로 들어오면 트리거인 lambda가 작동하게 된다.

3번째에 해당 하는 REST API를 선택한다.

API에 대한 리소스와 메서드를 작성해주고 API를 배포해준다.

Lambda프록시 통합 사용에 체크를 해준다.



postman을 통한 테스트

0개의 댓글