SJ blog
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により従来のコールドスタート問題は大幅に改善されている。