MySQL 互換 Aurora Serverless の Data API を AWS SDK for Ruby で実行してみる

## はじめに

[Amazon Aurora Serverless の Data API](https://aws.amazon.com/jp/blogs/news/new-data-api-for-amazon-aurora-serverless/) が MySQL 互換のバージョンで使えるようになっていますね。

どんな形で使えるのか、AWS SDK for Ruby で実行して試してみました。

## 前提

以下は準備できていることとします。

* Amazon Aurora: MySQL 互換 のインスタンス
* Aurora のキャパシティタイプ: Serverless
* Web Service Data API: 有効化
* AWS SDK for Ruby V3 が使えるようになっている

※ Amazon Aurora は無料では利用できないようですので、[料金](https://aws.amazon.com/jp/rds/aurora/pricing/)など確認の上検証してください。

## tl;dr

以下のような形でできました。

```ruby:sample.rb
require 'aws-sdk'

# 認証情報設定
Aws.config.update({
  credentials: Aws::Credentials.new('AWS_ACCESS_KEY', 'AWS_SECRET_ACCESS_KEY')
})

# Data API から SQL 実行
client = Aws::RDSDataService::Client.new(region: 'ap-northeast-1')
resp = client.execute_statement({
  secret_arn: "arn:aws:secretsmanager:ap-northeast-1:000000000000:secret:rds-db-credentials/xxxx", # Aurora クラスター作成時の暗号化キーの ARN(Secrets Manager で確認可能)
  resource_arn: "arn:aws:rds:ap-northeast-1:000000000000:cluster:xxx", # Aurora クラスターの ARN
  sql: "select TABLE_SCHEMA, TABLE_NAME from information_schema.tables LIMIT 3;", # 検証用 SQL
})

# レスポンスを表示
resp.records.each do |record|
  puts "#{record[0].string_value} #{record[1].string_value}"
end
```

上記を実行すると、以下のようなレスポンスが返却されます。

```bash
$ ruby sample.rb

information_schema CHARACTER_SETS
information_schema COLLATIONS
information_schema COLLATION_CHARACTER_SET_APPLICABILITY
```

## レスポンスについて

レスポンスは [Aws::RDSDataService::Types::ExecuteStatementResponse](https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/api/Aws/RDSDataService/Types/ExecuteStatementResponse.html) クラスのオブジェクトで返却されます。

そのオブジェクトの中の [records](https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/api/Aws/RDSDataService/Types/ExecuteStatementResponse.html#records-instance_method) メソッドで `Array<Array<Types::Field>>`という形の2次元配列が取得できます。

1つ1つのデータは、[Aws::RDSDataService::Types::Field](https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/api/Aws/RDSDataService/Types/Field.html) クラスのオブジェクトで表されています。今回は `string_value` メソッドから値を取得できました。


## ハマったエラー

### Aws::Errors::MissingCredentialsError: unable to sign request without credentials set

実行するときはアクセスキーを指定しましょう。
参考 issue: https://github.com/aws/aws-sdk-ruby/issues/1951

```ruby
Aws.config.update({
  credentials: Aws::Credentials.new('ACCESS_KEY', 'SECRET_ACCESS_KEY')
})
```

### Aws::RDSDataService::Errors::BadRequestException: This API is deprecated and not available. Use ExecuteStatement API instead

`execute_sql` メソッドは [deprecated](https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/api/Aws/RDSDataService/Client.html#execute_sql-instance_method) のようです。

## おわりに

AWS SDK for Ruby で Aurora Serverless の Data API を実行することができました。
便利に使うにはここからデータの加工が必要かもしれませんが、最低限確認出来てよかったです。

## 参考

* [Class: Aws::RDSDataService::Client — AWS SDK for Ruby V3](https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/api/Aws/RDSDataService/Client.html)
* [新着情報 – Amazon Aurora Serverless のデータ API | Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/new-data-api-for-amazon-aurora-serverless/)
* [Aurora Serverlessが一般利用可能になったので試してみた ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/aurora-serverless-mysql-generally-available/)