3
1

Lambda内でファイルダウンロードができない?そんなときはtmpを疑え

Last updated at Posted at 2024-08-13

はじめに

昔ハマったところの記事書き直し。

【対象読者】

  • 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)}")

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1