자습서: Amazon RDS에 액세스하기 위해 Lambda 함수 사용
이 자습서에서는 Lambda 함수를 사용하여 RDS 프록시를 통해 Amazon Relational Database Service(Amazon RDS) 데이터베이스에 데이터를 기록합니다. Lambda 함수는 메시지가 추가될 때마다 Amazon Simple Queue Service(Amazon SQS) 대기열에서 레코드를 읽고 데이터베이스의 테이블에 새 항목을 기록합니다. 이 예제에서는 AWS Management Console을 사용하여 대기열에 메시지를 수동으로 추가합니다. 다음 다이어그램은 자습서를 완료하는 데 사용하는 AWS 리소스를 보여줍니다.
Amazon RDS를 사용하면 Microsoft SQL Server, MariaDB, MySQL, Oracle Database, PostgreSQL과 같은 일반적인 데이터베이스 제품을 사용하여 클라우드에서 관리형 관계형 데이터베이스를 실행할 수 있습니다. Lambda를 사용하여 데이터베이스에 액세스하면 새 고객이 웹 사이트에 등록하는 것과 같은 이벤트에 응답하여 데이터를 읽고 쓸 수 있습니다. 함수와 데이터베이스 인스턴스, 프록시는 수요가 많은 기간에 맞춰 자동으로 확장됩니다.
이 자습서를 완료하려면 다음 작업을 수행하세요.
-
RDS for MySQL 데이터베이스 인스턴스 및 프록시를 AWS 계정의 기본 VPC에 시작합니다.
-
데이터베이스에 새 테이블을 생성하고 여기에 데이터를 기록하는 Lambda 함수를 생성 및 테스트합니다.
-
Amazon SQS 대기열을 생성하고 새 메시지가 추가될 때마다 Lambda 함수를 호출하도록 구성합니다.
-
AWS Management Console을 사용하여 대기열에 메시지를 추가하고 CloudWatch Logs를 사용하여 결과를 모니터링하면서 전체 설정을 테스트합니다.
이 단계를 완료하면 다음을 학습하게 됩니다.
Amazon RDS를 사용하여 데이터베이스 인스턴스와 프록시를 생성하고 Lambda 함수를 프록시에 연결하는 방법
Lambda를 사용하여 Amazon RDS 데이터베이스에서 생성 및 읽기 작업을 수행하는 방법
Amazon SQS를 사용하여 Lambda 함수를 호출하는 방법
AWS Management Console 또는 AWS Command Line Interface(AWS CLI)를 사용하여 이 자습서를 완료할 수 있습니다.
필수 조건
시작하기 전에 다음 섹션에서 다음 단계를 완료하세요.
Amazon RDS DB 인스턴스 생성
Amazon RDS DB 인스턴스는 AWS 클라우드에서 실행되는 격리된 데이터베이스 환경입니다. 인스턴스에 사용자가 만든 데이터베이스가 하나 이상 포함될 수 있습니다. 별도로 지정하지 않는 한 Amazon RDS는 AWS 계정에 포함된 기본 VPC에 새 데이터베이스 인스턴스를 생성합니다. Amazon VPC에 대한 자세한 내용은 Amazon Virtual Private Cloud 사용 설명서를 참조하세요.
이 자습서에서는 AWS 계정의 기본 VPC 새 인스턴스를 생성하고 해당 인스턴스에 이름이 ExampleDB
인 데이터베이스를 생성합니다. AWS Management Console 또는 AWS CLI를 사용하여 DB 인스턴스 및 데이터베이스를 생성할 수 있습니다.
데이터베이스 인스턴스를 생성하는 방법
-
Amazon RDS 콘솔을 열고 데이터베이스 생성을 선택합니다.
-
표준 생성 옵션을 선택한 상태로 두고 엔진 옵션에서 MySQL을 선택합니다.
-
Templates(템플릿) 섹션에서 Free tier(프리 티어)를 선택합니다.
-
Settings(설정)에서 DB instance identifier(DB 인스턴스 식별자)에
MySQLForLambda
를 입력합니다. -
다음을 따라 사용자 이름과 암호를 설정합니다.
-
자격 증명 설정에서 마스터 사용자 이름을
admin
으로 둡니다. -
마스터 암호의 경우 데이터베이스에 액세스하기 위한 암호를 입력하고 확인합니다.
-
-
다음을 수행하여 데이터베이스 이름을 지정합니다.
-
나머지 기본 옵션을 모두 선택한 상태로 두고 아래로 스크롤하여 추가 구성 섹션으로 이동합니다.
-
이 섹션을 확장하고 초기 데이터베이스 이름으로
ExampleDB
를 입력합니다.
-
-
나머지 기본 옵션을 모두 선택한 상태로 두고 데이터베이스 생성을 선택합니다.
Lambda 함수 및 프록시 생성
RDS 콘솔을 사용하여 데이터베이스와 동일한 VPC에 Lambda 함수와 프록시를 생성할 수 있습니다.
참고
데이터베이스 생성이 완료되어 있으며 사용 가능 상태인 경우에만 이러한 관련 리소스를 생성할 수 있습니다.
관련 함수 및 프록시를 생성하는 방법
-
데이터베이스 페이지에서 데이터베이스가 사용 가능 상태인지 확인합니다. 사용 가능 상태이면 다음 단계를 진행합니다. 사용 가능 상태가 아니면 데이터베이스를 사용할 수 있을 때까지 기다립니다.
-
데이터베이스를 선택하고 작업에서 Lambda 연결 설정을 선택합니다.
-
Lambda 연결 설정 페이지에서 새 함수 생성을 선택합니다.
새 Lambda 함수 이름을
LambdaFunctionWithRDS
로 설정합니다. -
RDS 프록시 섹션에서 RDS 프록시를 사용하여 연결 옵션을 선택합니다. 그리고 새 프록시 생성을 선택합니다.
-
데이터베이스 자격 증명에서 데이터베이스 사용자 이름 및 암호를 선택합니다.
-
사용자 이름은
admin
으로 지정합니다. -
암호에는 데이터베이스 인스턴스에 생성한 암호를 입력합니다.
-
-
설정을 선택하여 프록시와 Lambda 함수 생성을 완료합니다.
마법사가 설정을 완료하고 새 함수를 검토할 수 있도록 Lambda 콘솔 링크를 제공합니다. Lambda 콘솔로 전환하기 전에 프록시 엔드포인트를 기록해 두세요.
함수 실행 역할 생성
Lambda 함수를 생성하기 전에 함수에 필요한 권한을 부여하는 실행 역할을 생성해야 합니다. 이 자습서에서는 데이터베이스 인스턴스가 포함된 VPC에 대한 네트워크 연결을 관리하고 Amazon SQS 대기열에서 메시지를 폴링할 수 있는 권한이 Lambda에 필요합니다.
Lambda 함수에 필요한 권한을 부여하기 위해 이 자습서에서는 IAM 관리형 정책을 사용합니다. 이러한 정책은 여러 가지 일반적인 사용 사례에서 권한을 부여하고 AWS 계정에서 제공됩니다. 관리형 정책에 대한 자세한 내용은 정책 모범 사례의 내용을 참조하세요.
Lambda 실행 역할 생성
-
IAM 콘솔의 역할
페이지를 열고 Create role(역할 생성)을 선택합니다. -
신뢰할 수 있는 엔터티 유형으로 AWS 서비스를 선택한 다음 사용 사례로 Lambda를 선택합니다.
-
다음을 선택합니다.
-
다음을 수행하여 IAM 관리형 정책을 추가합니다.
-
정책 검색 상자를 사용하여
AWSLambdaSQSQueueExecutionRole
을 검색합니다. -
결과 목록에서 역할 옆의 확인란을 선택한 다음 필터 지우기를 선택합니다.
-
정책 검색 상자를 사용하여
AWSLambdaVPCAccessExecutionRole
을 검색합니다. -
결과 목록에서 역할 옆의 확인란을 선택한 다음 Next(다음)를 선택합니다.
-
-
Role name(역할 이름)에
lambda-vpc-sqs-role
을 입력한 다음 Create role(역할 생성)을 선택합니다.
자습서 뒷부분에서는 방금 생성한 실행 역할의 Amazon 리소스 이름(ARN)이 필요합니다.
실행 역할 ARN 찾기
-
IAM 콘솔의 역할
페이지를 열고 역할( lambda-vpc-sqs-role
)을 선택합니다. -
요약 섹션에 표시된 역할 ARN을 복사합니다.
Lambda 배포 패키지 생성
다음 예제 Python 코드는 PyMySQLCustomer
라는 새 테이블도 생성됩니다. 테이블은 다음 스키마를 사용하고, 여기서 CustID
는 기본 키입니다.
Customer(CustID, Name)
또한 함수는 PyMySQL을 사용하여 이 테이블에 레코드를 추가합니다. 이 함수는 Amazon SQS 대기열에 추가할 메시지에 지정된 고객 ID 및 이름을 사용하여 레코드를 추가합니다.
이 코드는 핸들러 함수 외부에서 데이터베이스에 대한 연결을 생성합니다. 초기화 코드에서 연결을 생성하면 이후에 함수를 호출할 때 연결을 다시 사용할 수 있어 성능이 향상됩니다. 프로덕션 애플리케이션에서는 프로비저닝된 동시성을 사용하여 요청된 수의 데이터베이스 연결을 초기화할 수도 있습니다. 이러한 연결은 함수가 호출되는 즉시 사용할 수 있습니다.
import sys import logging import pymysql import json import os # rds settings user_name = os.environ['USER_NAME'] password = os.environ['PASSWORD'] rds_proxy_host = os.environ['RDS_PROXY_HOST'] db_name = os.environ['DB_NAME'] logger = logging.getLogger() logger.setLevel(logging.INFO) # create the database connection outside of the handler to allow connections to be # re-used by subsequent function invocations. try: conn = pymysql.connect(host=rds_proxy_host, user=user_name, passwd=password, db=db_name, connect_timeout=5) except pymysql.MySQLError as e: logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.") logger.error(e) sys.exit(1) logger.info("SUCCESS: Connection to RDS for MySQL instance succeeded") def lambda_handler(event, context): """ This function creates a new RDS database table and writes records to it """ message = event['Records'][0]['body'] data = json.loads(message) CustID = data['CustID'] Name = data['Name'] item_count = 0 sql_string = f"insert into Customer (CustID, Name) values(%s, %s)" with conn.cursor() as cur: cur.execute("create table if not exists Customer ( CustID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (CustID))") cur.execute(sql_string, (CustID, Name)) conn.commit() cur.execute("select * from Customer") logger.info("The following items have been added to the database:") for row in cur: item_count += 1 logger.info(row) conn.commit() return "Added %d items to RDS for MySQL table" %(item_count)
참고
이 예제에서는 데이터베이스 액세스 자격 증명이 환경 변수로 저장됩니다. 프로덕션 애플리케이션에서는 보다 안전한 옵션으로 AWS Secrets Manager을 사용하는 것이 좋습니다. Lambda 함수가 VPC에 있는 경우 Secrets Manager에 연결하려면 VPC 엔드포인트를 생성해야 한다는 점을 참고하세요. 자세한 내용은 Virtual Private Cloud 내에서 Secrets Manager에 연결하는 방법
함수 코드에 PyMySQL 종속성을 포함하려면.zip 배포 패키지를 생성하세요. 다음 명령은 Linux, macOS 또는 Unix에서 작동합니다.
.zip 배포 패키지 생성
-
예제 코드를
lambda_function.py
라는 파일로 저장합니다. -
lambda_function.py
파일을 생성한 디렉터리와 동일한 디렉터리에서 이름이package
인 새 디렉터리를 생성하고 PyMySQL 라이브러리를 설치합니다.mkdir package
pip install --target package pymysql
-
애플리케이션 코드와 PyMySQL 라이브러리가 포함된 zip 파일을 생성합니다. Linux 또는 MacOS에서는 다음 CLI 명령을 실행합니다. Windows에서는 선호하는 zip 도구를 사용하여
lambda_function.zip
파일을 생성합니다.lambda_function.py
원본 코드 파일과 종속 항목이 포함된 폴더는 .zip 파일의 루트에 설치해야 합니다.cd package
zip -r ../lambda_function.zip .
cd ..
zip lambda_function.zip lambda_function.py
Python 가상 환경을 사용하여 배포 패키지를 생성할 수도 있습니다. .zip 파일 아카이브를 사용하여 Python Lambda 함수 배포를 참조하세요.
Lambda 함수 업데이트
방금 생성한 .zip 패키지를 사용하여 이제 Lambda 콘솔에서 Lambda 함수를 업데이트합니다. 함수가 데이터베이스에 액세스할 수 있도록 하려면 액세스 보안 인증으로 환경 변수도 구성해야 합니다.
Lambda 함수를 업데이트하는 방법
-
Lambda 콘솔의 함수
페이지를 열고 함수( LambdaFunctionWithRDS
)를 선택합니다. -
런타임 설정 탭에서 편집을 선택하여 함수의 런타임을 Python 3.10으로 변경합니다.
-
핸들러를
lambda_function.lambda_handler
로 변경합니다. -
코드 탭에서 에서 업로드를 선택한 다음 .zip 파일을 선택합니다.
-
이전 단계에서 생성한
lambda_function.zip
파일을 선택하고 저장을 선택합니다.
이제 앞서 생성한 실행 역할로 함수를 구성합니다. 이렇게 하면 함수에 데이터베이스 인스턴스에 액세스하고 Amazon SQS 대기열을 폴링하는 데 필요한 권한이 부여됩니다.
함수의 실행 역할을 구성하는 방법
-
Lambda 콘솔의 함수
페이지에서 구성 탭을 선택한 다음 권한을 선택합니다. -
실행 역할에서 편집을 선택합니다.
-
기존 역할에서 실행 역할(
lambda-vpc-sqs-role
)을 선택합니다. -
Save(저장)를 선택합니다.
함수의 환경 변수를 구성하는 방법
-
Lambda 콘솔의 함수
페이지에서 구성 탭을 선택한 다음 환경 변수를 선택합니다. -
편집을 선택합니다.
-
데이터베이스 액세스 자격 증명을 추가하려면 다음을 수행합니다.
-
환경 변수 추가를 선택한 다음 키에
USER_NAME
을 입력하고 값에admin
을 선택합니다. -
환경 변수 추가를 선택한 다음 키에
DB_NAME
을 입력하고 값에ExampleDB
를 선택합니다. -
환경 변수 추가를 선택한 다음 키에
PASSWORD
를 입력하고 값에 데이터베이스를 생성할 때 선택한 암호를 입력합니다. -
환경 변수 추가를 선택한 다음 키에
RDS_PROXY_HOST
를 입력하고 값에 앞서 기록한 RDS 프록시 엔드포인트를 입력합니다. -
Save(저장)를 선택합니다.
-
콘솔에서 Lambda 함수 테스트
이제 Lambda 콘솔을 사용하여 함수를 테스트할 수 있습니다. 자습서의 마지막 단계에서 Amazon SQS를 사용하여 함수를 호출할 때 함수가 수신할 데이터를 모방하는 테스트 이벤트를 생성합니다. 테스트 이벤트에는 함수가 생성하는 Customer
테이블에 추가할 고객 ID와 고객 이름을 지정하는 JSON 객체가 포함됩니다.
Lambda 함수를 테스트하려면
-
Lambda 콘솔의 함수
페이지를 열고 함수를 선택합니다. -
테스트 섹션을 선택합니다.
-
새 이벤트 생성을 선택하고 이벤트 이름으로
myTestEvent
를 입력합니다. -
다음 코드를 이벤트 JSON에 복사하고 저장을 선택합니다.
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n \"CustID\": 1021,\n \"Name\": \"Martha Rivera\"\n}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", "awsRegion": "us-west-2" } ] }
-
테스트를 선택합니다.
실행 결과 탭의 함수 로그에 아래와 비슷한 결과가 표시될 것입니다.
[INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f The following items have been added to the database: [INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f (1021, 'Martha Rivera')
Amazon SQS 대기열 생성
Lambda 함수와 Amazon RDS 데이터베이스 인스턴스의 통합을 성공적으로 테스트했습니다. 이제 자습서의 마지막 단계에서 Lambda 함수를 호출하는 데 사용할 Amazon SQS 대기열을 생성합니다.
Amazon SQS 대기열 생성(콘솔)
-
Amazon SQS 콘솔의 대기열
페이지를 열고 대기열 생성을 선택합니다. -
유형을 표준으로 두고 대기열 이름으로
LambdaRDSQueue
를 입력합니다. -
기본 옵션을 모두 선택한 상태로 두고 Create queue(대기열 생성)를 선택합니다.
이벤트 소스 매핑을 생성하여 Lambda 함수 호출
이벤트 소스 매핑은 스트림 또는 대기열에서 항목을 읽고 Lambda 함수를 호출하는 Lambda 리소스입니다. 이벤트 소스 매핑을 구성할 때 스트림 또는 대기열의 레코드가 단일 페이로드로 일괄 처리되도록 배치 크기를 지정할 수 있습니다. 이 예제에서는 대기열에 메시지를 보낼 때마다 Lambda 함수가 호출되도록 배치 크기를 1로 설정합니다. AWS CLI 또는 Lambda 콘솔을 사용하여 이벤트 소스 매핑을 구성할 수 있습니다.
이벤트 소스 매핑 생성(콘솔)
-
Lambda 콘솔의 함수
페이지를 열고 함수( LambdaFunctionWithRDS
)를 선택합니다. -
함수 개요 섹션에서 트리거 추가를 선택합니다.
-
소스로 Amazon SQS를 선택한 다음 대기열의 이름(
LambdaRDSQueue
)을 선택합니다. -
배치 크기에
1
을 입력합니다. -
다른 모든 옵션은 기본값으로 두고 추가를 선택합니다.
이제 Amazon SQS 대기열에 메시지를 추가하여 전체 설정을 테스트할 준비가 되었습니다.
설정 테스트 및 모니터링
전체 설정을 테스트하려면 콘솔을 사용하여 Amazon SQS 대기열에 메시지를 추가합니다. 이후 CloudWatch Logs를 사용하여 Lambda 함수가 예상대로 데이터베이스에 레코드를 작성하고 있는지 확인합니다.
설정 테스트 및 모니터링
-
Amazon SQS 콘솔의 대기열
페이지를 열고 대기열( LambdaRDSQueue
)을 선택합니다. -
메시지 전송 및 수신을 선택하고 다음 JSON을 메시지 전송 섹션의 메시지 본문에 붙여넣습니다.
{
"CustID": 1054,
"Name": "Richard Roe"
}
-
메시지 전송을 선택합니다.
메시지를 대기열로 보내면 Lambda가 이벤트 소스 매핑을 통해 함수를 호출합니다. Lambda에서 예상대로 함수를 호출했는지 확인하려면 CloudWatch Logs를 사용하여 함수가 고객 이름과 ID를 데이터베이스 테이블에 기록했는지 확인합니다.
-
CloudWatch 콘솔의 로그 그룹
페이지를 열고 함수( /aws/lambda/LambdaFunctionWithRDS
)의 로그 그룹을 선택합니다. -
로그 스트림 섹션에서 가장 최근의 로그 스트림을 선택합니다.
테이블에는 함수를 호출할 때마다 하나씩, 총 두 개의 고객 레코드가 포함되어야 합니다. 로그 스트림에 다음과 유사한 메시지가 표시됩니다.
[INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 The following items have been added to the database: [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1021, 'Martha Rivera') [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1054, 'Richard Roe')
리소스 정리
이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.
Lambda 함수를 삭제하려면
-
Lambda 콘솔의 함수 페이지
를 엽니다. -
생성한 함수를 선택합니다.
-
작업, 삭제를 선택합니다.
-
삭제를 선택합니다.
실행 역할을 삭제하려면
-
IAM 콘솔에서 역할 페이지
를 엽니다. -
생성한 실행 역할을 선택합니다.
-
역할 삭제(Delete role)를 선택합니다.
-
예, 삭제(Yes, delete)를 선택합니다.
MySQL DB 인스턴스를 삭제하려면
-
Amazon RDS 콘솔의 데이터베이스 페이지
를 엽니다. -
생성한 데이터베이스를 선택합니다.
-
작업, 삭제를 선택합니다.
-
최종 스냅샷 생성 확인란을 선택 해제합니다.
-
텍스트 상자에
delete me
를 입력합니다. -
삭제를 선택합니다.
Amazon SQS 대기열을 삭제하려면
-
AWS Management Console에 로그인한 후 https://console.aws.amazon.com/sqs/
에서 Amazon SQS 콘솔을 엽니다. -
생성한 대기열을 선택합니다.
-
삭제를 선택합니다.
-
텍스트 상자에
delete
를 입력합니다. -
삭제를 선택합니다.