Serverless v2 とプロビジョニングされた Amazon Aurora PostgreSQL で RDS Data API がサポートされました

新しい Aurora PostgreSQL でも RDS Data API が利用可能になりました。Aurora MySQL はまだです。東京には来ていますが、大阪もまだです。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

Amazon Aurora PostgreSQL の Serverless v2 とプロビジョニングで RDS Data API がサポートされたのでレポートします。

Amazon Aurora PostgreSQL now supports RDS Data API

Aurora の RDS Data API

RDS Data API は Aurora に対して HTTP 経由でアクセスを行う機能で、Lambda 等から直接アクセスしたり、AWS AppSync とのインテグレーションで利用されていました。今までは Aurora Serverless v1 のみで利用できるものでした。 Aurora Serverless v1 は専用の Aurora クラスタが必要で、プロビジョニングされたインスタンスと併用ができず、対応している DB エンジンも Aurora MySQL version 2(MySQL 5.7 互換)と Aurora PostgreSQL 11、Aurora PostgreSQL 13 のみとなっており古いバージョンのみで利用できるものでした。

今回 Serverless v2 とプロビジョニングされた Aurora PostgreSQL で RDS Data API が利用できる様になり、PostgreSQL 15 の通常の Aurora クラスタでも利用できるようになります。

利用可能なリージョン

現時点では以下のリージョンで Serverless v2 とプロビジョニングされた Aurora PostgreSQL で RDS Data API が利用できます。

  • 米国東部 (バージニア北部)
  • 米国西部 (オレゴン)
  • アジアパシフィック (東京)
  • ヨーロッパ (フランクフルト)

制限事項

  • Data API のクエリは DB クラスタのライターインスタンスに対してのみ実行できます。
  • Aurora Global Database を使用してプライマリ DB クラスタとセカンダリ DB クラスタの両方で Data API を有効にできます。しかし、セカンダリクラスタはプライマリに昇格するまでライターインスタンスがありません。したがって、セカンダリへの Data API クエリは失敗します。セカンダリが昇格して利用可能なライターインスタンスがあれば、Data API クエリが成功するはずです。
  • Performance Insights は Data API を使用したデータベース クエリの監視をサポートしていません。
  • Data API は T DB インスタンス クラスをサポートしていません。
  • Aurora PostgreSQL Serverless v2 とプロビジョニングされた DB クラスターの場合 RDS Data API は列挙型をサポートしません。

旧 Serverless v1 との違い

違い Serverless v2 とプロビジョニング Serverless v1
1 秒あたりの最大リクエスト数 無制限 1,000
Data API の有効化または無効化 RDS API: EnableHttpEndpoint と DisableHttpEndpoint
AWS CLI: enable-http-endpoint と disable-http-endpoint
|RDS API: ModifyDBCluster の EnableHttpEndpoint パラメータ
AWS CLI: modify-db-cluster の --enable-http-endpoint と --no-enable-http-endpoint オプション
CloudTrail イベント デフォルトで証跡から自動的に除外されるデータ イベント デフォルトで自動的に証跡に含まれる管理イベント
マルチステートメント サポートされておらず例外をスローします Aurora PostgreSQL の場合は最初のクエリ応答のみを返す。Aurora MySQL の場合はサポートされていません。
BatchExecuteStatement 更新結果の生成フィールドのオブジェクトは空 更新結果の生成フィールドのオブジェクトは挿入した値
ExecuteSQL サポートされていません 廃止されました
ステートメントの実行 多次元配列カラムの取得をサポートしていません。幾何データ型や通貨型など一部のデータタイプをサポートしていません。 多次元配列カラムとすべての高度なデータ型の取得をサポートしています

サポートしているデータ型

次のデータ型のみサポートされています。

  • BOOL
  • BYTEA
  • DATE
  • DECIMAL,NUMERIC
  • FLOAT8,DOUBLE PRECISION
  • INT, INT4, SERIAL
  • INT2, SMALLINT, SMALLSERIAL
  • INT8, BIGINT, BIGSERIAL
  • JSONB,JSON
  • REAL,FLOAT
  • TEXT, CHAR(N), VARCHAR, NAME
  • TIME
  • TIMESTAMP
  • UUID
  • VECTOR

次の配列型のみサポートされています。

  • BOOL[],BIT[]
  • DATE[]
  • DECIMAL[],NUMERIC[]
  • FLOAT8[],DOUBLE PRECISION[]
  • INT[],INT4[]
  • INT2[]
  • INT8[],BIGINT[]
  • JSON[]
  • REAL[],FLOAT[]
  • TEXT[], CHAR(N)[], VARCHAR[], NAME[]
  • TIME[]
  • TIMESTAMP[]
  • UUID[]

時刻データ型では without time zone しかサポートされていないため注意が必要です。

やってみる

Aurora クラスタの準備

まずは Aurora クラスタを起動します。

ここでは Aurora PostgreSQL のデフォルトバージョンの 15.3 を指定します。

RDS Data API では Secrets Manager を使用して、AWS Secret Manager によるマスター認証管理を有効にします。

RDS Data API を有効にします。

