~~NOCACHE~~
## Lambdaからのパブリックアクセス
ふと、Lambdaからのパブリックアクセスってどうなっているの?と思って試してみた。
最初の疑問、AWS API叩けるんだから非VPCのLambdaはできるよね・・・VPC内のLambdaは??
結果は、非VPCは特別な設定は不要で、VPC内からはNATを経由することでパブリックアクセス可能となりました。
{{:Aws:Lambda:pasted:20210522-121653.png?direct 800x0}}
### 事前準備
#### パブリックAPIGatewayを作成
[[Aws:APIGateway:CallingLambdafunction|APIGateway/Lambda関数の呼び出し]]や[[Aws:APIGateway:CallPrivateApiGatewayFromDifferentAccount|Aws/APIGateway/プライベートAPIGatewayを異なるアカウントから呼び出す]]を参考にしてください。
パブリックAPIGatewayを作成し、[Lambda プロキシ統合の使用]を設定してLambdaを呼び出しています。
#### APIGatewayから呼び出されるLambda関数の作成
Lambdaは、[event]から['httpMethod']を抽出して、APIGatewayにレスポンスを返しています。
つまり「"GET"」とだけレスポンスします。
import json
def lambda_handler(event, context):
return {
'isBase64Encoded': False,
'statusCode': 200,
'headers': {},
'body': json.dumps(event['httpMethod'])
}
#### パブリックAPIGatewayを呼び出すLambda関数の作成
ただのHTTPSリクエストをするだけの関数です。
つまり正常にレスポンスを受けたら「"GET"」とだけ表示します。
import urllib3
import json
def lambda_handler(event, context):
url = "https://XXXXX.execute-api.ap-northeast-1.amazonaws.com/dev"
http = urllib3.PoolManager()
response = http.request("GET",url)
content = json.loads(response.data.decode("utf-8"))
return content
### 検証
#### 非VPCLambdaからの呼び出し
イメージ図
{{:Aws:Lambda:pasted:20210522-111808.png?direct 600x0}}
結果は成功、問題なく呼び出せました。
{{:Aws:Lambda:pasted:20210522-113039.png?direct 600x0}}
#### パブリックサブネットに配置したVPCLambdaからの呼び出し
[AWSLambdaVPCAccessExecutionRole]は、VPC内にLambda関数を作成する際に必要なポリシーです。
イメージ図
{{:Aws:Lambda:pasted:20210522-121050.png?direct 600x0}}
結果は失敗、タイムアウトしました。
{{:Aws:Lambda:pasted:20210522-113658.png?direct 600x0}}
#### プライベートサブネットに配置したVPCLambdaからNATGWを経由して呼び出し
調べたところ、公式に載っていました。NATGWを経由せよ・・・ホント?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/internet-access-lambda-function/
イメージ図
{{:Aws:Lambda:pasted:20210522-121133.png?direct 600x0}}
結果は成功、問題なく呼び出せました。
{{:Aws:Lambda:pasted:20210522-115843.png?direct 600x0}}
よく考えたら、LambdaはプライベートIPしかもっていないから、パブリックサブネットに配置してもIGW経由で疎通できないのか
と思って、EIPをLambdaのネットワークインターフェースに割り当てようとしたらエラーで失敗しました。
{{tag>AWS Lambda なるほど}}