AWS

【AWS S3 Lambda】Lambda関数でS3ファイルを読み込む方法

・AWS Lambda関数にてS3のファイルを読み込み
・Pythonで実行

はじめに

AWS Lambda内でS3の特定ファイルを読み込む要件がありましたので備忘も兼ねて方法を記載しています。

AWS Lambdaがあまり分からないという方は下記も参考ください。

S3にファイルを置く

テスト用に使うファイルをS3に格納します。
バケット名とファイル名は以下となります。

なおファイルの中身は2行だけのシンプルなものです。

こんにちは
複数行
バケットファイル
testosusutest.txt(UTF-8形式)

今回はテスト用であるためセキュリティリスクは皆無ですが、念の為パブリックアクセスはブロックしています。
バケットを作成した際のデフォルト設定通りです。

AWS Lambdaに関数作成

次にAWS Lambdaで関数を作成します。
Python3.7のコードは下記となります。

import json
import boto3

# バケット名,オブジェクト名
BUCKET_NAME = 'testosusu'
OBJECT_KEY_NAME = 'test.txt'

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    response = s3_client.get_object(Bucket=BUCKET_NAME, Key=OBJECT_KEY_NAME)
    body = response['Body'].read().decode('utf-8')
    print(body)
    return ''

2行目以降にある「boto3」がS3を読み込むライブラリです。
11行目でバケット、ファイル名を指定して結果を取得します。
それをもとに12行目でUTF-8形式でデコードしています。

AWS Lambda上でS3の読み取り権限付与

AWSはサービス単位で権限を管理しているため他サービスとの連携には権限の付与が必須です。
今回はLambda内でS3サービスを使うため、Lambda内にS3の権限を付与します。
読み取りのみのため、読み取り権限となります。

上記で作成した関数内の「設定」タブの「アクセス権限」にある、ロールの中にS3の読み取り権限を付与します。

ロール名のリンクを押すと、IAMの画面に移動します。
そこにある「許可ポリシー」にS3読み取り権限を追加します。

画像右側にある「アクセス許可を追加」から「ポリシーをアタッチ」を選択します。
ポリシー一覧が表示されるので、中央上部にある検索ボックスに「S3」と入力してフィルターします。

S3でフィルタリングされた中にある、「AmazonS3ReadOnlyAccess」の行にチェックして「ポリシーをアタッチ」を選択します。
これによりS3の読み取り権限が付与されます。
読み取り以外の権限を追加する場合は「AmazonS3FullAccess」も検討してください。

これでLambda関数内でS3の読み取りが行えるようになります。
ロールはLambda関数単位で違うため、関数を新規作成する際は再度設定する必要があります。

実行結果

S3の読み取り権限を追加したので準備は完了しました。
Lambda関数で「デプロイ」を押して「テスト」を押してください。

printで出力しているためFunction Logsに対象ファイルの内容が出力されています。

以上でLambda関数でS3のファイルを読み取り方法となります。
読み取り権限を付与する方法を忘れないようにしてください。

参考

AWS LambdaのPythonでS3のファイルを取得する。
https://dev.classmethod.jp/articles/get-s3-object-with-python-in-lambda/