Aurora MySQL で RDS Data API を使って SQL を実行してみた
目次
RDS Data APIがAmazon 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 クラスターの作成または既存クラスターの設定変更
新規クラスターの作成
- AWS マネジメントコンソールでRDS のページに移動します。
- 「データベースの作成」をクリックします。
- エンジンの選択で、「Amazon Aurora」を選択し、「MySQL 互換」を選びます。RDS Data API に対応しているエンジンバージョンは 3.07 以上なので、ご注意ください。
- 「テンプレート」で「本番稼働用」または「開発/テスト」を選択します。
- 「DB クラスタ識別子」にクラスターの名前を入力します。
- 「マスタユーザー名」を設定します。AWS Secrets Manager で管理を選択します。RDS Data API では、Secrets Manager の利用が必須となります。
- 「DB インスタンスサイズ」で、サポートされているインスタンスクラス(例:db.r6g.large)を選択します。なお、RDS Data API では、バースト可能クラス(t クラス)は利用不可となります。
- 「接続」セクションで、「パブリックアクセス可能」を「いいえ」に設定します。
- 「追加の構成」セクションを展開し、「Data API を有効にする」にチェックを入れます。
- 設定を確認し、「データベースの作成」をクリックします。
既存クラスターの設定変更
- RDS コンソールで対象のクラスターを選択します。
- 「変更」ボタンをクリックします。
- 「追加の構成」セクションで、「Data API を有効にする」にチェックを入れます。
- 必要に応じて、インスタンスクラスをサポートされているものに変更します。
- 設定を確認し、「DB クラスターの変更」をクリックします。
2. インスタンスクラスの確認
- サポートされていない T クラス(db.t3 など)を使用していないことを確認してください。
- サポートされているインスタンスクラスの一覧はAWS ドキュメントを参照してください。
3. シークレットの作成
上記の手順で、Aurora クラスター作成時に Secrets Manager を作成していない場合、次の手順でシークレットを作成してください。
- AWS Secrets Managerコンソールに移動します。
- 「シークレットの作成」をクリックします。
- 「シークレットの種類」で「RDS データベース認証情報」を選択します。
- データベースの認証情報(ユーザー名、パスワード)を入力します。
- 「データベース」で、先ほど作成した Aurora クラスターを選択します。
- 「次へ」をクリックし、シークレット名を入力します(例:
MyAuroraSecret
)。 - 設定を確認し、「シークレットの作成」をクリックします。
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を利用するのが簡単で、おすすめです。
- テーブルの作成(CREATE)
- データの挿入(INSERT)
- データの取得(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 での認証情報管理が必要である点に注意が必要です。料金体系もリクエスト数に基づくシンプルなものとなっており、コスト管理が容易です。ぜひ新しい機能を活用して、アプリケーションの開発効率を向上させてみてください。
参考リンク