【Lambda × RDS Proxy】LambdaからProxy経由でRDSに接続してみる
目次
はじめに
Lambda関数を作成しRDSからデータを出力するタスクがあったのですが、知り合いに相談したところ「Proxy噛ませた方がいいっすよ!」とアドバイスいただいたのでRDS Proxyを調べて設置してみました。
Lambdaから直でRDSに接続するのはよろしくないっぽいので同様の構成の際は覚えておいた方が良い内容となります。
今回触れていく内容は下記の通りです。
- RDS
Amazon RDS(マネージドリレーショナルデータベース)| AWS Amazon Web Services, Inc.
- RDS Proxy
Amazon RDS Proxy | 高可用性データベースプロキシ | Amazon ウェブサービス Amazon Web Services, Inc.
- IAM
AWS IAM(ユーザーアクセスと暗号化キーの管理)| AWS Amazon Web Services, Inc.
- Secrets Manager
AWS Secrets Manager(シークレットのローテーション、管理、取得)| AWS Amazon Web Services, Inc.
RDS Proxyっておいしいの?
そもそもRDS Proxyが何なのかを調べてみましたが、Proxyを設置せずにRDSへ直接続するのは以下の理由でアンチパターンになるようです。
- Lambdaのリクエスト毎にRDSとコネクションが張られる
- RDSのコネクション数が増大する
- 最大同時接続数の上限に達してエラーになる
なるほど。Lambdaの振る舞いだとRDSとの相性がよろしくないようですね。
では本題のProxyさんは何者かと言うと、公式に記載がありました。
Amazon RDS Proxy インスタンスは、RDS データベースインスタンスに確立した接続のプールを管理し、新しい接続が確立する際に通常発生するデータベースコンピューティングおよびメモリリソースへのストレスを軽減します。RDS Proxy では使用頻度の低いデータベース接続も共有するため、RDS データベースにアクセスする接続が少なくなります。 この接続プーリングにより、データベースは多数のアプリケーション接続とアプリケーション接続の頻度を効率的にサポートできるため、パフォーマンスを低下させることなくアプリケーションをスケーリングできます
https://aws.amazon.com/jp/rds/proxy/
なるほど。なるほど。
接続のプールをして良しなに接続数の回数を下げてくれる訳ですね。これは入れるっきゃない。
RDS Proxy設定方法
てな訳で早速行ってみましょう!
RDSの設置は既に完了している想定で、Proxyの設置だけを行なっていきます。
具体的な流れは以下の通りです。
- 認証情報の設定(AWS Secrets Manager)
- IAMロール作成
- RDS Proxy作成
認証情報の設定(AWS Secrets Manager)
AWS Secrets Manager > シークレット > 「新しいシークレットを保存する」
- ユーザー名: RDS接続時のユーザー名
- パスワード: RDS接続時のパスワード
- データベース: 対象のDBインスタンスを選択
上記を設定して[次]
識別用の名前を設定したら[次]
ローテーションはデフォルトのまま[次]
[保存]を押したら完了。
IAMロール作成
IAM > ロール > [ロールを作成]
AWSサービス > RDS > [Add Role to Database]
ポリシーの作成 > [JSON]
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": [
{前のステップで作ったシークレットのARN}
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": { KMS > AWS マネージド型キー > aws/secretsmanager のARN},
"Condition": {
"StringEquals": {
"kms:ViaService": "secretsmanager.us-east-1.amazonaws.com"
}
}
}
]
}
RDS Proxy作成
- Amazon RDS > プロキシ > [プロキシを作成]
- 下記を選択して [プロキシを作成]
- プロキシ識別子: Proxyの名前
- エンジンの互換性: 接続対象のRDSのDBタイプ
- データベース: 接続対象のRDS
- Secrets Manager シークレット: 前のステップで作成したシークレット
- IAMロール: 前のステップで作成したIAMロール
- サブネット: 接続対象のRDSと同じサブネット
- VPCセキュリティグループ: 接続対象と同様のセキュリティグループ
RDS Proxyへ接続
Proxyが作成できたら実際にProxy経由でRDSに接続してみます。
RDS > プロキシ > [作成したProxy名] > プロキシエンドポイント
直接RDSに接続しているエンドポイントを上記で確認したエンドポイントに変更してあげればOKです。
read-only用のエンドポイントも生成されているので、そちらでアクセスしてみて問題なくデータが取得できれば完了となります!
さいごに
今回はRDS Proxyを作成してProxy経由からRDSにアクセスを行ってみました!
LambdaからRDSへの直接続が良くないのを初めて知ったので、サーバーレス構成を取る時は必ずProxy設置を忘れずに行おうと思います!
セキュリティグループやSecrets Manager設定周りで若干ハマりましたが、そちらは別の記事で紹介しようと思います!
最後までご覧くださりありがとうございました!