AWS Lambda
개발자 가이드

자습서: Amazon VPC에서 Amazon RDS에 액세스하도록 Lambda 함수 구성

이 자습서에서는 다음 작업을 수행합니다.

  • 기본 Amazon VPC에서 Amazon RDS MySQL 데이터베이스 엔진 인스턴스를 시작합니다. MySQL 인스턴스에서 샘플 테이블(Employee)이 포함된 데이터베이스(ExampleDB)를 생성합니다. Amazon RDS에 대한 자세한 내용은 Amazon RDS를 참조하십시오.

  • ExampleDB 데이터베이스를 액세스하기 위한 Lambda 함수를 생성하고 테이블(Employee)을 생성한 다음, 몇 가지 레코드를 추가하고 테이블에서 레코드를 검색합니다.

  • Lambda 함수를 호출하고 쿼리 결과를 확인합니다. 함수가 VPC에서 RDS MySQL 인스턴스에 액세스할 수 있는지 확인하는 방법입니다.

Amazon VPC에서 Lambda 사용에 대한 자세한 내용은 VPC에서 리소스에 액세스하도록 Lambda 함수 구성 단원을 참조하십시오.

사전 조건

이 자습서는 사용자가 Lambda 작업과 Lambda 콘솔에 대한 기본 지식을 알고 있다고 가정합니다. 그렇지 않은 경우 AWS Lambda 시작하기의 지침에 따라 첫 Lambda 함수를 생성합니다.

이 설명서의 절차에 따르려면 명령을 실행할 셸 또는 명령줄 터미널이 필요합니다. 명령은 프롬프트 기호($)와 해당하는 경우 현재 디렉터리의 이름이 앞에 붙은 상태로 목록에 표시됩니다.

~/lambda-project$ this is a command this is output

긴 명령의 경우 이스케이프 문자(\)를 사용하여 명령을 여러 행으로 분할합니다.

Linux 및 macOS는 선호 셸과 패키지 관리자를 사용합니다. Windows 10에서 Linux용 Windows Subsystem을 설치하여 Ubuntu와 Bash의 Windows 통합 버전을 가져옵니다.

실행 역할 만들기

함수에 AWS 리소스에 액세스할 수 있는 권한을 제공하는 실행 역할을 만듭니다.

실행 역할을 만들려면

  1. IAM 콘솔에서 역할 페이지를 엽니다.

  2. 역할 생성을 선택합니다.

  3. 다음 속성을 사용하여 역할을 만듭니다.

    • 신뢰할 수 있는 개체 – Lambda.

    • 권한AWSLambdaVPCAccessExecutionRole.

    • 역할 이름lambda-vpc-role.

AWSLambdaVPCAccessExecutionRole은 함수가 VPC에 대한 연결을 관리하는 데 필요한 권한을 가집니다.

Amazon RDS 데이터베이스 인스턴스 생성

이 자습서에서 예제로 제시되는 Lambda 함수는 테이블(Employee)을 생성하고 몇 가지 레코드를 삽입한 다음, 레코드를 검색합니다. 함수가 생성하는 테이블의 스키마는 다음과 같습니다.

Employee(EmpID, Name)

여기에서 EmpID는 기본 키입니다. 이제, 이 테이블에 몇 가지 레코드를 추가해야 합니다.

먼저 ExampleDB 데이터베이스의 기본 VPC에서 RDS MySQL 인스턴스를 시작합니다. 기본 VPC에서 RDS MySQL 인스턴스가 이미 실행 중인 경우에는 이 단계를 건너뜁니다.

다음 방법 중 하나를 사용하여 RDS MySQL 인스턴스를 시작할 수 있습니다.

  • Amazon RDS 사용 설명서MySQL DB 인스턴스를 만들고 MySQL DB 인스턴스의 데이터베이스에 연결에 나오는 지침을 따르십시오.

  • 다음 AWS CLI 명령을 사용합니다.

    $ aws rds create-db-instance --db-name ExampleDB --engine MySQL \ --db-instance-identifier MySQLForLambdaTest --backup-retention-period 3 \ --db-instance-class db.t2.micro --allocated-storage 5 --no-publicly-accessible \ --master-username username --master-user-password password

