

# Aurora Serverless v2 およびプロビジョニングされたクラスターの Amazon RDS Data API の動作と Aurora Serverless v1 クラスターの比較
<a name="data-api.differences"></a>

Amazon RDS Data API の最新の機能強化により、PostgreSQL または MySQL エンジンの最新バージョンを使用しているクラスターでデータ API を利用できるようになりました。これらのクラスターは、Aurora Serverless v2 を使用するように設定するか、`db.r6g` または `db.r6i` などのプロビジョニングされたインスタンスクラスを使用するように設定できます。

次のセクションは、Aurora Serverless v2 とプロビジョニングされた DB クラスター、および Aurora Serverless v1 DB クラスター間の Amazon RDS Data API の違いについて説明します。Aurora Serverless v1DB クラスターは `serverless` エンジンモードを使用します。プロビジョンド DB クラスターは `provisioned` エンジンモードを使用します。Aurora Serverless v2 DB クラスターも `provisioned` エンジンモードを使用し、`db.serverless` インスタンスクラスを持つ 1 つ以上の Aurora Serverless v2 DB インスタンスを含みます。

## 1 秒あたりの最大リクエスト数。
<a name="data-api.differences-requests"></a>

**Aurora Serverless v1**

Data API は、1 秒あたり最大 1,000 リクエストを行うことができます。

**Aurora Serverless v2**

データ API は、1 秒あたり無制限の数のリクエストを行うことができます。

## 既存のデータベースで Amazon RDS Data API を有効化または無効化
<a name="data-api.differences-enable-disable"></a>

**Aurora Serverless v1**
+ **Amazon RDS API を使用する場合** − `ModifyCluster` オペレーションを使用し、適用される `EnableHttpEndpoint` パラメータに `True` または `False` を指定します。
+ **AWS CLI を使用する場合** – 適用される `--enable-http-endpoint` または `--no-enable-http-endpoint` オプションを指定して、`modify-db-cluster` オペレーションを使用します。

**Aurora Serverless v2**
+ **Amazon RDS API を使用する場合** – `EnableHttpEndpoint` および `DisableHttpEndpoint` オペレーションを使用します。
+ **AWS CLI を使用する場合**: `enable-http-endpoint` および `disable-http-endpoint` オペレーションを使用します。

## CloudTrail のイベント
<a name="data-api.differences-ct-events"></a>

**Aurora Serverless v1**

