Amazon Web Services 한국 블로그

Amazon Aurora Serverlee를 위한 Data API 정식 출시

관계형 데이터베이스(RDBMS)를 활용하는 프로그램 코드를 개발하는 사람이라면, DB 연결을 열고,  하나 이상의 SQL 쿼리나 다른 명령문을 처리한 후에 연결을 닫는 절차를 거칩니다. 이를 위해 운영 체제, 프로그래밍 언어, 데이터베이스에 특정한 클라이언트 라이브러리를 사용할 필요가 있습니다. 어떤 시점에 되면 연결을 생성하는 작업은 시간도 많이 들고, 데이터베이스 엔진에서 메모리도 소비한다는 사실을 알게 되고, 이를 해결하기 위해 연결 풀링과 다른 작업들도 처리해야 합니다.

위에서 설명한 연결 중심 모델은, 설정 시간이 몇 시간, 심지어 며칠에 걸쳐 분할되는 기존의 장기 실행 프로그램에 적합합니다. 그러나, 빈번하게 호출되고, 밀리초에서 분 단위의 시간 간격으로 실행되는 서버리스 기능에는 그다지 적합하지 않습니다.

Aurora 서버리스 데이터 API 소개

서버리스 애플리케이션과 관계형 데이터베이스 사이의 이러한 불일치를 해결하기 위해 AWS는 Amazon Aurora 서버리스의 MySQL 호환 버전을 위한 데이터 API를 출시했습니다. 이 API를 사용하면 기존 연결 관리에서 발생하는 오버헤드와 복잡성에서 벗어날 수 있으며, Amazon Aurora 서버리스 데이터베이스 인스턴스에 액세스하고 이를 수정하는 SQL 문을 빠르게 쉽게 실행할 수 있습니다.

데이터 API는 기존 및 서버리스 앱 모두의 요구를 충족하도록 설계되었습니다. 데이터베이스에 대한 장기 연결을 관리하고 규모를 조정하며, 간편한 구문 분석을 위해 JSON 양식으로 데이터를 반환합니다. 모든 트래픽은 보안 HTTPS 연결에서 실행됩니다. 이 서비스에는 다음과 같은 기능이 포함됩니다.

  • ExecuteStatement – 선택적으로 트랜잭션 내부에서 단일 SQL 문을 실행합니다.
  • BatchExecuteStatement – 선택적으로 트랜잭션 내부에서 데이터 배열에 대해 단일 SQL 문을 실행합니다.
  • BeginTransaction – 트랜잭션을 시작하고 트랜잭션 식별자를 반환합니다. 트랜잭션은 짧을 것으로 예상됩니다(보통 2 – 5분).
  • CommitTransaction – 트랜잭션을 종료하고 트랜잭션 내부에서 수행된 작업을 커밋합니다.
  • RollbackTransaction – 트랜잭션 내부에서 수행된 작업을 커밋하지 않고 트랜잭션을 종료합니다.

각 함수는 1분 안에 완료하도록 실행되어야 하며, 최대 1MB의 데이터를 반환할 수 있습니다.

데이터 API 사용하기

Amazon RDS 콘솔 또는 명령줄을 사용하거나 위에서 설명한 함수를 호출하는 코드를 작성하여 데이터 API를 사용할 수 있습니다. 이 게시물에서는 세 가지 방법을 모두 설명합니다.

데이터 API는 사용하기 쉽습니다! 첫 번째 단계는, 원하는 Amazon Aurora 서버리스 데이터베이스에서 이 API를 활성화하는 것입니다. Amazon RDS 콘솔을 열고 클러스터를 찾아 선택하고 [Edit]을 클릭합니다.

그런 다음, [네트워크 및 보안] 섹션으로 내려가 [Data API]를 클릭하고 [Continue]을 클릭합니다.

다음 페이지에서 설정을 즉시 적용하도록 선택하고 [Modify Cluster]을 클릭합니다.

이제 데이터베이스에 액세스하는 데 필요한 자격 증명을 저장할 보안 암호를 생성해야 합니다. Secrets Manager 콘솔을 열고 [새 보안 암호 저장]을 클릭합니다. [RDS에 대한 자격 증명]을 선택한 상태로 두고, 유효한 데이터베이스 사용자 이름 및 암호를 입력하고 선택적으로 기본이 아닌 암호화 키를 선택한 다음, 서버리스 데이터베이스를 선택합니다. 그런 다음, [다음]을 클릭합니다.

보안 암호 이름을 지정하고 여기에 태그를 지정하고, [Next]을 클릭하여 구성합니다.

다음 페이지에서 기본값을 사용하고, 다시 [Next]을 클릭합니다 이제 새 보안 암호가 생성됩니다.

이제 데이터베이스와 보안 암호에 대해 하나씩 두 개의 ARN이 있습니다. 콘솔에서 둘 다 가져옵니다. 먼저 데이터베이스의 ARN을 가져옵니다.

그런 다음, 보안 암호의 ARN을 가져옵니다.

