Lambdaで/tmpディレクトリの利用


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

Lambdaで/tmpディレクトリの利用

初めに

AWS Lambda は、サーバーのプロビジョニングや管理の必要なしにコードを実行できるコンピューティングサービスです。

Lambdaを利用してファイル操作するケースもあるので、今回はファイルを処理するために、利用できる一時領域をご紹介します。

/tmpディレクトリ

Lambdaの公式ドキュメントに、/tmpディレクトリに対して以下の記述があります。

各実行環境は、/tmp ディレクトリ内のディスク領域を 512 MB に提供します。ディレクトリのコンテンツは、実行環境が停止された際に維持され、複数の呼び出しに使用できる一時的なキャッシュを提供します。キャッシュに保存したデータが存在するかどうかを確認するための追加コードを追加できます。デプロイのサイズ制限の詳細については、「Lambda のクォータ」を参照してください。

512MBの一時領域(/tmp)が提供されます。

利用検証

下記のコードを利用して/tmp ディレクトリ使用を検証します。

import os

# Write data to a test file
with open("/tmp/testFile", "a") as file_data:
    print("Write data to testFile", file=file_data)

# Print the contents of the test file
with open("/tmp/testFile", "r") as file_data:
    print("Print the file data:")
    for each_line in file_data:
        print(each_line)

テストLambdaを実施し、下記ようなログが出力されました。

Function Logs
START RequestId: 1ca10685-4a5e-49f1-98bc-5eec69dd70cf Version: $LATEST
Print the file data:
Write data to testFile

END RequestId: 1ca10685-4a5e-49f1-98bc-5eec69dd70cf
REPORT RequestId: 1ca10685-4a5e-49f1-98bc-5eec69dd70cf  Duration: 3.53 ms   Billed Duration: 4 ms   Memory Size: 128 MB Max Memory Used: 51 MB  Init Duration: 114.40 ms

想定外事象

/tmpディレクトリが利用でき、すごく便利ですが、テスト中に1個想定外の事象が発生しました。

連続でlambdaを実施したところ、同一ファイルに書き込んで読み込むことがわかりました。

下記のログのように、1回だけデータを書き込みましたが、複数行が出力されました。

Function Logs
START RequestId: 297e618f-100e-4635-b780-a945247d8ea2 Version: $LATEST
Print the file data:
Write data to testFile

Write data to testFile

Write data to testFile

END RequestId: 297e618f-100e-4635-b780-a945247d8ea2
REPORT RequestId: 297e618f-100e-4635-b780-a945247d8ea2  Duration: 1.39 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 51 MB

調査したところ、公式ドキュメントに以下のことが書いてあります。

関数が呼び出されると、Lambda は以前の呼び出し (使用可能な場合) から実行環境を再利用しようとします。これにより、実行環境の準備時間を節約できると同時に、実行環境で関数が実行されるたびにデータベース接続や一時ファイルなどが作成されるのを防止し、リソースを節約することができます。

リソースを節約するために、lambdaのランタイム(仮想環境)が再利用することはあります。

なので、前回作成した一時ファイルは不本意で再利用されることが可能です。

対策

上記事象を退避するために、以下の解決策を採用しましょう。

  1. ファイルを作成する時に、/tmpフォルダの直下ではなく、Timestampで命名する一時フォルダを先に作成しましょう
  2. Lambdaを終了する前に、作成したファイル(フォルダ)の削除処理を入れましょう

纏め

/tmpディレクトリが利用でき、すごく便利ですが、なんか注意しないと想定外のことが発生しますね。/tmpフォルダを利用する時に、上記纏めた対策を採用した方がよいですね。また、/tmpディレクトリは一時でであり、512MBの制限もあります。処理したファイルを長期保管、またはサイズ大きいなファイルを処理したい場合、別のファイルシステム(EFS)を利用しましょう。

EFSへの接続方は次回のブログで説明したいと思います。

Last modified: 2024-02-05

Author