~~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 なるほど}}