AWS CLIによるRDS Data APIの実行

前回作成したAurora PostgreSQL Serverless v2に対して、動作確認のためAWS CLIを用いてRDS Data APIを実行してみる。

環境

AWS CLI v2.15.30、jq v1.7.1。シェルスクリプトはGit for Windows v2.42.0.windows.1のGit Bashで実行。

サンプルコード

以下、実行用のシェルスクリプト。クエリAPIを使えばもっときれいに書けそうだが、面倒だったのでjqで値を抽出している。

前回、RDSのクエリエディタを実行できたIAMユーザーであれば実行可能。

#!/bin/bash

DATABASE_NAME=aurora_serverless_example
STACK_NAME=BackendStack

# DBクラスターのARN、シークレットのARNが必要
AURORA_CLUSTER_ARN=$(aws rds describe-db-clusters |
  jq -r ".DBClusters[] | select (.DatabaseName | contains(\"${DATABASE_NAME}\")) | .DBClusterArn"
)

# Secrets Managerからの取得に使えそうな情報がないので、Descriptionで抽出
AURORA_SECRET_ARN=$(aws secretsmanager list-secrets |
  jq -r ".SecretList[] | select (.Description | contains(\"Generated by the CDK for stack: ${STACK_NAME}\")) | .ARN"
)

aws rds-data execute-statement \
  --database "${DATABASE_NAME}" \
  --resource-arn "${AURORA_CLUSTER_ARN}" \
  --secret-arn "${AURORA_SECRET_ARN}" \
  --format-records-as 'JSON' \
  --sql 'SELECT user_id, user_name FROM example.users ORDER BY user_id;'

execute-statementの説明

aws rds-data execute-statement で、SQLの実行が可能。デフォルトリージョン以外に対して実行する場合、 --region <リージョン名> で変更できる。

必須のオプションは --resource-arn <DBクラスターARN>--secret-arn <DB接続用Sercret ARN>--sql <実行SQL> の3つ。

--database は接続するデータベース名、 --format-records-as はレスポンスの形式。デフォルトの NONEJSON の2種類だが、NONEだと結果に列名が含まれないため、JSONを指定しておく。

--schema オプションも宣言されているが、現時点では使用できない。

$ aws rds-data execute-statement help | grep schema
   [--schema <value>]
"--schema" (string)
   The name of the database schema.
   Note: Currently, the "schema" parameter isn't supported.

試しに指定すると、以下のエラーが発生した。

An error occurred (ValidationException) when calling the ExecuteStatement operation: The schema parameter isn't supported.

実行結果

以下の結果が返る。 formattedRecords に、文字列として結果が返ってくる。

{"numberOfRecordsUpdated":0,"formattedRecords":"[{\"user_id\":1,\"user_name\":\"user1\"},{\"user_id\":2,\"user_name\":\"user2\"},{\"user_id\":3,\"user_name\":\"user3\"}]"}

なお、 --format-records-as を指定しない場合、以下の結果が返る。JSON形式だが、列名が含まれない。

{"records":[[{"longValue":1},{"stringValue":"user1"}],[{"longValue":2},{"stringValue":"user2"}],[{"longValue":3},{"stringValue":"user3"}]],"numberOfRecordsUpdated":0}

どちらも微妙に使いにくいが、列名が含まれないよりは文字列で返ってくるほうが扱いやすいと思う。

振り返り

スキーマ指定ができなかったり、実行結果のフォーマットがいまいちだったりと、まだまだこなれていない印象。

スキーマ指定だけでも実装してもらえるとありがたいなぁ。