Amazon Aurora DSQL クイックスタート:ServerlessでDBアクセス – 詳細解説
Amazon Auroraは、MySQLおよびPostgreSQLと互換性のある、高パフォーマンスで可用性の高いクラウドネイティブなリレーショナルデータベースです。特に、Aurora Serverless v2は、データベースのキャパシティを自動的にスケールアップ/ダウンするため、予測不能なワークロードや、一時的な使用に最適です。DSQL(Data API)は、Aurora Serverless v2へのHTTPエンドポイントを提供し、アプリケーションがデータベースサーバーを直接管理することなく、SQLコマンドを実行できるようにします。
この詳細なガイドでは、Amazon Aurora Serverless v2とDSQL(Data API)を利用して、サーバレス環境から安全かつ効率的にデータベースにアクセスする方法について、具体的な手順と詳細な説明を交えながら解説します。
目次
- はじめに: Aurora Serverless v2とDSQLの概要
- Aurora Serverless v2のセットアップ:
- 必要なIAMロールの作成
- VPC、サブネット、セキュリティグループの設定
- Aurora Serverless v2クラスターの作成
- 初期データベースとテーブルの作成
- Data APIの有効化:
- クラスターのData API設定
- Data APIへのアクセス許可設定 (IAM)
- DSQLを使ったデータベース操作:
- AWS CLIによるDSQLの実行
- AWS SDK (Python/Boto3) によるDSQLの実行
- Lambda関数からのDSQLの呼び出し
- DSQLのベストプラクティス:
- 接続プーリングの不要性
- SQLインジェクション対策
- トランザクションの管理
- 非同期実行と結果のポーリング
- Data APIの制限事項
- セキュリティ:
- IAMロールとポリシーによるアクセス制御
- VPCエンドポイントによるプライベートアクセス
- 暗号化 (at rest & in transit)
- AWS Secrets Managerの利用
- モニタリングとトラブルシューティング:
- CloudWatchメトリクスの確認
- CloudTrailログの分析
- 一般的なエラーとその解決策
- ユースケース:
- イベント駆動型アプリケーション
- APIバックエンド
- 定期的なデータ処理
- マイクロサービスアーキテクチャ
- パフォーマンス最適化:
- クエリの最適化
- インデックスの利用
- Data APIの同時実行数制限の考慮
- 料金: Aurora Serverless v2とData APIの料金モデル
- まとめ: DSQLのメリットとデメリット
- リソース: 関連ドキュメントとサンプルコード
1. はじめに:Aurora Serverless v2とDSQLの概要
Aurora Serverless v2は、需要に応じて自動的にスケーリングする、フルマネージドなリレーショナルデータベースサービスです。従来のデータベースとは異なり、事前にインスタンスサイズをプロビジョニングする必要がなく、使用量に応じて課金されます。これは、トラフィックが予測できないワークロードや、一時的にデータベースを使用するアプリケーションにとって非常に有利です。
DSQL(Data API)は、Aurora Serverless v2に対して、RESTful API経由でSQLクエリを実行するための機能です。HTTPエンドポイントを通じてアクセスできるため、アプリケーションはデータベース接続を管理する必要がなく、データベースサーバーへの直接的な接続も不要です。
DSQLの主なメリット:
- サーバレスアーキテクチャとの親和性: Lambda関数などのサーバレス環境から直接データベースにアクセスできます。
- 接続プーリングの不要性: データベース接続の管理が不要になり、アプリケーションの複雑さを軽減します。
- セキュリティの向上: データベースサーバーへの直接的なアクセスを制限することで、セキュリティリスクを低減できます。
- 開発の簡素化: データベース接続やドライバーの管理が不要になり、開発者はビジネスロジックに集中できます。
DSQLの主なデメリット:
- レイテンシ: HTTP経由でのアクセスであるため、直接接続に比べてレイテンシが大きくなる可能性があります。
- 制限事項: 実行できるSQLクエリのサイズや、同時実行数に制限があります。
- 非同期実行: 一部の操作は非同期で実行され、結果のポーリングが必要になる場合があります。
- コスト: 使用量に応じて課金されるため、継続的に高負荷なワークロードにはコストが嵩む可能性があります。
2. Aurora Serverless v2のセットアップ
Aurora Serverless v2を使用するには、まずAWSコンソールまたはAWS CLIを使用して、必要なリソースをセットアップする必要があります。
2.1 必要なIAMロールの作成
Aurora Serverless v2が他のAWSサービスにアクセスするためには、適切なIAMロールが必要です。特に、RDS (Relational Database Service) サービスが、VPCやKMSキーにアクセスするための権限を付与します。
- ロールの作成: AWSコンソールでIAMサービスを開き、「ロール」を選択して「ロールを作成」をクリックします。
- 信頼されたエンティティ: 「AWSサービス」を選択し、ユースケースとして「RDS」を選択します。次に「RDS」を選択します。
- アクセス許可: デフォルトでは必要なポリシーがアタッチされる可能性があります。必要に応じて、VPCへのアクセスやKMSキーへのアクセスを許可するカスタムポリシーを作成し、アタッチします。(例:
AmazonRDSCertificateAuthorityPolicy,AmazonRDSDataAPIFullAccess,AmazonRDSFullAccess) - ロール名: ロールに分かりやすい名前 (例:
AuroraServerlessV2Role) をつけて、「ロールを作成」をクリックします。
2.2 VPC、サブネット、セキュリティグループの設定
Aurora Serverless v2はVPC内で実行されるため、VPC、サブネット、およびセキュリティグループを適切に設定する必要があります。
- VPCの作成: VPCサービスを開き、「VPCを作成」をクリックします。必要に応じて、パブリックサブネットとプライベートサブネットを作成します。Aurora Serverless v2はプライベートサブネットに配置することをお勧めします。
- サブネットの作成: VPC内で、少なくとも2つ以上のサブネットを作成します。これらのサブネットは、異なるアベイラビリティゾーンに配置する必要があります。
- セキュリティグループの作成: セキュリティグループを作成し、必要なインバウンドおよびアウトバウンドルールを設定します。例えば、同じVPC内の他のリソースからのアクセスを許可するルールや、特定のIPアドレスからのアクセスを許可するルールを設定できます。Aurora Serverless v2に対して、インターネットからの直接アクセスを許可するインバウンドルールは設定しないでください。セキュリティグループを作成する際は、Data APIを利用するリソースからのインバウンドルールを設定します。例えば、Lambda関数からData APIを利用する場合、Lambda関数が利用するセキュリティグループからのインバウンドルールを、Aurora Serverless v2のセキュリティグループに設定します。
2.3 Aurora Serverless v2クラスターの作成
VPC、サブネット、およびセキュリティグループの設定が完了したら、Aurora Serverless v2クラスターを作成できます。
- RDSサービスの選択: AWSコンソールでRDSサービスを開き、「データベース」を選択して「データベースを作成」をクリックします。
- データベースエンジンの選択: 「Amazon Aurora」を選択し、MySQL互換またはPostgreSQL互換のいずれかを選択します。
- エディションの選択: 「Aurora MySQL互換」または「Aurora PostgreSQL互換」を選択します。
- データベースのバージョン: 利用可能な最新バージョンを選択することをお勧めします。
- テンプレート: 「Serverless v2」を選択します。
- 設定:
- DBクラスター識別子: クラスターに一意の名前を付けます (例:
aurora-serverless-v2-cluster)。 - マスターユーザー名: マスターユーザーの名前を入力します (例:
admin)。 - マスターパスワード: マスターユーザーのパスワードを設定します。
- DBインスタンスサイズ: Aurora Serverless v2は自動的にスケーリングするため、インスタンスサイズを選択する必要はありません。
- DBクラスター識別子: クラスターに一意の名前を付けます (例:
- ネットワーク:
- VPC: 作成したVPCを選択します。
- サブネットグループ: 作成したサブネットグループを選択します。
- VPCセキュリティグループ: 作成したセキュリティグループを選択します。
- データベースオプション:
- データベース名: 初期データベースの名前を入力します (例:
mydatabase)。 - ポート: デフォルトのポート (MySQLの場合は3306、PostgreSQLの場合は5432) を使用します。
- データベース名: 初期データベースの名前を入力します (例:
- 追加設定:
- Data API: 「Data API を有効にする」にチェックを入れます。
- IAMロール: 作成したIAMロールを選択します (例:
AuroraServerlessV2Role)。
- データベースの作成: 設定を確認し、「データベースを作成」をクリックします。
2.4 初期データベースとテーブルの作成
Aurora Serverless v2クラスターが作成されたら、初期データベースとテーブルを作成する必要があります。Data APIは、SQLクエリの実行に使用できますが、初期設定には、従来のデータベースクライアントを使用することをお勧めします。
- MySQL WorkbenchまたはpgAdminのインストール: MySQL互換の場合はMySQL Workbenchを、PostgreSQL互換の場合はpgAdminをインストールします。
- データベースへの接続: 作成したAurora Serverless v2クラスターのエンドポイントを使用して、データベースに接続します。エンドポイントは、RDSコンソールでクラスターの詳細を表示することで確認できます。
- SQLクエリの実行: MySQL WorkbenchまたはpgAdminでSQLクエリを実行して、初期データベースとテーブルを作成します。
例えば、MySQL互換の場合:
“`sql
CREATE DATABASE IF NOT EXISTS mydatabase;
USE mydatabase;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL
);
INSERT INTO users (name, email) VALUES
(‘John Doe’, ‘[email protected]’),
(‘Jane Smith’, ‘[email protected]’);
“`
PostgreSQL互換の場合:
“`sql
CREATE DATABASE mydatabase;
\c mydatabase
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL
);
INSERT INTO users (name, email) VALUES
(‘John Doe’, ‘[email protected]’),
(‘Jane Smith’, ‘[email protected]’);
“`
3. Data APIの有効化
Data APIは、Aurora Serverless v2クラスターの作成時に有効にすることができますが、後から有効にすることも可能です。
3.1 クラスターのData API設定
- RDSコンソールのアクセス: AWSコンソールでRDSサービスを開き、「データベース」を選択して、作成したAurora Serverless v2クラスターを選択します。
- 設定の変更: 「変更」をクリックし、「ネットワーク」セクションで「Data API を有効にする」にチェックが入っていることを確認します。入っていない場合は、チェックを入れて、「続行」をクリックし、変更を適用します。
3.2 Data APIへのアクセス許可設定 (IAM)
Data APIを使用するには、適切なIAMポリシーを作成し、Data APIを呼び出すAWS Identity (例: Lambda関数、IAMユーザー、IAMロール) にアタッチする必要があります。
- IAMポリシーの作成: AWSコンソールでIAMサービスを開き、「ポリシー」を選択して「ポリシーを作成」をクリックします。
- JSONエディタ: 「JSON」タブを選択し、以下のポリシーを貼り付けます。
<aws_region>、<account_id>、<resource_arn>を適切な値に置き換えてください。
json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowDataAPIExecute",
"Effect": "Allow",
"Action": [
"rds-data:ExecuteStatement",
"rds-data:BeginTransaction",
"rds-data:CommitTransaction",
"rds-data:RollbackTransaction"
],
"Resource": "<resource_arn>"
},
{
"Sid": "AllowDataAPIDescribe",
"Effect": "Allow",
"Action": [
"rds-data:DescribeTable",
"rds-data:DescribeStatement"
],
"Resource": "*"
},
{
"Sid": "AllowSecretsManagerAccess",
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:secretsmanager:<aws_region>:<account_id>:secret:rds-db-credentials/*"
}
]
}
<aws_region>: AWSリージョン (例:us-east-1)<account_id>: AWSアカウントID-
<resource_arn>: Aurora Serverless v2クラスターのARN (例:arn:aws:rds:us-east-1:123456789012:cluster:aurora-serverless-v2-cluster)。クラスターのARNは、RDSコンソールでクラスターの詳細を表示することで確認できます。 -
ポリシーの確認と作成: ポリシーを確認し、分かりやすい名前 (例:
AuroraDataAPIAccessPolicy) をつけて、「ポリシーを作成」をクリックします。 - IAMロールへのアタッチ: Data APIを呼び出すIAMロール (例: Lambda関数の実行ロール) を選択し、作成したIAMポリシーをアタッチします。
4. DSQLを使ったデータベース操作
Data APIを使用するには、AWS CLI、AWS SDK、またはその他のHTTPクライアントを使用して、APIを呼び出す必要があります。
4.1 AWS CLIによるDSQLの実行
AWS CLIを使用してData APIを呼び出すには、まずAWS CLIを設定する必要があります。AWS CLIが設定されていることを確認し、適切なリージョンが構成されていることを確認してください。
- SQLクエリの実行: 以下のコマンドを使用して、SQLクエリを実行します。
bash
aws rds-data execute-statement \
--secret-arn "arn:aws:secretsmanager:<aws_region>:<account_id>:secret:rds-db-credentials/cluster-<cluster_name>/admin" \
--resource-arn "<resource_arn>" \
--sql "SELECT * FROM users" \
--database "mydatabase"
<aws_region>: AWSリージョン (例:us-east-1)<account_id>: AWSアカウントID<cluster_name>: Aurora Serverless v2クラスターの名前 (例:aurora-serverless-v2-cluster)<resource_arn>: Aurora Serverless v2クラスターのARN (例:arn:aws:rds:us-east-1:123456789012:cluster:aurora-serverless-v2-cluster)
4.2 AWS SDK (Python/Boto3) によるDSQLの実行
AWS SDK (Python/Boto3) を使用してData APIを呼び出すには、まずBoto3をインストールする必要があります。
bash
pip install boto3
- Pythonコード: 以下のPythonコードを使用して、SQLクエリを実行します。
“`python
import boto3
def execute_sql(sql_statement):
client = boto3.client(‘rds-data’)
response = client.execute_statement(
secretArn='arn:aws:secretsmanager:<aws_region>:<account_id>:secret:rds-db-credentials/cluster-<cluster_name>/admin',
resourceArn='<resource_arn>',
sql=sql_statement,
database='mydatabase'
)
return response
例:SELECTクエリの実行
result = execute_sql(‘SELECT * FROM users’)
print(result)
例:INSERTクエリの実行
result = execute_sql(“INSERT INTO users (name, email) VALUES (‘New User’, ‘[email protected]’)”)
print(result)
“`
<aws_region>: AWSリージョン (例:us-east-1)<account_id>: AWSアカウントID<cluster_name>: Aurora Serverless v2クラスターの名前 (例:aurora-serverless-v2-cluster)<resource_arn>: Aurora Serverless v2クラスターのARN (例:arn:aws:rds:us-east-1:123456789012:cluster:aurora-serverless-v2-cluster)
4.3 Lambda関数からのDSQLの呼び出し
Lambda関数からData APIを呼び出すには、まずLambda関数を作成し、必要なIAMロールを設定する必要があります。
- Lambda関数の作成: AWSコンソールでLambdaサービスを開き、「関数を作成」をクリックします。
- 関数の設定:
- 関数名: 関数に分かりやすい名前を付けます (例:
AuroraDataAPIFunction)。 - ランタイム: Python 3.9などのサポートされているランタイムを選択します。
- 実行ロール: 作成したIAMロール (例:
AuroraDataAPIAccessPolicyがアタッチされているロール) を選択します。
- 関数名: 関数に分かりやすい名前を付けます (例:
- Lambda関数のコード: 以下のPythonコードをLambda関数に貼り付けます。
“`python
import boto3
import json
def lambda_handler(event, context):
client = boto3.client(‘rds-data’)
try:
response = client.execute_statement(
secretArn='arn:aws:secretsmanager:<aws_region>:<account_id>:secret:rds-db-credentials/cluster-<cluster_name>/admin',
resourceArn='<resource_arn>',
sql='SELECT * FROM users',
database='mydatabase'
)
return {
'statusCode': 200,
'body': json.dumps(response)
}
except Exception as e:
return {
'statusCode': 500,
'body': json.dumps(str(e))
}
“`
<aws_region>: AWSリージョン (例:us-east-1)<account_id>: AWSアカウントID<cluster_name>: Aurora Serverless v2クラスターの名前 (例:aurora-serverless-v2-cluster)<resource_arn>: Aurora Serverless v2クラスターのARN (例:arn:aws:rds:us-east-1:123456789012:cluster:aurora-serverless-v2-cluster)- Lambda関数のテスト: Lambda関数をテストし、Data APIが正しく呼び出されることを確認します。
5. DSQLのベストプラクティス
Data APIを効果的に使用するためには、以下のベストプラクティスに従うことをお勧めします。
5.1 接続プーリングの不要性
Data APIはHTTPエンドポイントを通じてデータベースにアクセスするため、従来のデータベース接続のように接続プーリングを管理する必要はありません。これにより、アプリケーションの複雑さが軽減され、リソースの効率的な利用が可能になります。
5.2 SQLインジェクション対策
SQLインジェクション攻撃を防ぐために、常にパラメータ化されたクエリを使用してください。Data APIは、SQLクエリ内のパラメータをエスケープするためのメカニズムを提供しています。
“`python
パラメータ化されたクエリの例
response = client.execute_statement(
secretArn=’arn:aws:secretsmanager:
resourceArn=’
sql=’SELECT * FROM users WHERE id = :user_id’,
database=’mydatabase’,
parameters=[
{
‘name’: ‘user_id’,
‘value’: {
‘longValue’: 1
}
}
]
)
“`
5.3 トランザクションの管理
Data APIを使用して、トランザクションを開始、コミット、およびロールバックすることができます。トランザクションを使用することで、複数のSQLステートメントがアトミックに実行されることを保証できます。
“`python
トランザクションの例
try:
# トランザクションの開始
start_transaction_response = client.begin_transaction(
secretArn=’arn:aws:secretsmanager:
resourceArn=’
database=’mydatabase’
)
transaction_id = start_transaction_response[‘transactionId’]
# SQLステートメントの実行
client.execute_statement(
secretArn='arn:aws:secretsmanager:<aws_region>:<account_id>:secret:rds-db-credentials/cluster-<cluster_name>/admin',
resourceArn='<resource_arn>',
sql="INSERT INTO users (name, email) VALUES ('Transaction User', '[email protected]')",
database='mydatabase',
transactionId=transaction_id
)
# トランザクションのコミット
client.commit_transaction(
secretArn='arn:aws:secretsmanager:<aws_region>:<account_id>:secret:rds-db-credentials/cluster-<cluster_name>/admin',
resourceArn='<resource_arn>',
transactionId=transaction_id
)
print("Transaction committed successfully.")
except Exception as e:
# ロールバック
if ‘transaction_id’ in locals(): # transaction_id が定義されているか確認
client.rollback_transaction(
secretArn=’arn:aws:secretsmanager:
resourceArn=’
transactionId=transaction_id
)
print(“Transaction rolled back.”)
print(f”Error: {e}”)
“`
5.4 非同期実行と結果のポーリング
Data APIは、一部の操作を非同期で実行します。非同期操作の結果を取得するには、ポーリングを行う必要があります。
“`python
非同期実行の例
response = client.execute_statement(
secretArn=’arn:aws:secretsmanager:
resourceArn=’
sql=’SELECT SLEEP(5)’, # 5秒間スリープするSQLクエリ
database=’mydatabase’,
continueAfterTimeout=True # タイムアウト後も処理を継続する
)
ステータスの確認
statement_id = response[‘statementId’]
status_response = client.describe_statement(resourceArn=’
print(status_response[‘status’])
“`
5.5 Data APIの制限事項
Data APIには、実行できるSQLクエリのサイズや、同時実行数などの制限があります。これらの制限を考慮して、アプリケーションを設計する必要があります。詳細な制限については、AWSのドキュメントを参照してください。
6. セキュリティ
Data APIを使用する際には、セキュリティを確保するために以下の対策を講じることをお勧めします。
6.1 IAMロールとポリシーによるアクセス制御
Data APIへのアクセスを制御するために、IAMロールとポリシーを使用します。最小限の権限の原則に従い、必要なリソースへのアクセスのみを許可するポリシーを作成します。
6.2 VPCエンドポイントによるプライベートアクセス
Data APIへのアクセスをVPC内に限定するために、VPCエンドポイントを使用します。これにより、インターネット経由でのアクセスを防ぎ、セキュリティを向上させることができます。
6.3 暗号化 (at rest & in transit)
Aurora Serverless v2は、保存時および転送時にデータを暗号化します。KMSキーを使用して、データの暗号化を制御することもできます。
6.4 AWS Secrets Managerの利用
データベースの認証情報を安全に管理するために、AWS Secrets Managerを使用します。Data APIは、Secrets Managerに保存された認証情報を利用して、データベースに接続することができます。
7. モニタリングとトラブルシューティング
Data APIのパフォーマンスを監視し、問題をトラブルシューティングするために、以下のツールを使用することをお勧めします。
7.1 CloudWatchメトリクスの確認
CloudWatchメトリクスを使用して、Data APIの使用状況、レイテンシ、およびエラー率を監視します。
7.2 CloudTrailログの分析
CloudTrailログを分析して、Data APIの呼び出し履歴を追跡し、セキュリティイベントを特定します。
7.3 一般的なエラーとその解決策
Data APIを使用する際に発生する可能性のある一般的なエラーとその解決策を理解しておきましょう。例えば、IAMロールの権限不足、VPC設定の問題、またはSQLクエリのエラーなどが考えられます。AWSのドキュメントを参照して、これらのエラーの解決策を確認してください。
8. ユースケース
Data APIは、さまざまなユースケースで使用することができます。
8.1 イベント駆動型アプリケーション
Lambda関数などのイベント駆動型アプリケーションから、Data APIを使用してデータベースにアクセスできます。
8.2 APIバックエンド
API GatewayとLambda関数を組み合わせたAPIバックエンドで、Data APIを使用してデータベースにアクセスできます。
8.3 定期的なデータ処理
CloudWatch Eventsを使用して定期的にLambda関数をトリガーし、Data APIを使用してデータベースのデータを処理できます。
8.4 マイクロサービスアーキテクチャ
マイクロサービスアーキテクチャにおいて、各マイクロサービスがData APIを使用してデータベースにアクセスできます。
9. パフォーマンス最適化
Data APIのパフォーマンスを最適化するために、以下の対策を講じることをお勧めします。
9.1 クエリの最適化
SQLクエリを最適化して、実行時間を短縮します。インデックスの使用、不要なデータの取得の回避、およびクエリの構造の見直しなどを検討してください。
9.2 インデックスの利用
適切なインデックスを作成して、クエリのパフォーマンスを向上させます。
9.3 Data APIの同時実行数制限の考慮
Data APIには、同時実行数の制限があります。制限を超えないように、アプリケーションを設計する必要があります。
10. 料金
Aurora Serverless v2とData APIの料金モデルについて理解しておきましょう。Aurora Serverless v2は、データベースの使用量に応じて課金されます。Data APIは、APIの呼び出し回数に応じて課金されます。詳細な料金情報については、AWSのウェブサイトを参照してください。
11. まとめ:DSQLのメリットとデメリット
Data APIは、サーバレスアーキテクチャにおいて、データベースへのアクセスを簡素化し、セキュリティを向上させるための強力なツールです。しかし、レイテンシや制限事項などのデメリットも存在します。Data APIを使用する際には、メリットとデメリットを理解し、適切なユースケースを選択することが重要です。
メリット:
- サーバレスアーキテクチャとの親和性
- 接続プーリングの不要性
- セキュリティの向上
- 開発の簡素化
デメリット:
- レイテンシ
- 制限事項
- 非同期実行
- コスト
12. リソース
- Amazon Aurora Serverless v2: https://aws.amazon.com/jp/rds/aurora/serverless/
- Amazon RDS Data API: https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_Reference_DataAPI.html
- AWS SDK (Boto3): https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html
このガイドが、Amazon Aurora Serverless v2とDSQL(Data API)の理解と活用に役立つことを願っています。より詳細な情報や具体的な事例については、上記のリソースを参照してください。