Web開発ログ | エンジニアに役立つ情報 | 開発の中での気づきを発信

高卒Devlog

【Lambda × RDS Proxy】LambdaからProxy経由でRDSに接続してみる

thumbnail

こんにちは! RYOTAです!

当記事をご覧くださりありがとうございます!

Lambda関数からRDSに接続するにあたりRDS Proxyを設置してProxy経由でデータアクセスをしてみたのでそちらの設定方法を解説していきます。

はじめに

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の設置だけを行なっていきます。
具体的な流れは以下の通りです。

  1. 認証情報の設定(AWS Secrets Manager)
  2. IAMロール作成
  3. 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設定周りで若干ハマりましたが、そちらは別の記事で紹介しようと思います!
最後までご覧くださりありがとうございました!