ARN 페어(데이터베이스 및 보안 암호)에서는 내게 데이터베이스에 대한 액세스를 제공하므로, 적절히 보호할 수 있습니다!

RDS 콘솔에서 데이터 API 사용

Amazon RDS 콘솔에서 Query Editor를 사용하여 데이터 API를 호출하는 쿼리를 실행할 수 있습니다. 콘솔을 열고 Query Editor를 클릭하고 데이터베이스에 대한 연결을 생성합니다. 클러스터를 선택하고 자격 증명을 입력한 후, 원하는 테이블을 미리 선택합니다. [Connect to database]를 클릭하여 계속 진행합니다.

쿼리를 입력하고 [Run]을 클릭합니다. 편집기에서 결과를 볼 수 있습니다.

명령줄에서 데이터 API 사용

명령줄에서 데이터 API를 연습할 수 있습니다.

$ aws rds-data execute-statement \
  --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:aurora-serverless-data-api-sl-admin-2Ir1oL" \
  --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:aurora-sl-1" \
  --database users \
  --sql "show tables" \
  --output json

jq를 사용하여 원하는 결과 부분을 선택할 수 있습니다.

... | jq .records
[
  {
    "values": [
      {
        "stringValue": "users"
      }
    ]
  }
]

테이블을 쿼리하고 결과를 가져올 수 있습니다. SQL 문은 다음과 같습니다. "select * from users where userid='jeffbarr'"):

... | jq .records
[
  {
    "values": [
      {
        "stringValue": "jeffbarr"
      },
      {
        "stringValue": "Jeff"
      },
      {
        "stringValue": "Barr"
      }
    ]
  }

--include-result-metadata를 지정하면 쿼리는 결과의 열을 설명하는 데이터도 반환합니다. 간단한 설명을 위해 첫 번째 항목만 표시합니다.

... | jq .columnMetadata[0]
{
  "type": 12,
  "name": "userid",
  "label": "userid",
  "nullable": 1,
  "isSigned": false,
  "arrayBaseColumnType": 0,
  "scale": 0,
  "schemaName": "",
  "tableName": "users",
  "isCaseSensitive": false,
  "isCurrency": false,
  "isAutoIncrement": false,
  "precision": 15,
  "typeName": "VARCHAR"
}

데이터 API는 트랜잭션에서 일련의 명령문을 래핑하고 커밋하거나 롤백할 수 있습니다. 다음에 이 작업을 수행합니다. 간단한 설명을 위해 --secret-arn--resource-arn은 생략합니다.

$ $ID=`aws rds-data begin-transaction --database users --output json | jq .transactionId`
$ echo $ID
"ATP6Gz88GYNHdwNKaCt/vGhhKxZs2QWjynHCzGSdRi9yiQRbnrvfwF/oa+iTQnSXdGUoNoC9MxLBwyp2XbO4jBEtczBZ1aVWERTym9v1WVO/ZQvyhWwrThLveCdeXCufy/nauKFJdl79aZ8aDD4pF4nOewB1aLbpsQ=="

$ aws rds-data execute-statement --transaction-id $ID --database users --sql "..."
$ ...
$ aws rds-data execute-statement --transaction-id $ID --database users --sql "..."
$ aws rds-data commit-transaction $ID

커밋하지 않는다면 대신, rollback-transaction을 호출합니다.

Python 및 Boto에서 데이터 API 사용

API이므로 프로그래밍 방식이 쉽습니다. 다음은 매우 간단한 Python/Boto 코드입니다.

import boto3

client = boto3.client('rds-data')

response = client.execute_sql(
    secretArn   = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:aurora-serverless-data-api-sl-admin-2Ir1oL',
    database    = 'users',
    resourceArn = 'arn:aws:rds:us-east-1:123456789012:cluster:aurora-sl-1',
    sql         = 'select * from users'
)

for user in response['records']:
  userid     = user[0]['stringValue']
  first_name = user[1]['stringValue']
  last_name  = user[2]['stringValue']
  print(userid + ' ' + first_name + ' ' + last_name)

다음은 출력입니다.

$ python data_api.py
jeffbarr Jeff Barr
carmenbarr Carmen Barr

실제 프로덕션 품질의 코드는 응답의 일부로 반환되는 메타데이터를 사용하여 기호를 통해 테이블 열을 참조합니다.

그리고 여기서 사용되는 Amazon Aurora 서버리스 클러스터는 활성 상태가 아니면 용량을 완전히 축소하도록 구성되었습니다. 다음은 이 게시물을 작성하면서 쿼리를 실행하는 동안 조정 활동입니다.

정식 출시

현재 데이터 API는 미국 동부(버지니아), 미국 동부(오하이오), 미국 서부(오레곤), 아시아 태평양(도쿄)EU(아일랜드) 리전에서 사용할 수 있습니다. API에 대한 요금은 없지만, AWS 외부로 데이터를 전송하는 경우 일반 요금이 청구됩니다.

Jeff;