エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

RDS Proxyを使いたかったけどNpgsqlから接続できなかった(解決済み)

f:id:tansantktk:20210404183536p:plain

AWSでLambda+RDSの構成を構築すると、Lambda自身が起動の度にRDSへのコネクションを張る為に負荷が大きく、あまり宜しくない構成であると言われてきました。

そのような構成の場合、RDS ProxyをDBプロキシとしてRDSの手前に配置することでコネクションのプーリングが可能になり、RDSへの負荷を抑えることができるようになります。

さて、今回は業務で利用ユーザーが増えてきたこともあり、そろそろ私も導入をしてみようかと検証したところ、どうにもうまくいかなかった話です😂

2021/10/7追記

※無事に接続できました。原因はRDSProxy、RDSのセキュリティグループの設定が間違っており、Lambdaからのリクエストが拒否されていました…。

以下に記載のソースコードは問題ありません。インフラもよく確認しないといけませんね…。

前提条件

  • Lambda(.NET Core 2.1)
  • RDS(PostgreSQL 11)
  • RDS Proxy

上記3つは全て同一VPCに配置。

やりたかったこと

  • LambdaからRDSProxyを経由し、RDSへ接続する。
  • RDSProxyへの接続にはNugetパッケージのNpgsqlを利用。
  • LambdaとRDSProxyの認証については、user, passwordの値の組み合わせを指定して認証する。

ソース

RDS Proxy経由でRDSに接続する場合、Host(NpgsqlではServer)の部分にRDS Proxyのエンドポイントを指定し、後はRDSのUserID, Password, Databaseを指定すれば接続できるという認識でした。

下記は実際に検証したソースコードに似せたサンプルです。

using Npgsql;
using System.Data;

...

var connectionString = @"Server={RDS Proxyのエンドポイント};Port=5432;User Id={UserID};Password={Password}#;Database={Database}";

using (var connection = new NpgsqlConnection(connectionString))
{
  connection.Open();

  var command = new NpgsqlCommand(@"{任意のSQL}", conn);

  var dataReader = command.ExecuteReader();
  while (dataReader.Read())
  {
    // 任意のSQLの実行結果処理
  }
}

結果

  • Lambda環境でNpgsqlを使ってのRDSProxyへの接続は出来ませんでした。
  • NpgsqlでHostをRDSProxyのエンドポイントを指定しましたが、接続が出来ていないようで最終的に.NET Core内でタイムアウトしていました。
  • Lambda(Node.js)からnode-postgresを使ってRDSProxyへ接続を試みたところ、そちらは問題なく接続できました。Npgsqlを使う場合、上記のソースでは接続できないと思われます。

別の接続方法を検討しても良いのですが、Npgsqlを使ったプログラム実装が随所にあり、工数の確保が困難ということで、RDSProxy自体の導入はお流れになりました…。

Lambda+RDS構成なら是非活用したいところだったのですが残念😂