📚

OpenSearchにプライベートサブネットに配置したLambdaから接続するときにハマッたこと

に公開

目的

社内のCSVデータを、ナレッジベース化するためにOpenSearchでデータベース化することにした。

構成

構成はOpensearch Serverlessにコレクションを作り、indexの作成とindexへのドキュメントの登録はLambdaで処理する。
外部に公開したくないデータなので、当然Collectionの接続元もパブリック不可にし、ネットワークポリシーで
・Bedrock
・VPCエンドポイント
の2か所からのみ許可。
Lambdaはプライベートサブネットに配置し、VPCE経由でOSコレクションに接続する。

これをTerraformを利用して実装した。

ポイント

今回の仕組み向けに新しくVPCを構築し、その下に専用のSubnetを切る。
Subnet自体は今回の仕組み専用だが、同一VPCに今後ライトな業務改善アーキテクチャをおいていくつもり。
(いちいちVPC敷くほどのものでもない、PoC的なのも多いので)
当面は自分だけだけど、将来的にだれがどんなアーキテクチャを置くかわからないので、できるだけクローズにしたい。

やりたかったこと

lambda -> vpce -> opensearch に接続するなかで、vpceも今回のlambda専用にしたかった。
vpceを共有すると、将来的に予期せぬアプリが今回作成したコレクションにアクセスする可能性があるため。

この状態を避けたかった

これが理想

試したこと

今回の要件を実現するにはvpceのアクセス元をLambdaのsgに限定するだけではダメで、vpceを複数設置できる構成にする必要があった。

vpceを複数作ったときに問題になるのが、特定のlambda からエンドのサービスに接続するときに通過するvpceをどうやって明示的に指定するか・・・

試したのは、Route53でプライベート用のホストゾーンを作成し、VPCEのIPアドレスをAレコードとして登録するというもの。

結果

VPCEまでは疎通できるが、その先のAOSSコレクションエンドポイントにリクエストが到達しなかった。
Opensearchで設定するNWポリシーにVPCEを紐づけているので、良しなにルーティングしてくれると思ったがそんなことはなかった。

考えてみれば当然の話で、VPCEそのものには接続先のエンドポイントの情報はないので、リクエスト時に指定されるエンドポイントがなければその先に接続はされないよう。
ただし、接続自体は確立するのでその先のエンドポイントの機能を使う(URIを指定してリクエストを送る)際に404が返ってくるので、表面的にはどこでエラーになっているのか把握するのに時間がかかった。

結局、今回は見送り(あきらめた)
VPCで共通のaoss用インターフェイスvpceを設置。プライベートdnsを有効化した。

Discussion