LambdaからRDSとインターネットにアクセスする構成の考慮事項

Ryo Sakaguchi
Grid Solutions
Published in
Mar 11, 2024

弊社の需給調整市場の入札システムではAWS Lambdaを採用しており、Lambda関数からAmazon RDSやインターネットと通信します。(インターネット上の通信は相互SSL認証などを利用することによりセキュリティを担保しております)

今回はこのようなRDSとインターネットの両方にLambdaからアクセスする際の考慮事項について述べたいと思います。

構成

RDSはVPC内のプライベートサブネットに配置します。Lambda関数はVPC内のプライベートサブネットと紐付け、VPC内のNATゲートウェイとインターネットゲートウェイを通じてインターネットへアクセスします。

考慮事項

Lambda関数はプライベートサブネットと紐づける

Lambda関数をパブリックサブネットに置けばNATゲートウェイなしでインターネットへ通信できると考える方がいらっしゃるかもしれませんが、この場合Lambda関数にパブリックIPが付与されないためインターネットに通信できません。

Lambda関数はプライベートサブネットに配置し、NATゲートウェイまたはNATインスタンスを経由する必要があります。

Lambda関数をスケールさせる際はRDSのコネクションの上限に注意する

Lambdaでは同じ関数を同時に複数動かすことができます。これはサーバレス環境の長所です。

一方でRDSへのコネクションには上限があるため、これを超えないような呼び出しが求められます。

弊社では同時に複数のLambda関数を動かすケースは少ないため、Lambda関数のコスト効率性の恩恵を受けることができています。

Lambda関数は1回以上実行される可能性がある

Lambda関数は呼び出されるごとに1回のみ実行されると勘違いしがちなのですが、1回以上実行される可能性があります。そのためRDSにデータを保存するようなロジックの場合は冪等性を意識する必要があります。

例えばRDSにデータが重複して保存されないよう、バリデーションをLambda関数のロジックに実装するなどの工夫が必要となります。

これは特にLambda関数の呼び出しタイプが非同期の場合に発生します。というのも非同期呼び出しの場合、デフォルトでは関数が自動的に2回までリトライする仕様になっているためです。例えばAmazon EventBridgeから定期的なジョブを実行するようなよくあるユースケースでも非同期呼び出しとなっているため、注意が必要です。

番外編

Lambda関数はVPC外にある

「Lambda関数をVPCに置く」という言い方がありますが、Lambda関数はVPC内に配置されるわけではありません。Lambda関数自体は他のVPCに置かれており、そこから指定のVPCへのアクセスが可能になっているということです。

そのためLambdaコンテナイメージを使用してLambda関数を作成する場合、VPC内にECR用のVPCエンドポイントを作成する必要がありません。

(そもそもインターネットアクセスがあればVPCエンドポイントを必ずしも作成する必要はないので、番外編とさせていただきました)

コールドスタート時のレイテンシが大きい

Lambda関数への初回アクセス時など、コールドスタート時にはレイテンシが大きくなります。弊社はNode.js 20をLambda関数上で実行しているのですが、コールドスタート時にはレイテンシが約5秒程度増える傾向があります。

Lambda関数にアクセスされたあと一定時間はウォームスタートとなり、レイテンシは低くなります。

(これはLambdaを使用する際に幅広く言えることなので、番外編とさせていただきました)

まとめ

ここでは弊社が開発時に気をつけている考慮事項についてまとめました。

Lambda関数には上に記載した点以外にも様々な制約があります。Lambdaのスケーラビリティやコスト効率性は魅力ですが、Lambdaを利用して要件を満たすことができるか事前に確認が必要となります。

参考

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc.html#vpc-internet

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-async.html

https://youtu.be/QvPgjEwgiew?si=IfriVfW_crkIaSN_

https://youtu.be/96ku2x1NCaE?si=GPZpOPwdX_queHGY

https://zenn.dev/shimi7o/articles/79fb5cb2175a6c

--

--