Aurora MySQL で RDS Data API を使って SQL を実行してみた

2024.10.03
Aurora MySQL で RDS Data API を使って SQL を実行してみた
この記事をシェアする

RDS Data APIAmazon Aurora MySQLを新たにサポートしました(2024/9/26)。この記事では、RDS Data API の利点や制約、設定手順、そして実際に AWS CLI と Python から SQL を実行する方法を解説します。

RDS Data API とは

RDS Data APIは、データベースへの接続やコネクションプールを管理することなく、AWS SDK や HTTP リクエストを介してデータベース操作を可能にするサービスです。これにより、サーバーレスアプリケーションやマイクロサービスからデータベースを簡単に操作できます。

RDS Data API の利点と制約

利点

  • サーバーレスアプリケーションに最適: Lambda などから直接データベース操作が可能。
  • コネクション管理不要: コネクションプールの管理が不要になり、スケーラビリティが向上。
  • セキュアなアクセス: AWS IAM で認証・認可を行い、セキュリティが強化。
  • 簡素なネットワーク設定: VPC やセキュリティグループの設定が不要。

制約

  • サポートするデータベースエンジンが限定的: 現時点では Aurora MySQL と Aurora PostgreSQL のみサポート。
  • サポートするインスタンスクラスが限定的: T クラス(db.t3 など)はサポート外。
  • 一部の SQL 文が未対応: ロングランニングトランザクションなど、特定の操作は制限される。
  • IAM データベース認証が未サポート: RDS Data API では、データベースへの接続にIAM データベース認証を使用できず、AWS Secrets Managerでの認証情報管理が必須となります。

RDS Proxy との比較

RDS Proxyはデータベースへの接続をプールし、アプリケーションのパフォーマンスとスケーラビリティを向上させます。しかし、RDS Proxy はプロキシサーバーの設定やネットワーク構成が必要です。一方、RDS Data API は HTTP リクエストで操作でき、ネットワーク設定が不要なため、よりシンプルに利用できます。ただし、RDS Proxy は幅広いデータベースエンジンとインスタンスクラスをサポートしており、高い互換性があります。

料金体系

RDS Data API の料金は、リクエスト数に基づいて課金されます。具体的には、1 百万リクエストあたりの料金が発生します。最初の一定数のリクエストは無料で利用できます。詳細な料金情報はAWS 公式ページをご参照ください。

Aurora MySQL での設定手順

1. Aurora クラスターの作成または既存クラスターの設定変更

新規クラスターの作成

  1. AWS マネジメントコンソールRDS のページに移動します。
  2. 「データベースの作成」をクリックします。
  3. エンジンの選択で、「Amazon Aurora」を選択し、「MySQL 互換」を選びます。RDS Data API に対応しているエンジンバージョンは 3.07 以上なので、ご注意ください。
  4. 「テンプレート」「本番稼働用」または「開発/テスト」を選択します。
  5. 「DB クラスタ識別子」にクラスターの名前を入力します。
  6. 「マスタユーザー名」を設定します。AWS Secrets Manager で管理を選択します。RDS Data API では、Secrets Manager の利用が必須となります。
  7. 「DB インスタンスサイズ」で、サポートされているインスタンスクラス(例:db.r6g.large)を選択します。なお、RDS Data API では、バースト可能クラス(t クラス)は利用不可となります。
  8. 「接続」セクションで、「パブリックアクセス可能」「いいえ」に設定します。
  9. 「追加の構成」セクションを展開し、「Data API を有効にする」にチェックを入れます。
  10. 設定を確認し、「データベースの作成」をクリックします。

既存クラスターの設定変更

  1. RDS コンソールで対象のクラスターを選択します。
  2. 「変更」ボタンをクリックします。
  3. 「追加の構成」セクションで、「Data API を有効にする」にチェックを入れます。
  4. 必要に応じて、インスタンスクラスをサポートされているものに変更します。
  5. 設定を確認し、「DB クラスターの変更」をクリックします。

2. インスタンスクラスの確認

  • サポートされていない T クラス(db.t3 など)を使用していないことを確認してください。
  • サポートされているインスタンスクラスの一覧はAWS ドキュメントを参照してください。

3. シークレットの作成

上記の手順で、Aurora クラスター作成時に Secrets Manager を作成していない場合、次の手順でシークレットを作成してください。

  1. AWS Secrets Managerコンソールに移動します。
  2. 「シークレットの作成」をクリックします。
  3. 「シークレットの種類」「RDS データベース認証情報」を選択します。
  4. データベースの認証情報(ユーザー名、パスワード)を入力します。
  5. 「データベース」で、先ほど作成した Aurora クラスターを選択します。
  6. 「次へ」をクリックし、シークレット名を入力します(例:MyAuroraSecret)。
  7. 設定を確認し、「シークレットの作成」をクリックします。

