[AWS Lambda] 一時的に画像ファイルを保持する

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から画像をダウンロードしてローカルファイルに保存するための処理を行っています。以下にコードの各部分を詳しく説明します。

  1. response = requests.get(url): requests モジュールを使用して、指定された url からHTTP GETリクエストを送信し、response 変数にサーバーからのレスポンスを格納します。このレスポンスには、HTTPステータスコード、ヘッダー、コンテンツなどが含まれます。
  2. if response.status_code == 200:: HTTPステータスコードが200の場合、リクエストが成功したことを示します。これは、正常なレスポンスを受け取った場合に画像をダウンロードする条件を表しています。
  3. image_file = f"/tmp/image_{i}.jpg": ダウンロードされる画像ファイルのローカルパスを生成します。
  4. with open(image_file, "wb") as f:: バイナリモードでファイルを開く with ステートメントを使用して、画像ファイルをローカルに書き込むためのファイルハンドル f を作成します。
  5. f.write(response.content): HTTPレスポンスのコンテンツ(画像データ)をローカルファイルに書き込みます。
  6. image_files.append(image_file): ダウンロードが成功した場合、image_files リストにダウンロードした画像ファイルのパスを追加します。
  7. else ブロック: HTTPステータスコードが200以外の場合、エラーメッセージを出力します。通常、HTTPステータスコードが200以外の場合、リクエストは失敗しています。
  8. except requests.exceptions.RequestException as e:: requests モジュールのリクエストに関連する例外が発生した場合、エラーメッセージを出力します。
  9. except OSError as e:: ファイル操作に関連する例外が発生した場合、特定のエラーメッセージを出力します。例えば、ファイルが読み取り専用である場合、Read-only file system というメッセージが表示されます。

このコードは、HTTPリクエストを送信して画像をダウンロードし、ローカルファイルに保存する一連の手順を実行します。成功した場合は、image_files リストに画像ファイルのパスが追加されます。エラーが発生した場合、エラーメッセージが表示され、None が返されるかもしれません。