데이터베이스 이름, 사용자 이름 및 암호를 적어두십시오. DB 인스턴스의 호스트 주소(엔드포인트)도 필요합니다. 이 주소는 RDS 콘솔에서 확인할 수 있습니다. 인스턴스 상태가 사용 가능으로 되고 엔드포인트 값이 콘솔에 나타날 때까지 기다려야 할 수 있습니다.

배포 패키지 만들기

다음에 나오는 Python 코드 예제는 VPC에 생성한 MySQL RDS 인스턴스의 Employee 테이블을 토대로 SELECT 쿼리를 실행합니다. 코드는 ExampleDB 데이터베이스에서 테이블을 생성하고 샘플 레코드를 추가한 다음, 이러한 레코드를 검색합니다.

예 app.py

import sys import logging import rds_config import pymysql #rds settings rds_host = "rds-instance-endpoint" name = rds_config.db_username password = rds_config.db_password db_name = rds_config.db_name logger = logging.getLogger() logger.setLevel(logging.INFO) try: conn = pymysql.connect(rds_host, 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() logger.info("SUCCESS: Connection to RDS MySQL instance succeeded") def handler(event, context): """ This function fetches content from MySQL RDS instance """ item_count = 0 with conn.cursor() as cur: cur.execute("create table Employee ( EmpID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (EmpID))") cur.execute('insert into Employee (EmpID, Name) values(1, "Joe")') cur.execute('insert into Employee (EmpID, Name) values(2, "Bob")') cur.execute('insert into Employee (EmpID, Name) values(3, "Mary")') conn.commit() cur.execute("select * from Employee") for row in cur: item_count += 1 logger.info(row) #print(row) conn.commit() return "Added %d items from RDS MySQL table" %(item_count)

핸들러 외부에서 pymysql.connect()를 실행하면 함수가 데이터베이스 연결을 재사용하여 성능을 높일 수 있습니다.

두 번째 파일에는 함수에 대한 연결 정보가 들어 있습니다.

예 rds_config.py

#config file containing credentials for RDS MySQL instance db_username = "username" db_password = "password" db_name = "ExampleDB"

종속성

  • pymysql – Lambda 함수 코드는 이 라이브러리를 사용하여 MySQL 인스턴스에 액세스합니다(PyMySQL 참조).

Pip를 사용하여 종속성을 설치하고 배포 패키지를 생성합니다. 지침은 AWS Lambda 배포 패키지(Python) 단원을 참조하십시오.

Lambda 함수 생성

create-function 명령을 사용하여 Lambda 함수를 만듭니다. Amazon VPC 콘솔에서 기본 VPC의 서브넷 ID 및 보안 그룹 ID를 찾을 수 있습니다.

$ aws lambda create-function --function-name CreateTableAddRecordsAndRead --runtime python3.8 \ --zip-file fileb://app.zip --handler app.handler \ --role arn:aws:iam::123456789012:role/lambda-vpc-role \ --vpc-config SubnetIds=subnet-0532bb6758ce7c71f,subnet-d6b7fda068036e11f,SecurityGroupIds=sg-0897d5f549934c2fb

Lambda 함수 테스트

이 단계에서는 invoke 명령을 사용하여 Lambda 함수를 수동으로 호출합니다. Lambda 함수는 실행 시 RDS MySQL 인스턴스의 Employee 테이블을 토대로 SELECT 쿼리를 실행하고 결과를 인쇄합니다. 이 결과는 CloudWatch Logs로도 전달됩니다.

  1. invoke 명령을 사용하여 Lambda 함수를 호출합니다.

    $ aws lambda invoke --function-name CreateTableAddRecordsAndRead output.txt
  2. 다음과 같이 Lambda 함수가 성공적으로 실행되었는지 확인합니다.

    • output.txt 파일을 검토합니다.

    • AWS Lambda 콘솔에서 결과를 검토합니다.

    • CloudWatch Logs에서 결과를 확인합니다.

VPC의 데이터베이스를 액세스하는 Lambda 함수를 생성하면, 이제 이벤트에 대한 응답으로 함수를 호출할 수 있습니다. 이벤트 소스 구성에 대한 자세한 내용과 예제를 보려면 다른 서비스와 함께 AWS Lambda 사용 단원을 참조하십시오.