Lambda 함수로 Aurora Serverless 사용하기

2021.11.17

들어가기에 앞서

Aurora Serverless는 VPC 외부에서 직접 접근할 수 없습니다. Aurora Serverless에 접속하기 위해서는 2가지 방법이 있습니다. MySQLWorkbench 같은 툴을 사용하기 위해서는 아래의 링크를 통해 확인해 주세요.

  1.  Bastion Host를 통해 접속한다
  2.  Data API를사용한다 -> 이번에 다룰 내용

이번에는 Lambda 함수로 Data API를 호출하는 방법에 대해 설명하도록 하겠습니다.

Aurora Serverless Data API 사용

Lambda 함수로 Data API를 호출하기 위해선 다음과 같은 과정이 필요합니다.

역할 생성 - Secretes Manager에 자격증명 저장 - VPC엔드포인트 설정 - Lmabda 권한 설정 및 코드 작성

VPC 엔드포인트 설정

VPC 콘솔 - 엔드포인트 - 엔드포인트 생성 버튼을 통해 엔드포인트를 생성할 수 있습니다. AWS 서비스는 rds-data 항목을 선택하시면 됩니다. 그리고 DNS 이름 활성화 항목을 체크해 줍니다.

그러면 자동으로 VPC와 AZ, 서브넷, 보안 그룹이 선택되어 지는데요, 지금은 모든 설정값을 default, 정책은 모든 액세스로 하도록 하겠습니다.

Secrets Manager 생성

데이터 API 호출에 사용할 수 있는 보안 암호를 저장하는 데 Secrets Manager을 사용하는 것이 좋습니다. 하드코딩한 암호가 아닌 Secrets Manager API 호출로 일반 텍스트 형식의 보안 암호를 안전하게 사용할 수 있습니다. Secrets Manager 콘솔화면에서 새보안 암호 저장버튼을 눌러 저장해주세요.

Amazon RDS에 대한 자격 증명을 선택하고 자격증명으로써 사용할 사용자 이름과 암호에는 선택한 DB클러스터의 사용자명과 암호를 입력하면 됩니다. 그 다음 보안 암호명을 적고 필요에 따라 태그와 리소스 권한등을 설정할 수 있습니다. 

IAM 역할 생성

Lmabda가 Data API를 통해 Aurora에 접속하기 위해서는 적절한 권한이 필요합니다. 해당 권한이 담긴 IAM 역할을 만들어 Lambda가 Secrets Manager로 보안암호를 가져오고 Data API를 호출할 수 있도록 하겠습니다. 

역할은 AWS에서 제공하고 있는 AmazonRDSDataFullAccess 정책을 선택하여 간단한게 생성할 수 있습니다. IAM 콘솔 화면에서 역할 만들기를 선택합니다. 그 후 AWS 서비스에서 Lambda를 선택한 후 다음으로 넘어가 AmazonRDSDataFullAccess 정책을 선택하여 역할을 만들어 줍니다.

하지만 이 정책은 모든 리소스에 대한 액세스를 허용하기 때문에 생성한 DB 클러스터에 대한 액세스만 허용할 수 있는 권한을 만들 필요가 있습니다.

제한적인 액세스를 허용하는 정책을 가진 역할을 만들고 싶다면 IAM 콘솔의 정책 만들기로 가서 JSON 편집기에 생성한 DB 클러스터의 ARN과 Secrets Manager의 ARN이 포함된 아래의 코드를 입력하고 정책을 생성하면 됩니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SecretsManagerDbCredentialsAccess",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "Secrets Manager ARN"
        },
        {
            "Sid": "RDSDataServiceAccess",
            "Effect": "Allow",
            "Action": [
                "rds-data:BatchExecuteStatement",
                "rds-data:BeginTransaction",
                "rds-data:CommitTransaction",
                "rds-data:RollbackTransaction"
            ],
            "Resource": "DB Cluster ARN"
        }
    ]
}

해당 정책을 생성한 후 AmazonRDSDataFullAccess 역할이 아닌 커스텀 해서 생성한 정책을 역할에 연결하면 됩니다.

Lambda 작성

Data API를 호출할 Lambda 함수를 생성하겠습니다. 콘솔 화면에서 런타임을 Python 3.8로한 함수를 생성해 주세요.

생성이 된 함수를 클릭하여 구성 - 권한 항목에서 편집 버튼을 눌러 설정화면으로 들어갑니다. 기존 역할 항목에서 Lambda에 부여할 역할을 설정합니다. Lambda 함수를 생성하면서 적절한 역할을 설정할 수도 있지만 이렇게 부여된 역할을 변경할 수도 있습니다.

import json
import boto3

def lambda_handler(event, context):
    rdsDataClient = boto3.client('rds-data')
 
    response = rdsDataClient.execute_statement( 
        resourceArn = 'DB Cluster ARN', # DB 클러스터의 ARN
        secretArn='Secrets Manager ARN', # Secrets Manager의 ARN
        database = 'myDatabase', # 없다면 비워도 OK
        sql = 'SQL Query' # 쿼리문 작성
    )
 
    print (response['records'])

코드를 작성 후 Lambda 함수의 테스트를 진행해보겠습니다.

Lambda 함수 실행

Aurora의 ACU가 0인 상태에서 Lambda 함수를 실행하면 time out 에러가 발생할 수도 있습니다. 그 이유는 ACU가 0에서 1이상으로 전환하기 위해 약 25초의 시간이 필요하기 때문입니다. 

콘솔에서 현재의 ACU를 확인한 후 다시 실행해주세요.

저는 show databases; 쿼리를 날려 보았습니다. 클러스터 안에 만들어 놓은 데이터베이스가 없기 때문에 결과는 null이 반환 되었습니다.

이것으로 Lambda Data API 호출하여 Aurora Serverless 사용하는 법을 알아봤습니다. 

참조

Aurora Serverless Data API 사용 공식 문서

Data API execute_statement 작성 문법 boto3 문서

Data API execute_statement 작성 문법 AWS API Reference 문서