一覧に戻る

LambdaをVPCに配置する・インターネット通信を可能にする・RDSと接続する

#AWS#RDS#vpc#lambda#サーバーレス

はじめに

LambdaはVPCに配置することが出来る、いわゆる「VPC Lambda」である。Lambdaはせっかくサーバーレスなので、VPCのことはなるべく考えたくないが、RDSなどセキュアな接続が求められるVPC内リソースのことを考慮すると、VPCに配置したくなることがあるだろう(セキュリティグループによるアクセス制御の恩恵を受けられるため)。

ところでLambdaについては、①Lambda単体でHTTPSリクエストを受けられるようになったこと②HTTPを話す任意のコンテナがLambdaで動くことを、それぞれ試してきたところ。

https://zenn.dev/kanahiro/scraps/3f62eddfdf86c8

https://zenn.dev/kanahiro/scraps/1c24e4cc73f2d5

特に①は**VPC Lambdaであっても有効である。LambdaをVPCに配置しても非VPCと遜色なく動けばすごく嬉しいので、試してみる。

VPC Lambda

VPC Lambdaは当初、コールドスタートがやたら遅いという問題があったらしいが、2019年に解消されている。

https://aws.amazon.com/jp/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/

実際試したところ、非VPC Lambdaと同等程度の時間でコールドスタートすることがわかった。

では非VPC Lambdaと同じように動くのか…というとそうではない。単にLambdaをVPCに配置しただけでは、エグレスへの通信(外方向へのインターネット通信)が出来ない。

VPC Lambdaのエグレスへの通信

定石らしきもの

この記事を書いた時点では、「VPC Lambda インターネット」とかで調べると、NATゲートウェイを設置せよ、という記事が多数見つかる。これらは、Lambdaをプライベートサブネットに配置して、パブリックサブネットにNATゲートウェイを配置し…という手順である。なんなら公式もそう言っていた。

https://repost.aws/ja/knowledge-center/internet-access-lambda-function

もっとシンプルな解決策

そんなにネットワークが得意でもないし、公式がそう言っているならそうなのかな…、と思っていたが、別の記事を見つける。

https://dev.classmethod.jp/articles/lambda-vpc-with-global-address/

この記事では

  • Lambdaをパブリックサブネットに配置し
  • LambdaをVPCに配置すると作成されるENIにElasticIPを関連づける

ことにより、IGWを通じてエグレスへの通信が可能であることが説明されている。 上記の筆者の方は「利用機会がわからない」とおっしゃっているが、VPC Lambdaのコールドスタートが改善し・Lambda単体でコンテナが動き・HTTPリクエストを受けられる現在、この手法は非常に有用と考えている。これらにより、ほぼVPCを意識せずにウェブアプリケーションを構築出来るようになるからである。

余談: このあたりの事情や、RDSはなぜプライベートサブネットに配置するのか、などを調査していて、プライベートサブネットを利用するメリットはあまり無いのではないかと考えている。RDSはプライベートサブネットに配置するのが定石のようだが、DBに接続するために踏み台サーバーが必要になる(最近はInstance Connectなるサービスがあるようだが)。パブリックサブネットに配置しても、セキュリティグループを適切に設定すればリスクは無いだろう、という記事を読んで、強く同意した。設定ミスのリスクはあるが、踏み台サーバーの管理ミスのリスクと大差ないと思う。なので、VPCリソースは全てパブリックサブネットに配置して、セキュリティグループで制御する、で十分安全だと思っている。有識者のコメント求む。

LambdaをVPCに配置すると、自動的にENIが作成される。ENIはEC2以下に含まれるようだ。

さて、VPCに配置したLambdaがなぜエグレスへの通信が出来ないかというと、パブリックIPアドレスを持たないからとのことである。ElastcIPを作成して、当該ENIに紐つけてみる。

なんとこれだけで、VPC Lambdaがエグレスへ通信出来るようになった。デメリットは現状観測している限りわかっておらず、唯一、VPC Lambdaのセキュリティグループなどネットワークの設定変更をした際、ElasticIPの関連付けが外れることがあった(再関連付けを許可する〜を有効にしていなかったためかもしれない)。このあたりの設定は頻繁に変わるようなものではないため、影響は小さいだろう。

VPC LambdaのVPCリソースへの疎通チェック

VPC内でのLambdaとRDSの通信をチェックする。なおいずれもパブリックサブネットにある。

  • Lambdaのセキュリティグループに、RDSへのインバウンドを許可する。接続出来る。
  • インバウンドの許可を外す。接続出来ない。

当たり前なのかもしれないが、これが出来るようになったのが個人的に感動ポイントだった。

:::note info なおLambdaとRDSの組み合わせはアンチパターンとされているが、Auroraのまともなインスタンスなら、かなりのコネクション数に対応しているようではある。Lambdaのデフォルトの最大同時実行数は1000なので、問題になることはないのではないか。大規模アクセスに晒したことが無いため、どれくらい悪影響があるのかはわかっていない…。悪影響があればRDS Proxyを使うのがよいだろう。 :::

終わりに

WebAdapterやFunction URLによりコンテナを手軽にデプロイする力を得たLambda。VPCに配置してもなかなかデメリットが見当たらず、ECSはまだしもApp Runnerなんか見るに「もう全部Lambdaで良くないですか」という状況ではないかと思っています。