람다에서 pymysql 라이브러리를 사용해 rds에 접속하기
람다는 서버 프로비저닝 없이 코드를 실행할 수 있는 서버리스 서비스입니다.
람다의 자세한 내용은 aws 공식 문서에 잘 나와 있습니다.
시작하기에 앞서 RDS의 퍼블릭 엑세스가 yes 이면 따로 람다의 VPC 구성을 해줄 필요는 없습니다.
하지만 보통 퍼블릭 엑세스 허용은 하지 않으니 람다 VPC 구성을 RDS와 동일하게 하고 람다의 보안그룹 아웃바운드에 RDS와 통신할 수 있는 규칙이 필요합니다. 당연히 RDS 인바운드 규칙도 필요합니다.
먼저 RDS에 접속할 람다 함수를 생성해줍니다. 런타임은 사용할 언어에 맞게 지정해주고 x86_64로 생성해줍니다. 역할은 테스트용으니 admin으로 지정해 주었습니다.
람다 함수를 작성하기 전에 DB 접속 정보는 외부에 공개되면 안되니 람다에서 제공하는 환경 변수 설정을 사용해줍니다.
이제 RDS에 접속하기 위한 람다 함수를 작성해주겠습니다.
제가 접속할 RDS는 mysql이라 pymysql이란 라이브러리를 사용하여 rds에 접속해보겠습니다.
코드 작성 후 Deploy > TEST 해주면 작성한 람다 코드를 실행시킬 수 있습니다.
작성한 함수를 실행시키니 No module named 'pymysql' 에러가 발생합니다.
로컬에서 파이썬 라이브러리가 필요하면 pip install 해주면 되지만, 람다는 자체적으로 라이브러리를 import할 수 없습니다.
로컬에서 코드+라이브러리를 한번에 패키지해서 업로드하거나 layer를 사용하여 라이브러리를 import할 수 있습니다.
한번에 패키지하게 되는 경우 패키지 크기가 크면 코드를 람다에서 수정할 수 없어 저는 필요한 라이브러리가 있으면 layer를 주로 사용합니다. (패키지로 올려도 코드 수정이 가능한 기능이 있을거 같은데 사용해 본 적이 없음)
생성한 람다 함수에 layer를 추가하여 pymysql 라이브러리를 사용할 수 있습니다.
먼저 로컬에서 pymysql 라이브러리를 다운 받아 줍니다.
파이썬만 그런지 모르겠는데 람다 layer에 올릴 라이브러리는 python 디렉터리에 존재해야 합니다.
mkdir python
cd python
pip3 install pymysql -t ./
cd ..
zip -r python.zip ./python
이제 pymysql 라이브러리를 올릴 람다 layer를 생성해줍니다.
layer를 생성할 때, 람다 함수와 동일한 아키텍처와 런타임을 지정해 줍니다.
이제 생성한 layer를 람다 함수에서 추가해주면 됩니다. 람다 코드를 작성하는 부분 아래에 계층 부분에서 [Add a layer]를 클릭해 줍니다.
아래와 같이 생성한 layer를 람다 함수에 추가해준 모습이다.
이제 다시 작성한 코드를 실행시키면 pymysql을 사용하여 rds에 접속할 수 있습니다.