Amazon Web Services ブログ

新着情報 – Amazon Aurora Serverless のデータ API

リレーショナルデータベースにアクセスするコードをこれまでに書いたことがあれば、そのドリルを知っているでしょう。接続を開き、そのコードを使用して 1 つ以上の SQL クエリや他のステートメントを処理してから、接続を閉じます。おそらくご自身のオペレーティングシステム、プログラミング言語、データベースに特有のクライアントライブラリを使用したのでしょう。ある時点で、接続の作成には多くの時間がかかり、データベースエンジンのメモリを消費していることに気付き、その直後に接続プールやその他のトリックに対処できる (または対処しなければならなかった) ことがわかった、という話は聞き覚えがありませんか?

上で説明した接続志向モデルは、セットアップ時間を数時間または数日にわたって使える従来の長期実行プログラムに適しています。ただし、頻繁に呼び出され、ミリ秒から数分の時間間隔で実行されるサーバーレス機能には、あまり適していません。長時間稼働しているサーバーがないため、再利用のために接続識別子を格納する場所がありません。

Aurora Serverless Data API
サーバーレスアプリケーションとリレーショナルデータベース間のこの不一致を解決するために、Amazon Aurora Serverless のMySQL 互換バージョン用の Data API をローンチします。この API により、従来の接続管理に伴う複雑さとオーバーヘッドから解放され、Amazon Aurora Serverless Database インスタンスにアクセスして変更する SQL ステートメントを迅速かつ簡単に実行することができます。

Data API は、従来のアプリケーションとサーバーレスアプリケーションの両方のニーズを満たすように設計されています。データベースへの長期的な接続の管理とスケーリングを行い、データを JSON 形式で返して簡単に解析できるようにします。すべてのトラフィックは安全な HTTPS 接続を介して流れます。含まれる機能は以下のとおりです。

ExecuteStatement – オプションのトランザクション内で単一の SQL ステートメントを実行します。

BatchExecuteStatement – オプションのトランザクション内で、データの配列全体にわたって単一の SQL ステートメントを実行します。

BeginTransaction – トランザクションを開始し、トランザクション識別子を返します。トランザクションは短くなることが予想されます (通常 2〜5 分)。

CommitTransaction – トランザクションを終了し、その中で行われた操作をコミットします。

RollbackTransaction – トランザクション内で行われた操作をコミットせずにトランザクションを終了します。

各機能は 1 分以内に完了するまで実行する必要があり、最大 1 メガバイトのデータを返すことができます。

データ API を使用する
Data API は Amazon RDS コンソールやコマンドラインから、または前述の関数を呼び出すコードを書くことによって使用できます。この記事では、3 つ全部を紹介します。

Data API は本当に使いやすいですよ! 最初のステップは、目的の Amazon Aurora サーバーレスデータベースに対して有効にすることです。Amazon RDS コンソールを開き、クラスターを見つけて選択し、[変更] をクリックします。

次に、[ネットワークとセキュリティ] セクションまでスクロールし、[データ API] をクリックして、[続行] をクリックします。

次のページですぐに設定を適用することを選択し、[クラスターの変更] をクリックします。

ここでデータベースにアクセスするために必要な資格情報を格納するための秘密を作成する必要があります。Secrets Manager コンソールを開き、[新しい秘密の保存] をクリックします。[RDS の認証情報] を選択したままにし、有効なデータベースユーザー名とパスワードを入力し、必要に応じてデフォルト以外の暗号化キーを選択してから、サーバーレスデータベースを選択します。その後 [次へ] をクリックします。

秘密に名前を付けてタグを付け、[次へ] をクリックして設定します。

次のページでデフォルト値を使用し、もう一度 [次へ] をクリックすると、まったく新しい秘密を持っています。

データベース用と秘密用に ARN が 2 つ必要になりました。まずデータベース用にコンソールから両方を取得します。

そして秘密用に、

ARN のペア (データベースと秘密) からデータベースへのアクセス権が提供され、それに応じてその ARN のペアを保護します。

Amazon RDS コンソールから Data API を使用する
Amazon RDS コンソールのクエリエディターを使用して、Data API を呼び出すクエリを実行できます。コンソールを開き、[クエリエディタ―] をクリックして、データベースへの接続を作成します。クラスターを選択し、資格情報を入力して、目的のテーブルを事前に選択します。次に、[データベースに接続] をクリックして続行します。

クエリを入力して [実行] をクリックし、エディタ内に結果を表示します。

コマンドラインから Data API を使用する
Data 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"
}

Data 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 で Data 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 サーバーレスクラスターは、アクティブでないときに容量をゼロにスケールダウンするように設定されていました。この記事を書いてクエリを実行している間のスケーリングアクティビティは次のようになります。

今すぐ利用可能
米国東部 (バージニア北部)、米国東部 (オハイオ)、米国西部 (オレゴン)、アジアパシフィック (東京)、および欧州 (アイルランド) リージョンで Data API を今すぐ利用できます。API には料金はかかりませんが、AWS からのデータ転送には通常料金がかかります。

Jeff;