VPC内・VPC外のLambdaが 他のリソースに対して、アクセス可能・不可能のパターン集

# はじめに
Lambdaを使う上で、VPC内の`public subnet`、`private subnet`にあるLambdaが他のリソースにアクセスするパターンや、他のサービスからLambdaを呼ぶパターンなど、様々なパターンで実現可能かどうかまとめました。

vpc内外のLambdaからvpc内外のLambdaを呼ぶパターンの記事は下記に記載しています。

https://qiita.com/hirai-11/items/f16b326061956fb85c9c

# 非 VPC の Lambda がリソースに対して、アクセスする
![スクリーンショット 2022-06-21 22.39.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/57644825-aec1-e23b-ffe8-0bbeeb0148f1.png)

|  Lambda →  リソース |アクセス|
|:-:|:-:|
| Lambda  →  リージョンサービス |○|
|  Lambda → public内 リソース  | ○  |
|  Lambda → private内 リソース  | ✗  |

リージョンサービスのリソースに対して、Lambdaを実行することはできます。

Lambdaは、VPC内のサービスのうち、publicにあるサービスに対しては実行でき、privateにあるサービスに対しては実行できません。


# 他のリソースが 非 VPC の Lambda を呼ぶ
## NAT Gatewayがないパターン
![スクリーンショット 2022-06-21 22.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/b8365ba7-8ce4-44cd-764c-44fd2c479051.png)


| リソース  →  Lambda |アクセス|
|:-:|:-:|
| リージョンサービス  →  Lambda |○|
|  public内 リソース  →  Lambda  | ○  |
|  private内 リソース  →  Lambda  | ✗  |
|  private内 リソース  →  Lambda  | ○ (vpcエンドポイント有り)  |

private内からは、vpcエンドポイントを使用すると、Lambdaを呼ぶことはできます。
実際の構築方法は以下の記事が参考になります。

https://dev.classmethod.jp/articles/dynamodb-vpc-endpoint-lambda/#toc-6

## NAT Gatewayがあるパターン

![スクリーンショット 2022-06-21 22.55.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/677a4bcc-fa07-d48e-ed04-072b5b3f28c9.png)
| リソース  →  Lambda |アクセス|
|:-:|:-:|
| リージョンサービス  →  Lambda |○|
|  public内 リソース  →  Lambda  | ○  |
|  private内 リソース  →  Lambda  | ○  |
|  private内 リソース  →  Lambda  | ○ (vpcエンドポイント有り)  |

ＮATGatewayを設置すると、private内のリソースからインターネット経由でLambdaを呼ぶことができます。


# VPCのpublic内にある Lambda がリソースにアクセスする

![スクリーンショット 2022-06-21 23.07.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/c27041c8-9ea5-1a3a-e291-f9548d7f0afc.png)

| 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 を呼ぶ



![スクリーンショット 2022-11-15 23.30.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/698c6ba0-18b0-600f-07ac-5ea16ae34841.png)


| リソース  →  Lambda |アクセス|
|:-:|:-:|
| リージョンサービス  →  Lambda |○|
|  public内 リソース  →  Lambda  | ○  |
|  private内 リソース  →  Lambda  | ✕  |
|  private内 リソース  →  Lambda  | ○ (vpcエンドポイント有り)  |

public内のLambdaは、どこからでも呼ぶことができます。

# VPCのprivate内にある Lambda がリソースにアクセスする
## NAT Gatewayがないパターン

![スクリーンショット 2022-06-21 23.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/1cc51a86-9927-6a8b-dddb-dc061252ca10.png)

|  Lambda →  リソース |アクセス|
|:-:|:-:|
| Lambda  →  private内 リソース |○|
|  Lambda → public内 リソース  | ✗  |
|  Lambda → リージョンサービス  | ✗ (vpcエンドポイントサポート外) |
|  Lambda  →  リージョンサービス  | ○ (vpcエンドポイント有り)  |

VPCエンドポイントサポート外のリージョンサービスのPinpointなどは、Lambdaからアクセスできません。

## NAT Gatewayがあるパターン

![スクリーンショット 2022-06-21 23.34.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/1704446f-c754-aa39-f961-42ceab1ee891.png)

NATGateway周りの流れ詳細↓

![スクリーンショット 2022-06-21 23.35.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/d33f43d1-1ee5-c4cc-5726-7d4d6c492739.png)

|  Lambda →  リソース |アクセス|
|:-:|:-:|
| Lambda  →  private内 リソース |○|
|  Lambda → public内 リソース  | ○  |
|  Lambda → リージョンサービス  | ○ (vpcエンドポイントサポート有り) |
|  Lambda  →  リージョンサービス  | ○ (vpcエンドポイント有り)  |

VPC内でLambdaが様々なリソースにアクセスするためには、privateに設置し、かつ、NATGatewayが必要ということですね。

# 他のリソースが VPCのprivate内にある Lambda を呼ぶ
![スクリーンショット 2022-06-21 23.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/8de17c4b-6c4a-a1a3-990e-1690608e683e.png)

| リソース  →  Lambda |アクセス|
|:-:|:-:|
| リージョンサービス(SQS除く)  →  Lambda |✗|
| SQS →  Lambda |○|
| Event Bridge →  Lambda |○|
|  public内 リソース  →  Lambda  | ○  |
|  private内 リソース  →  Lambda  | ✗  |

SQS をイベントソースにした private上のLambdaは、実行しないと思っておりましたが、実行するようです。
下記の記事が分かりやすかったです。


https://dev.classmethod.jp/articles/sqs-to-vpclambda/

>AWS Lambda から SQS をポーリングしており、メッセージがエンキューされたことをトリガーにAWS Lambda が VPC上のLambda 関数をコールする

`Event Bridge`も同様の理由でLambdaに値を渡して起動することが可能です。

# 参考

https://qiita.com/duplicate1984/items/791b13354d9657e7869e

https://qiita.com/horit0123/items/86c727d8d3ae74b9e52a

https://qiita.com/kojiisd/items/a15c1807c5c6bb08add0