【AWS】VPC内に配置されたLambdaからS3上のファイルを読み込む

やりたいこと

VPC内に配置されたLambdaからS3上のテキストファイルの中身を読み込みます。VPC内のLambdaからS3へアクセスするためにVPCエンドポイントを作成します。

ファイルがS3にアップロードされたタイミングでLambdaを起動するようにします。

Lambdaの作成

Lambda関数を以下のように作成します。「ネットワークを有効化」にチェックを入れ、Lambdaを配置するVPC、サブネットを指定します。また、Lambda関数にセキュリティグループを設定します。

Lambdaを起動するトリガーをS3、イベントタイプをObjectCreatedとします。

ハンドラ関数の引数eventからアップロードされたオブジェクトのキーを取得し、そのキーを使ってファイルを読み込みます。今回は検証が目的のため、S3に上がったファイルを読み込み標準出力に出します。

import json
import boto3

def lambda_handler(event, context):
    
    s3 = boto3.client("s3")
    key = event['Records'][0]['s3']['object']['key']
    response = s3.get_object(Bucket='xxxx', Key=key)
    body = response['Body'].read()
    print(key)
    print(body)
    
    return 

S3からファイルを読み込むため、Lamabdaに紐づいているロールにS3への読み取り権限を持つポリシーをアタッチしておきます。

VPCエンドポイントの作成

VPC内のLambdaからS3へアクセスするためのVPCエンドポイントを作成し、対象のLmabdaが配置されているサブネットに紐づいているルートテーブルに設定します。

VPCエンドポイント作成後にルートテーブルを確認すると、ルートが追加されていることが確認できます。

動作確認

AWSマネージメントコンソールからS3にテキストファイルをアップロードした後、CloudWatchからLambdaのログを確認します。下の画像のように想定通りにファイルを読み込めていることが確認できました。

AWS,Python

Posted by fanfanta