Briswell Tech Blog

ブリスウェルのテックブログです

VPC内のLambdaからインターネット接続する方法

今回もさくっとAWS関連です。

AWSVPC内でLambdaを動作させることは、RDSや他のプライベートリソースへの安全な接続に必要となります。

そのVPC内のLambdaからインターネット接続をするには、NAT Gatewayを利用することで実現できます。しかし、NAT Gatewayのコストが若干気になりますね。

NAT Gatewayの代替策を確認しました。

ENIにパブリックIPを付与

Lambda関数にアタッチされているElastic Network Interface(ENI)にパブリックIPを割り当ててみる。

最初はこの方法を試し、VPC内のLambdaからインターネット接続できることを確認できたのですが、LambdaのプライベートIPが変わると、パブリックIPの割り当てが解除されてしまいました。

安定した接続を維持するのが難しくなるので、現実的な方法ではないですね。

VPC外のLambdaをブリッジとして使用

VPC内のLambda:メインの処理&RDSとの通信を担当
VPC外のLambda:インターネット接続(メール送信)を担当
VPC内のLambda → VPC外のLambdaを呼び出す

# VPC内LambdaからVPC外Lambdaを呼び出すサンプル
def invoke_send_email_lambda(start_time, end_time, error_message):
    payload = {
        'start_time': start_time.strftime("%Y-%m-%dT%H:%M:%S"),
        'end_time': end_time.strftime("%Y-%m-%dT%H:%M:%S"),
        'error_message': error_message
    }

    response = lambda_client.invoke(
        FunctionName=LAMBDA_FUNCTION_NAME,  # ここにVPC外のLambdaの関数名を記載
        InvocationType='RequestResponse',  # 同期的に呼び出す
        Payload=json.dumps(payload)        
    )

    response_payload = json.loads(response['Payload'].read())
    print("VPC外のLambdaからのレスポンス:", response_payload)

この方法で実現できました。

VPC内のLambdaからVPC外のLambdaを呼び出すためには、VPCエンドポイントの設定が必要です。

Lambdaすごいですね。