ふと、Lambdaからのパブリックアクセスってどうなっているの?と思って試してみた。
最初の疑問、AWS API叩けるんだから非VPCのLambdaはできるよね・・・VPC内のLambdaは??
結果は、非VPCは特別な設定は不要で、VPC内からはNATを経由することでパブリックアクセス可能となりました。
APIGateway/Lambda関数の呼び出しやAws/APIGateway/プライベートAPIGatewayを異なるアカウントから呼び出すを参考にしてください。
パブリックAPIGatewayを作成し、[Lambda プロキシ統合の使用]を設定してLambdaを呼び出しています。
Lambdaは、[event]から['httpMethod']を抽出して、APIGatewayにレスポンスを返しています。
つまり「“GET”」とだけレスポンスします。
import json def lambda_handler(event, context): return { 'isBase64Encoded': False, 'statusCode': 200, 'headers': {}, 'body': json.dumps(event['httpMethod']) }
ただの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
調べたところ、公式に載っていました。NATGWを経由せよ・・・ホント?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/internet-access-lambda-function/
イメージ図
結果は成功、問題なく呼び出せました。
よく考えたら、LambdaはプライベートIPしかもっていないから、パブリックサブネットに配置してもIGW経由で疎通できないのか
と思って、EIPをLambdaのネットワークインターフェースに割り当てようとしたらエラーで失敗しました。