はじめに
昔ハマったところの記事書き直し。
【対象読者】
- Lambda初心者
- Lambda内でファイル作成・s3からのダウンロードなど行いたい人
【使用環境】
- AWS S3
- AWS Lambda
- Python=3.10
- boto3
本題
lambda上でPython boto3ライブラリを使用しS3からファイルをダウンロードしていたときのこと。
以下のようなエラーが発生し、ダウンロードができませんでした。
[Errno 2] No such file or directory: '/item/6534.pbf.C92d54EC'
No such file or directoryなので「そんなファイルないよ!」って状態。
(よく見ると以下の「ないよ!」と言われているファイル名、なんか変な拡張子がついてますね。)
'/item/6534.pbf.C92d54EC'
ちなみにこの状況、lambda上の同じ/item/階層で、新しいファイル作成 もできません。
解決策
実はこれ、lambda上では/tmp/
ディレクトリ配下でしかファイルを変更できないんです。
ダウンロード先pathやファイル作成時のpathに/tmp/
のpathも追加して記載すると解決します。
※ちなみに/tmp/
pathも追加しても同じエラーが発生する場合、/tmp/配下のディレクトリ(この場合/item/)を作成してないのが原因です。
ディレクトリを作成するコマンドも追記しましょう。
以下エラーを発生させないboto3ダウンロードサンプルコード
import boto3
import os
# S3クライアントの初期化
s3 = boto3.client('s3')
# S3バケット名とオブジェクトキーを指定
bucket_name = 'your-bucket-name'
object_key = 'your/object/key'
# ダウンロード先ディレクトリを設定
download_path = '/tmp/item/'
# ダウンロード先ディレクトリが存在しない場合にディレクトリを作成
try:
if not os.path.exists(download_path):
os.makedirs(download_path)
print(f"ダウンロードディレクトリ {download_path} を作成しました。")
# ファイルのダウンロード
s3.download_file(bucket_name, object_key, os.path.join(download_path, os.path.basename(object_key)))
print(f"ファイル {object_key} をダウンロードしました。")
except Exception as e:
print(f"ファイルのダウンロード中にエラーが発生しました: {str(e)}")