티스토리 뷰

728x90
반응형

참고 : API Gateway + lambda로 REST API 만들기(GET)
참고 : API Gateway + lambda로 REST API 만들기(POST)

REST API(POST)를 만든 lambda 함수에서 다른 lambda 함수를 호출해 post로 온 값을 보내고, 그 lambda 함수에 pymysql 모듈을 import해서 데이터베이스에 요청 값을 넣어봅시다.



lambda 함수에서 lambda 함수 호출

GET, POST 요청 글을 참고해서 람다함수 test2를 만든다. 기존에 쓰던 test 람다함수에서 test2 람다함수를 호출하기위해서 test 람다함수의 추가적인 권한이 필요하다. 이 포스팅에 IAM 역할에서 Lambda_Fullaccess 권한을 가진 역할을 만들어서 처음 람다함수 만들 때 권한을 넣는게 편하다고 되있는데 이런 경우 때문에 그렇다. 기본 람다함수면 밑의 사진처럼 되있는데 여기서 추가적인 권한을 넣어보자.

example example example



이제 test 람다함수에는 test2를 호출하는 코드를 test2에는 event를 받아서 출력하는 코드를 짜보자.

# test
import json, boto3

def lambda_handler(event, context):
    body = event['body-json']

    lan = boto3.client(service_name='lambda', region_name="ap-northeast-2")
    lan.invoke(FunctionName="test2", InvocationType='Event', Payload=json.dumps(body))
    print(body)

    # TODO implement
    return {
        'success': True,
        'data': {
            'star': body['star']
        }
    }
# test2
import json

def lambda_handler(event, context):
    print('test2 event 발생')
    print(event)
    return event

test 람다함수는 event를 Boto3 모듈을 사용하여 test2로 invoke하고, test2는 그 event를 그대로 출력하고 리턴한다. boto3.client()에는 서비스 이름과 리전을 적어주고, invoke 함수에는 람다함수 이름, invoke 타입, Payload를 적어준다.



postman으로 post요청을 보내고 cloudwatch로 들어가서 test2의 로그를 확인하면 event가 출력된 걸 확인할 수 있다.

example example



lambda 외부 모듈 import하기

test2 람다함수의 event를 받아서 데이터를 db에 넣어보자. db에 넣으려면 외부모듈인 pymysql 모듈이 필요하다. 람다 함수에서 그대로 pymysql을 임포트해서 사용하면 에러가 난다. 람다함수가 pymysql을 사용할 수 있게 어떤 조치가 필요하다.

람다 함수의 밑에쪽에 계층을 추가할 수 있게 되어있는데, 계층(레이어)를 만들어 추가하면 필요한 모듈을 사용할 수 있다. 만든 레이어는 다른 람다함수에서도 재사용이 가능하다. 참고



계층을 생성할 때 쓸 모듈 zip 파일을 만들자. 윈도우에서 Anaconda Prompt를 사용했다. pymysql 폴더 안에 python 폴더를 만들고, 파이썬 폴더안에 pip install PyMySQL -t . 명령어로 모듈관련 파일들을 넣는다. 그리고 pymysql을 압축하면된다.

example example example



계층을 생성한다음 test2 함수에서 그 계층을 추가해보자. 만든 zip파일을 업로드 해주면 pymysql 모듈을 사용할 수 있다. 이미 pymysql이 있어서 이름에 2를 붙였다. 런타임은 파이썬으로 해준다. 이미 있다보니까 버전도 2이다.

example example example example



test2 람다함수에서 event를 데이터베이스 테이블에 삽입하는 코드를 짜서 테스트해보자.

# test2 람다 함수
import json, pymysql

def lambda_handler(event, context):
    event
    try:
        conn = pymysql.connect(
            user='',
            passwd='',
            host='',
            db='',
            charset='utf8'
        )
    except pymysql.MySQLError as e:
        return {
            "success": False,
            "message": "Database Error"
        }
    cursor = conn.cursor()
    sql = "INSERT INTO test (star) VALUES (%s)"
    cursor.execute(sql, event['star'])
    conn.commit()
    conn.close()
    return {
        "success": True,
    }

함수를 deploy 해준다.



postman으로 post 요청을 보내면 star 값이 test 람다함수의 event로 들어오고, test 람다함수는 test2 람다함수로 invoke한다. test2 람다함수는 pymysql 모듈로 데이터베이스에 연결하여 star 값을 넣는다. (lightsail db사용)

example example



데이터베이스에 잘 들어가지 않으면 cloudwatch 로그를 확인해 디버깅하면된다.

example

728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday
링크