Data API コールからのイベントは管理イベントです。これらのイベントは、デフォルトで証跡で自動的に含まれます。詳細については、「[AWS CloudTrail の証跡からの Data API イベントの除外 (Aurora Serverless v1 のみ)](logging-using-cloudtrail-data-api.md#logging-using-cloudtrail-data-api.excluding-cloudtrail-events)」を参照してください。

**Aurora Serverless v2**

Data API コールからのイベントはデータイベントです。これらのイベントは、デフォルトで証跡で自動的に除外されます。詳細については、「[AWS CloudTrail の証跡からの Data API イベントの包含](logging-using-cloudtrail-data-api.md#logging-using-cloudtrail-data-api.including-cloudtrail-events)」を参照してください。

## マルチステートメントのサポート
<a name="data-api.differences-multistatement"></a>

**Aurora Serverless v1**
+ Aurora MySQL では、マルチステートメントはサポートされていません。
+ Aurora PostgreSQL の場合、マルチステートメントは最初のクエリレスポンスのみを返します。

**Aurora Serverless v2**

マルチステートメントはサポートされていません。1 回の API コールで複数のステートメントを実行しようとすると、`“An error occurred (ValidationException) when calling the ExecuteStatement operation: Multistatements aren't supported.”` が返されます。複数のステートメントを実行するには、別々の `ExecuteStatement` API コールを実行するか、バッチ処理用の `BatchExecuteStatement` を使用します。

次の例は、マルチステートメントの実行を試みる API コールの結果のエラーメッセージを示しています。

```
 aws rds-data execute-statement \    
    --resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \    
    --secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \    
    --database "your_database" \
    --sql "SELECT * FROM your_table; Select * FROM next_table;
                                
                                "An error occurred (ValidationException) when calling the ExecuteStatement operation: Multistatements aren't supported.
```

次の例では、個別の `ExecuteStatement` API コールを使用して複数のステートメントを実行します。

```
aws rds-data execute-statement \
    --resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \
    --secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \
    --database "your_database" \
    --sql "SELECT * FROM your_table;"

aws rds-data execute-statement \
    --resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \
    --secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \
    --database "your_database" \
    --sql "SELECT * FROM next_table;"
```

## 同じトランザクション ID に対する同時リクエスト
<a name="data-api.differences-concurrent-requests-transaction"></a>

**Aurora Serverless v1**

後続のリクエストは、現在のリクエストが終了するまで待機します。待機時間が長すぎる場合、アプリケーションはタイムアウトエラーを処理する必要があります。

**Aurora Serverless v2**

Data API は、同じトランザクション ID を持つ複数のリクエストを受信すると、すぐに次のエラーを返します。

`DatabaseErrorException: Transaction is still running a query`

このエラーは、次の 2 つの状況で発生します。
+ アプリケーションが、同じトランザクション ID を使用して非同期リクエスト (JavaScript promise など) を行う場合。
+ そのトランザクション ID を持つ以前のリクエストは、まだ処理中の場合。

次の例は、`promise.all()` と並行して実行されるすべてのリクエストを示しています。

```
const api_calls = [];
for (let i = 0; i < 10; i++) {
api_calls.push(
    client.send(
    new ExecuteStatementCommand({
        ...params,
        sql: `insert into table_name values (i);`,
        transactionId
    })
    )
);
}
await Promise.all(api_calls);
```

このエラーを解決するには、現在のリクエストが完了するまで待ってから、同じトランザクション ID を持つ別のリクエストを送信するか、トランザクション ID を削除して並列リクエストを許可します。

次の例は、同じトランザクション ID で順次実行を使用する API コールを示しています。

```
 for (let i = 0; i < 10; i++) {
    await client.send(
    new ExecuteStatementCommand({
        ...params,
        sql: `insert into table_name values (i);`,
        transactionId
    })
    ).promise()
);
}
```

## BatchExecuteStatement の動作
<a name="data-api.differences-batchExecuteStatement"></a>

`BatchExecuteStatement` の詳細については、「[BatchExecuteStatement](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_BatchExecuteStatement.html)」を参照してください。

**Aurora Serverless v1**

更新結果で生成されたフィールドオブジェクトには、挿入された値が含まれます。

**Aurora Serverless v2**
+ Aurora MySQL の場合、更新結果で生成されたフィールドオブジェクトには、挿入された値が含まれます。
+ Aurora PostgreSQL の場合、生成されたフィールドオブジェクトは空です。

## ExecuteSQL の動作
<a name="data-api.differences-ExecuteSQL"></a>

`ExecuteSQL` の詳細については、「[ExecuteSQL](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_ExecuteSql.html)」を参照してください。

**Aurora Serverless v1**

`ExecuteSQL` オペレーションは非推奨です。

**Aurora Serverless v2**

`ExecuteSQL` オペレーションはサポートされていません。

## ExecuteStatement の動作
<a name="data-api.differences-ExecuteStatement"></a>

`ExecuteStatement` の詳細については、「[ExecuteStatement](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_ExecuteStatement.html)」を参照してください。

**Aurora Serverless v1**

`ExecuteStatement` パラメータは、多次元配列の列とすべての高度なデータ型の取得をサポートします。

**Aurora Serverless v2**

`ExecuteStatement` パラメータは多次元配列の列をサポートしていません。また、ジオメトリ型や金額型など、特定の PostgreSQL データ型もサポートしていません。Data API がサポートされていないデータ型を検出すると、このエラー `UnsupportedResultException: The result contains the unsupported data type data_type` を返します。

この問題を回避するには、サポートされていないデータ型を `TEXT` にキャストします。次の例では、サポートされていないデータ型を `TEXT` にキャストします。

```
SELECT custom_type::TEXT FROM my_table;-- 
ORSELECT CAST(custom_type AS TEXT) FROM my_table;
```

各 Aurora データベースエンジンでサポートされているデータ型のリストについては、「[Data API オペレーションリファレンス](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html#data-api-operations)」を参照してください。

## スキーマパラメータの動作
<a name="data-api.differences-schema-parameter"></a>

**Aurora Serverless v1**

`Schema` パラメータはサポートされていません。API コールに `Schema` パラメータを含めると、Data API は パラメータを無視します。

**Aurora Serverless v2**

`Schema` パラメータは廃止されました。API コールに `Schema` パラメータを含めると、Data API はこのエラー `ValidationException: The schema parameter isn't supported` を返します。次の例は、`ValidationException` エラーを返す Data API コールを示しています。

```
aws rds-data execute-statement \
--resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \
--secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \
--database "your_database" \
--schema "your_schema" \
--sql "SELECT * FROM your_table LIMIT 10"
```

この問題を解決するには、API コールから `Schema` パラメータを削除します。

次の例は、`Schema` パラメータが削除された Data API コールを示しています。

```
aws rds-data execute-statement \   
--resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \    
--secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \    
--database "your_database" \    
--sql "SELECT * FROM your_table LIMIT 10"
```