AWS Lambdaでファイルを保持するならS3を使うのもよいですが、永遠に保持する必要がなく一時的なものであれば/tmpを使用するのが便利でしょう。
/tmpの容量変更
初期設定では512MBになっていますが、下記から変更することが可能です。10GBまで。
画像ファイルをダウンロードしてきて、/tmp に保存する
Lambdaで/tmpディレクトリを使用する例です。
コード
try:
# 画像のURLから取得
response = requests.get(url)
if response.status_code == 200:
# tmpディレクトリを指定する
image_file = f"/tmp/image.jpg"
# tmpディレクトリに書き込み
with open(image_file, "wb") as f:
f.write(response.content)
image_files.append(image_file)
else:
print(f"Error downloading image from URL {url}")
return None
except requests.exceptions.RequestException as e:
print(f"Error downloading image from URL {url}: {e}")
return None
except OSError as e:
if e.errno == 30:
print(
f"Error writing image file {image_file}: Read-only file system"
)
else:
print(f"Error writing image file {image_file}: {e}")
解説
Webから画像をダウンロードしてローカルファイルに保存するための処理を行っています。以下にコードの各部分を詳しく説明します。
response = requests.get(url)
:requests
モジュールを使用して、指定されたurl
からHTTP GETリクエストを送信し、response
変数にサーバーからのレスポンスを格納します。このレスポンスには、HTTPステータスコード、ヘッダー、コンテンツなどが含まれます。if response.status_code == 200:
: HTTPステータスコードが200の場合、リクエストが成功したことを示します。これは、正常なレスポンスを受け取った場合に画像をダウンロードする条件を表しています。image_file = f"/tmp/image_{i}.jpg"
: ダウンロードされる画像ファイルのローカルパスを生成します。with open(image_file, "wb") as f:
: バイナリモードでファイルを開くwith
ステートメントを使用して、画像ファイルをローカルに書き込むためのファイルハンドルf
を作成します。f.write(response.content)
: HTTPレスポンスのコンテンツ(画像データ)をローカルファイルに書き込みます。image_files.append(image_file)
: ダウンロードが成功した場合、image_files
リストにダウンロードした画像ファイルのパスを追加します。else
ブロック: HTTPステータスコードが200以外の場合、エラーメッセージを出力します。通常、HTTPステータスコードが200以外の場合、リクエストは失敗しています。except requests.exceptions.RequestException as e:
:requests
モジュールのリクエストに関連する例外が発生した場合、エラーメッセージを出力します。except OSError as e:
: ファイル操作に関連する例外が発生した場合、特定のエラーメッセージを出力します。例えば、ファイルが読み取り専用である場合、Read-only file system
というメッセージが表示されます。
このコードは、HTTPリクエストを送信して画像をダウンロードし、ローカルファイルに保存する一連の手順を実行します。成功した場合は、image_files
リストに画像ファイルのパスが追加されます。エラーが発生した場合、エラーメッセージが表示され、None
が返されるかもしれません。