はじめに
Lambdaを使う上で、VPC内のpublic subnet
、private subnet
にあるLambdaが他のリソースにアクセスするパターンや、他のサービスからLambdaを呼ぶパターンなど、様々なパターンで実現可能かどうかまとめました。
vpc内外のLambdaからvpc内外のLambdaを呼ぶパターンの記事は下記に記載しています。
非 VPC の Lambda がリソースに対して、アクセスする
Lambda → リソース | アクセス |
---|---|
Lambda → リージョンサービス | ○ |
Lambda → public内 リソース | ○ |
Lambda → private内 リソース | ✗ |
リージョンサービスのリソースに対して、Lambdaを実行することはできます。
Lambdaは、VPC内のサービスのうち、publicにあるサービスに対しては実行でき、privateにあるサービスに対しては実行できません。
他のリソースが 非 VPC の Lambda を呼ぶ
NAT Gatewayがないパターン
リソース → Lambda | アクセス |
---|---|
リージョンサービス → Lambda | ○ |
public内 リソース → Lambda | ○ |
private内 リソース → Lambda | ✗ |
private内 リソース → Lambda | ○ (vpcエンドポイント有り) |
private内からは、vpcエンドポイントを使用すると、Lambdaを呼ぶことはできます。
実際の構築方法は以下の記事が参考になります。
NAT Gatewayがあるパターン
リソース → Lambda | アクセス |
---|---|
リージョンサービス → Lambda | ○ |
public内 リソース → Lambda | ○ |
private内 リソース → Lambda | ○ |
private内 リソース → Lambda | ○ (vpcエンドポイント有り) |
NATGatewayを設置すると、private内のリソースからインターネット経由でLambdaを呼ぶことができます。
VPCのpublic内にある Lambda がリソースにアクセスする
Lambda → リソース | アクセス |
---|---|
Lambda → リージョンサービス | ✗ |
Lambda → public内 リソース | ✗ |
Lambda → private内 リソース | ○ |
Lambda → private内 Lambda | ✗ |
LambdaにはElastic IPが割り当てられないので、public内のLambdaは、インターネットアクセスをすることができません。
publicにあるLambdaは、インターネットに繋がらないと覚えておきましょう。
また、LambdaがLambdaを呼ぶときは、必ずインターネット経由になるため、
public内のLambdaは、privateにあるLambdaを呼ぶことはできません。
他のリソースが VPCのpublic内にある Lambda を呼ぶ
リソース → Lambda | アクセス |
---|---|
リージョンサービス → Lambda | ○ |
public内 リソース → Lambda | ○ |
private内 リソース → Lambda | ✕ |
private内 リソース → Lambda | ○ (vpcエンドポイント有り) |
public内のLambdaは、どこからでも呼ぶことができます。
VPCのprivate内にある Lambda がリソースにアクセスする
NAT Gatewayがないパターン
Lambda → リソース | アクセス |
---|---|
Lambda → private内 リソース | ○ |
Lambda → public内 リソース | ✗ |
Lambda → リージョンサービス | ✗ (vpcエンドポイントサポート外) |
Lambda → リージョンサービス | ○ (vpcエンドポイント有り) |
VPCエンドポイントサポート外のリージョンサービスのPinpointなどは、Lambdaからアクセスできません。
NAT Gatewayがあるパターン
NATGateway周りの流れ詳細↓
Lambda → リソース | アクセス |
---|---|
Lambda → private内 リソース | ○ |
Lambda → public内 リソース | ○ |
Lambda → リージョンサービス | ○ (vpcエンドポイントサポート有り) |
Lambda → リージョンサービス | ○ (vpcエンドポイント有り) |
VPC内でLambdaが様々なリソースにアクセスするためには、privateに設置し、かつ、NATGatewayが必要ということですね。
他のリソースが VPCのprivate内にある Lambda を呼ぶ
リソース → Lambda | アクセス |
---|---|
リージョンサービス(SQS除く) → Lambda | ✗ |
SQS → Lambda | ○ |
Event Bridge → Lambda | ○ |
public内 リソース → Lambda | ○ |
private内 リソース → Lambda | ✗ |
SQS をイベントソースにした private上のLambdaは、実行しないと思っておりましたが、実行するようです。
下記の記事が分かりやすかったです。
AWS Lambda から SQS をポーリングしており、メッセージがエンキューされたことをトリガーにAWS Lambda が VPC上のLambda 関数をコールする
Event Bridge
も同様の理由でLambdaに値を渡して起動することが可能です。
参考