今回もさくっとAWS関連です。
AWSのVPC内で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すごいですね。