4. IAM ロールの設定

  • RDS Data API を使用する IAM ユーザーまたはロールに必要な権限を付与します。
  • 以下のポリシーを作成し、ユーザーまたはロールにアタッチします。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": ["rds-data:*"],
      "Effect": "Allow",
      "Resource": "<クラスターARN>"
    },
    {
      "Action": ["secretsmanager:GetSecretValue"],
      "Effect": "Allow",
      "Resource": "<シークレットARN>"
    }
  ]
}
  • `<クラスターARN>`と`<シークレットARN>`は実際のリソース ARN に置き換えてください。

5. ネットワーク設定

RDS Data API は HTTPS を介してデータベースにアクセスするため、VPC やセキュリティグループの設定は不要です。

6. IAM データベース認証が未サポート

RDS Data API では、データベースへの接続にIAM データベース認証を使用できません。そのため、データベースの認証情報はAWS Secrets Managerで管理する必要があります。

AWS CLI で SQL を実行する

新しいデータベース状態から確認できるように、以下の順番で SQL を実行します。

ちなみに、CloudShellを利用するのが簡単で、おすすめです。

  1. テーブルの作成(CREATE)
  2. データの挿入(INSERT)
  3. データの取得(SELECT)

1. シークレット ARN とクラスター ARN の取得

  • シークレット ARN の取得
aws secretsmanager list-secrets --query "SecretList[?Name=='<シークレット名>'].ARN" --output text
  • クラスター ARN の取得
aws rds describe-db-clusters --db-cluster-identifier <クラスター名> --query "DBClusters[0].DBClusterArn" --output text

2. SQL 文の実行

データベースの作成

aws rds-data execute-statement \
    --resource-arn <クラスターARN> \
    --secret-arn <シークレットARN> \
    --sql "CREATE DATABASE <データベース名>"

データベースを作成します。

テーブルの作成

aws rds-data execute-statement \
    --resource-arn <クラスターARN> \
    --secret-arn <シークレットARN> \
    --database <データベース名> \
    --sql "CREATE TABLE sample_table (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50));"

テーブル`sample_table`を作成します。

データの挿入

aws rds-data execute-statement \
    --resource-arn <クラスターARN> \
    --secret-arn <シークレットARN> \
    --database <データベース名> \
    --sql "INSERT INTO sample_table (name) VALUES ('データ1'), ('データ2');"

`sample_table`にデータを挿入します。

データの取得

aws rds-data execute-statement \
    --resource-arn <クラスターARN> \
    --secret-arn <シークレットARN> \
    --database <データベース名> \
    --sql "SELECT * FROM sample_table;"

3. 結果の確認

結果は JSON 形式で返されます。

例:

{
  "records": [
    [
      {
        "longValue": 1
      },
      {
        "stringValue": "データ1"
      }
    ],
    [
      {
        "longValue": 2
      },
      {
        "stringValue": "データ2"
      }
    ]
  ]
}

Python で SQL を実行する

1. 必要なライブラリのインストール

pip install boto3

2. サンプルコード

import boto3

# クライアントの作成
client = boto3.client('rds-data')

# パラメータの設定
cluster_arn = '<クラスターARN>'
secret_arn = '<シークレットARN>'
database = '<データベース名>'

# 0. データベースの作成
create_database_sql = f'CREATE DATABASE {database}'

client.execute_statement(
    resourceArn=cluster_arn,
    secretArn=secret_arn,
    sql=create_database_sql
)

# 1. テーブルの作成
create_table_sql = '''
CREATE TABLE sample_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50)
);
'''

client.execute_statement(
    resourceArn=cluster_arn,
    secretArn=secret_arn,
    database=database,
    sql=create_table_sql
)

# 2. データの挿入
insert_sql = '''
INSERT INTO sample_table (name) VALUES
('データ1'),
('データ2');
'''

client.execute_statement(
    resourceArn=cluster_arn,
    secretArn=secret_arn,
    database=database,
    sql=insert_sql
)

# 3. データの取得
select_sql = 'SELECT * FROM sample_table;'

response = client.execute_statement(
    resourceArn=cluster_arn,
    secretArn=secret_arn,
    database=database,
    sql=select_sql
)

# 結果の表示
for record in response['records']:
    id_value = record[0]['longValue']
    name_value = record[1]['stringValue']
    print(f'ID: {id_value}, Name: {name_value}')

`<クラスターARN>`, `<シークレットARN>`, `<データベース名>`はそれぞれ実際の値に置き換えてください。

3. 実行結果

データベースから取得したレコードが表示されます。
例:

ID: 1, Name: データ1
ID: 2, Name: データ2

まとめ

今回は、Aurora MySQL で RDS Data API を使って SQL を実行する方法を紹介しました。新しいデータベースからテーブルの作成、データの挿入、データの取得までを順を追って実施しました。RDS Data API を利用することで、サーバーレスアプリケーションからシンプルかつセキュアにデータベース操作が可能になります。ただし、IAM データベース認証がサポートされていないため、AWS Secrets Manager での認証情報管理が必要である点に注意が必要です。料金体系もリクエスト数に基づくシンプルなものとなっており、コスト管理が容易です。ぜひ新しい機能を活用して、アプリケーションの開発効率を向上させてみてください。


参考リンク

この記事をシェアする
著者:酒井亮太郎
シナモロール