Aurora クラスタが起動するまで待ちます。

必要に応じて PrivateLink でプライベートなエンドポイントを作成して Data API を利用できます。

クエリを実行する

ここでは CloudShell からコマンドを実行してみます。AWS CLI のバージョンは 2.15.2 でした。

$ aws --version
aws-cli/2.15.2 Python/3.11.6 Linux/6.1.61-85.141.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023 prompt/off

今日の日付を確認してみます。

$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --database 'postgres' --sql "select CURRENT_DATE"
{
    "records": [
        [
            {
                "stringValue": "2023-12-24"
            }
        ]
    ],
    "numberOfRecordsUpdated": 0
}

現在時刻を確認しようとCURRENT_TIMESTAMPを実行するとエラーが発生します。TIMESTAMPTZ(timestamp with time zone)はサポートされていません。

$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --database 'postgres' --sql "select CURRENT_TIMESTAMP"

An error occurred (UnsupportedResultException) when calling the ExecuteStatement operation: The result contains the unsupported data type TIMESTAMPTZ.

テーブルを作成してみます。

$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --database 'postgres' --sql "create table sample_table (col1 int, col2 varchar(20), col3 timestamp without time zone)"
{
    "numberOfRecordsUpdated": 0,
    "generatedFields": []
}

データを挿入します。

$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --database 'postgres' --sql "insert into sample_table (col1, col2, col3) values (1, 'TEST', now())"
{
    "numberOfRecordsUpdated": 1,
    "generatedFields": []
}

挿入したデータを確認します。

$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --database 'postgres' --sql "select * from sample_table"
{
    "records": [
        [
            {
                "longValue": 1
            },
            {
                "stringValue": "TEST"
            },
            {
                "stringValue": "2023-12-24 04:41:04.355527"
            }
        ]
    ],
    "numberOfRecordsUpdated": 0
}

トランザクションも確認してみます。トランザクション制御はBeginTransactionCommitTransactionRollbackTransactionの各種 API で行い、AWS CLI ではaws rds-data begin-transactionaws rds-data commit-transactionaws rds-data rollback-transactionとなります。

トランザクションを開始してtransactionIdを取得します。

$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --database "postgres"
{
    "transactionId": "A1B2C3D4e5f6g7h8I1J2K3L4m5n6o7p8Q1R2S3T4u5v6w7x8a1b2c3d4E5F6G7H8i1j2k3l4M5N6O7P8q1r2s3t4"
}

--transaction-idオプションでtransactionIdを指定してクエリを実行します。

$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --database "postgres" --sql "insert into sample_table (col1, col2, col3) values (2, 'Transaction', now())" \
> --transaction-id "A1B2C3D4e5f6g7h8I1J2K3L4m5n6o7p8Q1R2S3T4u5v6w7x8a1b2c3d4E5F6G7H8i1j2k3l4M5N6O7P8q1r2s3t4"
{
    "numberOfRecordsUpdated": 1,
    "generatedFields": []
}

--transaction-idオプションを指定せずにデータを確認すると挿入したレコードを参照できません。

$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --database "postgres" --sql "select * from sample_table"
{
    "records": [
        [
            {
                "longValue": 1
            },
            {
                "stringValue": "TEST"
            },
            {
                "stringValue": "2023-12-24 04:41:04.355527"
            }
        ]
    ],
    "numberOfRecordsUpdated": 0
}

トランザクションをコミットして、再度--transaction-idオプションを指定せずにデータを確認すると挿入したレコードを参照できます。

$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --transaction-id "A1B2C3D4e5f6g7h8I1J2K3L4m5n6o7p8Q1R2S3T4u5v6w7x8a1b2c3d4E5F6G7H8i1j2k3l4M5N6O7P8q1r2s3t4"
{
    "transactionStatus": "Transaction Committed"
}
$ aws rds-data execute-statement --resource-arn 'arn:aws:rds:ap-northeast-1:123456789012:cluster:database-pg-data-api1' \
> --secret-arn 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-a1b2c3d4-a12b-c3b4-e5f6-a1b2c3d4e5f6-a1b2c3' \
> --database "postgres" --sql "select * from sample_table"
{
    "records": [
        [
            {
                "longValue": 1
            },
            {
                "stringValue": "TEST"
            },
            {
                "stringValue": "2023-12-24 04:41:04.355527"
            }
        ],
        [
            {
                "longValue": 2
            },
            {
                "stringValue": "Transaction"
            },
            {
                "stringValue": "2023-12-24 04:57:20.263227"
            }
        ]
    ],
    "numberOfRecordsUpdated": 0
}

さいごに

Aurora の DB エンジンはバージョンアップを重ねていますが、以前のバージョンで使用できた機能が利用できないためバージョンアップが難しい場合がありました。Multi-Master や RDS Data API は以前のバージョンのみでした。Multi-Master は類似の Aurora Limitless Database で代替できそうですが、RDS Data API については代替手段がなく気に病んでいました。今回の対応により新しいバージョンでも RDS Data API が利用可能になりました。後は Aurora MySQL での対応なので、期待して待ちます。