目次

Lambdaからのパブリックアクセス

ふと、Lambdaからのパブリックアクセスってどうなっているの?と思って試してみた。
最初の疑問、AWS API叩けるんだから非VPCのLambdaはできるよね・・・VPC内のLambdaは??
結果は、非VPCは特別な設定は不要で、VPC内からはNATを経由することでパブリックアクセス可能となりました。

事前準備

パブリックAPIGatewayを作成

APIGateway/Lambda関数の呼び出し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からの呼び出し

イメージ図

結果は成功、問題なく呼び出せました。

パブリックサブネットに配置したVPCLambdaからの呼び出し

[AWSLambdaVPCAccessExecutionRole]は、VPC内にLambda関数を作成する際に必要なポリシーです。
イメージ図

結果は失敗、タイムアウトしました。

プライベートサブネットに配置したVPCLambdaからNATGWを経由して呼び出し

調べたところ、公式に載っていました。NATGWを経由せよ・・・ホント?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/internet-access-lambda-function/
イメージ図

結果は成功、問題なく呼び出せました。

よく考えたら、LambdaはプライベートIPしかもっていないから、パブリックサブネットに配置してもIGW経由で疎通できないのか
と思って、EIPをLambdaのネットワークインターフェースに割り当てようとしたらエラーで失敗しました。