[AWS] AWS SAM을 이용한 로컬 환경에서 Lambda-MySQL 연동하기
안녕하세요
이번 시간에는 AWS SAM(Serverless Application Model)을 이용해서
로컬 환경에서 동작 중인 MySQL과 연동하는 실습을 진행하겠습니다.
1. AWS SAM (Serverless Application Model) 이란?
AWS SAM (Serverless Application Model)은 AWS에서 제공하는 서버리스 어플리케이션 개발 프레임워크입니다.
AWS SAM은 AWS CloudFormation과 AWS Lambda를 기반으로 하며, YAML 또는 JSON 형식으로 작성된 템플릿 파일을 사용하여 서버리스 어플리케이션을 쉽게 개발하고 배포할 수 있습니다.
2. AWS SAM (Serverless Application Model)의 장점
1. 빠르고 쉬운 어플리케이션 개발
AWS SAM을 사용하면 템플릿 파일을 통해 AWS Lambda 함수, API Gateway, Amazon DynamoDB 등의 리소스를 빠르고 쉽게 작성할 수 있습니다.
2. 로컬 테스트
SAM CLI를 사용하여 로컬에서 Lambda 함수와 API Gateway를 테스트할 수 있습니다.
3. 개발 환경과 운영 환경의 일치
AWS SAM은 AWS CloudFormation과 연동되기 때문에 개발 환경과 운영 환경을 동일하게 구성할 수 있습니다.
4. 확장성
AWS SAM을 사용하면 AWS Lambda, API Gateway, DynamoDB 등의 AWS 서비스와 쉽게 통합할 수 있으며, 필요에 따라 확장 가능합니다.
5. 비용 절감
AWS SAM을 사용하면 서버리스 어플리케이션을 구축할 때 필요한 인프라 구성을 최적화하여 비용을 절감할 수 있습니다.
3. 실습 준비 사항
1. Python 3.10.10 설치하기
Python Release Python 3.10.10 | Python.org
Lambda에서 사용할 수 있는 Python 버전은 [3.7, 3.8, 3.9, 3.10]이기 때문에 그중 가장 최신 버전을 설치합니다.
2. MySQL Server 8.0, MySQL workbench 설치하기
MySQL :: Download MySQL Installer
위 링크로 MySQL을 설치하면 Workbench도 함께 설치되니 같이 설치해주세요.
3. AWS CLI 설치하기
https://eveningdev.tistory.com/160
AWS CLI를 통해 SAM CLI를 설치할 수 있습니다.
4. AWS SAM CLI 설치하기
AWS SAM CLI 설치 - AWS Serverless Application Model (amazon.com)
Lambda를 로컬 환경에서 동작시키기 위해 AWS SAM CLI를 설치해 줍니다.
5. Docker 설치하기
Download Docker Desktop | Docker
AWS SAM은 애플리케이션을 빌드, 실행, 배포 시에 Docker가 필요하기 때문에 설치해 줍니다.
6. Git 설치하기
AWS SAM 명령어인 `sam init`을 수행하기 위해 Git이 필요합니다.
4. SAM을 이용하여 로컬 환경에서 Lambda-MySQL 연동하기
1. MySQL Workbench에서 데이터베이스와 테이블 생성하기
Client에서 Server에 연결하기 위해 Schema 생성합니다.
Database 이름은 아무렇게나 넣으신 후 [Apply]
데이터가 들어갈 [Table]을 생성합니다.
실습을 위해 테이블 명은 [users], 컬럼 명은 [name]을 주고 [Apply] 합니다.
2. AWS SAM 프로젝트 생성하기
sam init --runtime python3.10 --name sam-lambda-mysql --app-template hello-world
y / y
`sam-lambda-mysql`이라는 SAM 프로젝트를 생성합니다.
`sam-lambda-mysql` 프로젝트가 생성된 것을 확인할 수 있습니다.
3. 외부 모듈 설정하기
`sam-lambda-mysql` 폴더에 접근합니다.
MySQL을 연결하기 위한 Client인 `pymysql`을 넣고 저장합니다. 여기서 지정한 모듈은 실행될 때 모듈이 같이 설치됩니다.
4. Lambda 함수 작성하기
import pymysql
def lambda_handler(event, context):
# MySQL 연결 설정
connection = pymysql.connect(
host='host.docker.internal', #localhost
user='<username>',
password='<password>',
database='<db name>',
port=3306
)
with connection.cursor() as cursor:
sql = "INSERT INTO users (name) VALUES (%s)"
val = ("jeonhyuk",)
cursor.execute(sql, val)
print("DB 입력 성공")
connection.commit()
# 연결 종료
connection.close()
Lambda 함수를 작성합니다. pymysql을 import 하고 MySQL 연결 설정과 Insert 문을 통해 데이터를 삽입합니다.
가장 중요한 것은 SAM은 빌드 배포가 Docker로 이루어져 있기 때문에 Localhost가 아닌 별도의 네트워크를 사용합니다.
다른 대역대의 네트워크를 사용하고 있기 때문에 Localhost로 지정하시면 같은 서브넷이 아니기 때문에 통신이 되지 않습니다.
host='host.docker.internal'
따라서 host를 다음과 같이 설정해주어야 합니다.
cd sam-lambda-mysql
sam build
`sam-lambda-mysql`로 이동한 후 sam build를 수행합니다.
sam local invoke
build가 정상적으로 완료되었다면 `sam local invoke`를 통해 Lambda 함수를 로컬에서 동작시킵니다.
5. 결과 확인하기
local invoke가 정상적으로 동작한다면 다음과 같이 로컬 환경에 있는 MySQL에 데이터가 삽입되는 것을 확인할 수 있습니다.
이번 시간에는 AWS SAM을 이용해서 로컬 환경에서 동작 중인 MySQL과 연동하는 실습을 진행했습니다.
감사합니다.