LambdaをVPCに繋ぐと「なぜか外に出られない」「DBのコネクションが枯れる」といった相談が増えます。Hyperplane ENIの仕組みを押さえれば、これらは設計で回避できます。ENI・NAT・VPCエンドポイント・RDS Proxyの勘所を一次情報に沿って整理します。
「Lambdaは何もしなくてもインターネットに出られる」——これはVPCに繋いでいないときの話です。RDSやElastiCacheといったVPC内リソースにアクセスするためにLambdaをVPCへ接続した瞬間、この前提は崩れます。本記事では、VPC Lambdaの土台であるHyperplane ENIの仕組みから、コールドスタートへの影響、privateサブネット必須の理由、NATとVPCエンドポイントの使い分け、そしてDB接続(RDS Proxy)まで、現場で詰まる箇所を順に整理します。
01まず前提:Lambdaは2つのVPCを行き来する
すべてのLambda関数は、Lambdaサービスが所有・管理するVPCの中で実行されます。これは顧客からは見えないVPCで、既定ではインターネットへの経路を持っています。関数にVpcConfigを設定して自社VPCへ「接続」すると、Lambdaはその自社VPC側にネットワークインターフェイスを用意し、実行環境からそのインターフェイスへトンネルを張る形になります。
ここで重要なのは、VPCに接続した関数はLambda管理VPC経由の既定インターネット経路を失うという点です。以降の通信は、すべて接続先の自社VPCのルーティングに従います。「今まで外部APIを叩けていたのに、VPCに繋いだら急にタイムアウトするようになった」という相談の大半は、この一点に集約されます。
02Hyperplane ENIとは何か
LambdaがVPC接続のために作るネットワークインターフェイスを、AWSはHyperplane ENIと呼びます。これは通常のENIとは性質が異なる、Lambdaサービスが自動で作成・管理するマネージドリソースです。ポイントは次の通りです。
- サブネット+セキュリティグループの組み合わせ単位で1本作られる。初めてその組み合わせでVPC接続すると、Lambdaがそのアカウント内にHyperplane ENIを1本作成します。同じ組み合わせを使う他の関数は、この同じENIを共有します。
- 1本あたり最大65,000コネクション/ポートを収容できる。これを超えるとLambdaが自動でENIを増やし、トラフィックと同時実行数に応じてスケールします。
- 直接は見えず、管理も不要。ただし挙動を理解しておくと、後述のコールドスタートやライフサイクルの落とし穴を避けられます。
この「組み合わせ単位で共有」という設計は地味に効きます。同じ用途の関数群を同じサブネット・同じSGに揃えると、ENIの本数が抑えられ、新規作成に伴う待ち時間も減ります。逆に関数ごとにバラバラのSGを割り当てると、ENIが乱立します。
03コールドスタートへの影響と、その正体
「VPC Lambdaはコールドスタートが遅い」という評判は、2019年以前の古い挙動を指していることが多く、現在はかなり事情が違います。以前はENIの作成・アタッチが関数の呼び出しパス上で行われていたため、コールドスタート時に十数秒かかるケースがありました。AWSの公式ブログでは、この改善によって実行時間が14.8秒から933ミリ秒へ短縮した例が示されています。
現在のHyperplaneアーキテクチャでは、ENIの作成は関数の作成時またはVPC設定の更新時に済ませてしまいます。呼び出し時は既存のENIへトンネルを張るだけなので、VPC接続そのものによるコールドスタートのオーバーヘッドは大幅に小さくなりました。
04見落としがちなENIのライフサイクル
Hyperplane ENIには、設計に影響するライフサイクル上の注意点があります。数値や時間はバージョン依存のため公式で最新を確認いただくとして、傾向として押さえておきたいのは次の3点です。
- 新規作成・VPC設定変更の直後は
Pending状態になり、その間は呼び出せない。ENIの準備が整ってActiveになるまで数分かかることがあります。CI/CDで作りたてを即叩くテストは、ここで転びます。 - 長期間アイドルだと
Inactiveになる。一定期間(公式ドキュメントでは14日)呼び出しがないと、Lambdaは未使用のHyperplane ENIを回収し、関数をInactiveにします。次の呼び出しは一度失敗し、再度Pendingを経て復帰します。ごく低頻度の関数は、この挙動を前提に設計してください。 - VPC設定を外すとENI削除に時間がかかる。VPC構成を削除しても、Lambdaがアタッチ済みENIを消すまで最大20分程度かかることがあります(他の関数・バージョンが同じENIを使っていない場合のみ削除)。実行ロールを先に消すとENIが削除できず、手動対応が必要になります。
ドキュメントも明記していますが、設計上ENIの永続性に依存しないことが前提です。IaCで関数を頻繁に作り直す運用では、これらの待ち時間を織り込んでおきましょう。
05privateサブネット必須の理由と、外部通信の作り方
VPC LambdaはprivateサブネットにアタッチするのがAWSの推奨であり、実質的な必須要件です。ここでよく誤解されるのが「publicサブネットに置けばインターネットに出られるのでは?」という発想です。答えはNoです。公式ドキュメントも「関数をpublicサブネットに接続してもインターネットアクセスやパブリックIPは付与されない」と明記しています。
Hyperplane ENIにはパブリックIPが割り当てられないため、Internet Gatewayへの直接経路があっても戻りの通信が成立しません。VPC Lambdaを外部に出す唯一の正攻法は、privateサブネットに置き、NATゲートウェイ経由でegressすることです。構成要素は次の通りです。
- NATゲートウェイはpublicサブネットに配置する(そのpublicサブネットのルートテーブルは
0.0.0.0/0をInternet Gatewayへ向ける)。 - Lambdaを置くprivateサブネットのルートテーブルで、
0.0.0.0/0をNATゲートウェイへ向ける。 - IPv6を使うデュアルスタック構成では、privateサブネットの
::/0をegress-only internet gatewayへ向ける。
疎通確認は、関数からhttps://aws.amazon.com/などへHTTP GETして200が返るか、あるいはTask timed outになるかで判定できます。タイムアウトするなら、まずルートテーブルとNATを疑ってください。NAT自体のコスト設計はNATゲートウェイのコスト設計が詳しいです。
06NATに全部流すな:VPCエンドポイントの使い分け
NATゲートウェイを置くと外に出られますが、AWSサービス宛の通信までNAT経由にすると、処理データ量に応じた課金が積み上がります。VPC Lambdaが叩く先がS3・DynamoDB・SQS・Secrets Manager・KMSといったAWSサービスに限られるなら、VPCエンドポイントを使ってトラフィックをAWSネットワーク内に閉じ込めるのが定石です。NATの請求から外れ、経路もシンプルになります。
実際、Secrets Managerから資格情報を取得する構成では、VPC LambdaはSecrets ManagerのインターフェイスVPCエンドポイントが必要です(AWSのRDS Proxyチュートリアルでも明記されています)。判断軸は次の決定表で整理できます。
- 宛先がS3 / DynamoDB → ゲートウェイ型エンドポイント。追加料金なし。ルートテーブルにprefix listを足すだけ。まず入れて損はない。
- 宛先がその他のAWSサービス(Secrets Manager / KMS / SQS / STS / ECR等)→ インターフェイス型エンドポイント(PrivateLink)。ENI+時間課金+処理量課金。使うサービス分だけ作る。
- 宛先が外部のインターネット(サードパーティAPI等)→ NATゲートウェイ。エンドポイントでは代替できない。
- 宛先が他VPC / オンプレ → VPCピアリング / Transit Gateway / Direct Connect。用途に応じて選定。
enableDnsSupport/enableDnsHostnamesとプライベートDNSの設定も忘れずに。07DB接続の勘所:なぜLambda+RDSはRDS Proxyなのか
VPC Lambdaから直接RDS/Auroraに繋ぐと、コネクション枯渇という古典的な問題に当たります。Lambdaは同時実行数ぶんだけ実行環境が並列に立ち上がるため、各環境が個別にDB接続を張ると、瞬間的にDBの最大接続数を食い潰します。トラフィックのスパイクでDBがtoo many connectionsを返す、という事故はこれが原因です。
ここでRDS Proxyが効きます。RDS ProxyはLambdaとDBの間に立ち、コネクションプールを保持・再利用します。多数のLambda実行環境からの接続を、少数の実DB接続に集約してくれるわけです。AWS公式のチュートリアルも、LambdaからRDSへ書き込む構成をRDS Proxy経由で組んでいます。実装上の勘所は次の通りです。
- DB接続はハンドラの外(初期化コード)で確立する。接続を後続の呼び出しで再利用でき、性能が上がります。公式サンプルもこの形です。
- 資格情報はSecrets Managerに置く。環境変数直書きは避け、VPCエンドポイント経由でSecrets Managerから取得します。
- SGは3つに分けて考える。Lambda用・RDS Proxy用・DBインスタンス用のSGを用意し、Lambda→Proxy→DBの向きで許可します。
- コネクション数が本当に読める場面ではProxyなしも選択肢。予約された同時実行数(reserved concurrency)で上限を固定し、直接接続で足りるならProxyのコスト・レイテンシを避けられます。
RDS Proxyの詳細な設定・フェイルオーバー挙動はRDS Proxyによるコネクション管理で、DB自体の選定はAuroraとRDSの選定で掘り下げています。
08よくある詰まりチェックリスト
現場で繰り返し遭遇する詰まりを、切り分け順に並べます。
- 外部APIがタイムアウトする。→ privateサブネットのルートテーブルが
0.0.0.0/0をNATへ向けているか。publicサブネットに置いていないか。 - Secrets Manager / KMSで固まる。→ 該当サービスのインターフェイスVPCエンドポイントがあるか。プライベートDNSが有効か。SGでHTTPS(443)が通っているか。
- DBに繋がらない。→ Lambda SGのアウトバウンドとDB/Proxy SGのインバウンドが噛み合っているか。同一VPCか(別VPCならピアリング等が必要)。
- スパイク時にDB接続エラー。→ RDS Proxyを挟むか、reserved concurrencyで同時実行数を絞る。
- デプロイ直後のテストが失敗する。→ VPC設定変更後、ENIが
Activeになるまで待つ。 - 低頻度関数がたまに初回失敗する。→ アイドルによる
Inactive化。リトライ設計を入れるか、定期ウォームアップを検討。 - そもそもVPCに入れる必要があるか?→ アクセス先がAWSのマネージドサービス(S3/DynamoDB/SQS等)だけなら、VPC非接続のままVPCエンドポイントを使わず公開エンドポイント+IAMで足りることも多い。VPC接続はDBやElastiCacheなどVPC内リソースに繋ぐ必要があるときの手段と割り切る。
アカウント横断でVPC設定を統制したい場合は、IAM条件キー(lambda:VpcIds / lambda:SubnetIds / lambda:SecurityGroupIds)でガードレールを敷けます。「全関数を特定VPCに強制」「特定サブネットを禁止」といった制御が可能です。組織的な統制はマルチアカウント統制もあわせてご検討ください。
—まとめ
VPC Lambdaは「DBに繋ぐための設定」であり、その瞬間にインターネットへの既定経路を失います。Hyperplane ENIはサブネット+SGの組み合わせ単位で共有され、現在はコールドスタートへの影響も小さい——ただしPending/Inactiveといったライフサイクルは設計に織り込む必要があります。外部通信はprivateサブネット+NAT、AWSサービス宛はVPCエンドポイントで振り分け、DB接続はRDS Proxyでコネクション枯渇を抑える。この4点を押さえれば、VPC Lambdaの設計は堅くなります。数値・料金・上限はバージョン依存のため、実装時は必ず公式ドキュメントで最新を確認してください。実際の設計・移行でお困りの際は導入事例もご覧いただき、お問い合わせください。
—参考(一次情報)
- Giving Lambda functions access to resources in an Amazon VPC — AWS Lambda Developer Guide
- Enable internet access for VPC-connected Lambda functions — AWS Lambda Developer Guide
- Announcing improved VPC networking for AWS Lambda functions — AWS Compute Blog
- Tutorial: Using a Lambda function to access an Amazon RDS database — AWS Lambda Developer Guide