backend
A
信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
Lambda VPC設定 — プライベートリソースアクセス・コールドスタート・ENI制限
LambdaをVPC内に配置する設定、プライベートDBやElastiCacheへのアクセス、コールドスタートへの影響、ENI数の計算、インターネットアクセスのためのNAT設定を解説。
一言結論
VPC内LambdaはHyperplane ENIの導入でコールドスタート問題は解消されているが、インターネットアクセスにはNATゲートウェイが必要になるため、S3やDynamoDBへのアクセスはVPCエンドポイントに切り替えてNATコストを削減するのが実運用の鉄則だ。
LambdaのVPC設定が必要な場面
Lambdaはデフォルトでインターネット(AWSサービスを含む)にアクセスできるが、VPC内のプライベートリソース(RDS, ElastiCache, プライベートAPI等)にはアクセスできない。
VPC設定が必要なケース:
- VPC内のRDS/Auroraに接続したい
- VPC内のElastiCache(Redis)に接続したい
- VPC内のEC2上のサービスを呼び出したい
- VPCエンドポイント経由でS3等にアクセスしたい
VPC設定は不要なケース:
- DynamoDB(パブリックエンドポイント、または VPCエンドポイント経由)
- S3(パブリックエンドポイント、または VPCエンドポイント経由)
- 外部API(インターネット経由)
VPC設定の仕組み
# Lambda関数にVPC設定を追加
aws lambda update-function-configuration \
--function-name my-function \
--vpc-config '{
"SubnetIds": ["subnet-aaa", "subnet-bbb", "subnet-ccc"],
"SecurityGroupIds": ["sg-xxx"]
}'
VPC設定時のLambdaの動作:
起動時: AWSがElastic Network Interface(ENI)を作成
→ ENIをVPCのサブネットに配置
→ LambdaはそのENI経由でVPC内リソースに接続
必要なIAM権限(実行ロールに追加):
ec2:CreateNetworkInterface
ec2:DescribeNetworkInterfaces
ec2:DeleteNetworkInterface
または マネージドポリシー:
AWSLambdaVPCAccessExecutionRole
コールドスタートへの影響(Hyperplane ENI)
かつてはVPC内Lambdaのコールドスタートが15〜30秒かかる問題があったが、AWS Hyperplane ENIの導入(2019年)で大幅に改善された。
Hyperplane ENI(現在のアーキテクチャ):
- ENIはLambda実行ごとではなく、設定変更時に事前に割り当て
- コールドスタートはVPC設定なしとほぼ同じ(数百ミリ秒程度)
- ENIは関数の設定が変わるまで再利用される
コールドスタートが長い場合の対処法:
- プロビジョニング済み同時実行(Provisioned Concurrency)
- ランタイムを軽量なものに変更(Node.js, Pythonを検討)
- デプロイパッケージサイズを削減
ENI数の計算
LambdaのVPC設定では、同時実行数とサブネット数に基づいてENIが必要になる。
従来(Hyperplane以前):
ENI数 = 同時実行数 × 設定したサブネット数
Hyperplane(現在):
ENI数 = 関数あたり最大数台(共有されるため大幅削減)
→ アカウントごとのENI上限(デフォルト5,000)を超えるリスクが低減
インターネットアクセスの設定
VPC内のLambdaはインターネットに直接アクセスできない。NATゲートウェイが必要だ。
❌ VPC内Lambda → インターネット(直接): 不可
✅ VPC内Lambda → NATゲートウェイ(パブリックサブネット)→ インターネット
設定方法:
1. Lambda をプライベートサブネットに配置
2. プライベートサブネットのルートテーブルに NATGWへのルートを追加
3. Lambda はインターネットとプライベートRDSの両方にアクセス可能
コスト注意:
NATGWを経由するとデータ処理料金が発生
S3/DynamoDBへのアクセスはVPCエンドポイントで回避
# VPC内LambdaからS3にアクセスするためのVPCエンドポイント
aws ec2 create-vpc-endpoint \
--vpc-id vpc-xxx \
--service-name com.amazonaws.ap-northeast-1.s3 \
--route-table-ids rtb-private-xxx
セキュリティグループの設計
Lambda のセキュリティグループ:
アウトバウンド: DB(3306)をRDS SGに向けて許可
インバウンド: 通常は不要(Lambdaは外から直接接続されない)
RDSのセキュリティグループ:
インバウンド: TCP 3306 を Lambda SGからのみ許可
設定例:
Lambda SG → インバウンドなし、アウトバウンドはRDS SGに3306
RDS SG → インバウンドはLambda SGから3306のみ
Lambda URLとVPC
Lambda Function URLsはVPC設定に関係なく使えるが、VPC外からのアクセスが前提だ。
Lambda Function URL(HTTPS直接呼び出し):
→ VPC設定の有無に関わらずHTTPS経由でアクセス可能
→ ただしFunction URL自体はパブリックエンドポイント
→ 認証はAWS_IAMまたはNONEを選択
試験頻出ポイント
| シナリオ | 回答 |
|---|---|
| LambdaからプライベートRDSに接続 | Lambda VPC設定が必要 |
| VPC内LambdaからS3にアクセス | VPCエンドポイント(Gatewayタイプ)で無料 |
| VPC内LambdaからインターネットAPI呼び出し | NAT Gatewayが必要 |
| VPC設定後のコールドスタート遅延 | Hyperplane ENIにより改善済み |
| Lambda VPC実行ロールの追加権限 | AWSLambdaVPCAccessExecutionRole |
まとめ
VPC内のLambdaはプライベートRDSやElastiCacheへのアクセスに必要だが、インターネットアクセスにはNATゲートウェイが必要になる。S3/DynamoDBへのアクセスはVPCエンドポイントでNAT不要にすることでコスト削減できる。Hyperplane ENIにより従来のコールドスタート問題は大幅に改善されている。