今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、雑に「RDS Data API」について調べてみるの日。

目次

雑とは

1時間ぐらいで調べてた情報をサクッとまとめた内容。

とある日

最近出たアップデートで、今後有用そうだったのでRDS Data API について調べてみる。

Amazon Aurora PostgreSQL が RDS Data API をサポート開始

わかったこと

  • RDSへの Web サービスインターフェイス
  • Data API への呼び出しはすべて同期
  • クラスターに対して有効化必要
  • DB クラスター内のライターインスタンスに対してのみ実行
  • Performance Insights は、Data API を使用して作成したデータベース クエリの監視をサポートしていません
  • AWS CLIAWS SDKから実行できる
  • AWS Secrets Manager からシークレットの値を取得する

RDS Data APIとは

Web サービスインターフェイス

RDS Data API (Data API) を使用すると、Aurora DB クラスターへの Web サービスインターフェイスを操作できます。Data API では、DB クラスターへの永続的な接続は必要ありません。代わりに、安全な HTTP エンドポイントと AWS SDK との統合が提供されます。エンドポイントを使用すると、接続を管理せずに SQL ステートメントを実行できます。

Using RDS Data API - Amazon Aurora

使い方

RDS データ API の使用 - Amazon Aurora

SQL

aws rds-data execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \
--database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" \
--sql "select * from mytable"

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

バッチ

aws rds-data batch-execute-statement --resource-arn "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster" \
--database "mydb" --secret-arn "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret" \
--sql "insert into mytable values (:id, :val)" \
--parameter-sets "[[{\"name\": \"id\", \"value\": {\"longValue\": 1}},{\"name\": \"val\", \"value\": {\"stringValue\": \"ValueOne\"}}],
[{\"name\": \"id\", \"value\": {\"longValue\": 2}},{\"name\": \"val\", \"value\": {\"stringValue\": \"ValueTwo\"}}],
[{\"name\": \"id\", \"value\": {\"longValue\": 3}},{\"name\": \"val\", \"value\": {\"stringValue\": \"ValueThree\"}}]]"

AWS SDK

import boto3

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

cluster_arn = 'arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster'
secret_arn = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret'

response1 = rdsData.execute_statement(
            resourceArn = cluster_arn,
            secretArn = secret_arn,
            database = 'mydb',
            sql = 'select * from employees limit 3')

print (response1['records'])
[
    [
        {
            'longValue': 1
        },
        {
            'stringValue': 'ROSALEZ'
        },
        {
            'stringValue': 'ALEJANDRO'
        },
        {
            'stringValue': '2016-02-15 04:34:33.0'
        }
    ],
    [
        {
            'longValue': 1
        },
        {
            'stringValue': 'DOE'
        },
        {
            'stringValue': 'JANE'
        },
        {
            'stringValue': '2014-05-09 04:34:33.0'
        }
    ],
    [
        {
            'longValue': 1
        },
        {
            'stringValue': 'STILES'
        },
        {
            'stringValue': 'JOHN'
        },
        {
            'stringValue': '2017-09-20 04:34:33.0'
        }
    ]
]

参考資料

制限はそこそこあるがAPIベースで処理できるので助かる人は多そう。