web-dev-qa-db-ja.com

AWS Lambda-各実行後に/ tmpストレージを解放する

同時に(SNSで)呼び出される4つのラムダ関数があります。SNSのイベントの頻度は5分です。各関数は大量のデータと画像(〜300MB)を処理するので、/tmpフォルダーに保存します(500MBの制限)。

関数の冒頭で、クリーンアップ/tmpフォルダーにコードを書き込んで、メモリが不足していないことを確認します(AWS lambdaがパフォーマンスを向上させるために以前のコンテナーを再利用する場合があることがわかっているため)。

私はそれを手動でチェックし(メッセージを作成し、SNSで4つのラムダ関数に公開します)、うまくいきました。

しかし、それが自動的に実行されると(5分ごとに呼び出されます)、期待した結果が得られません。最初の実行は問題ありませんが、次回以降、4つのうちの1つまたは4つのラムダ関数が「メモリ不足」に関連するエラーをスローします:「デバイスにスペースがありません」、libをロードできません...

以前は、nodejs(4.3)を使用していましたが、どちらの場合も問題なく動作しました。

しかし、何らかの理由でpythonに変更する必要があります。メインフローと作成されたデータのマウントは同じですが、自動的に実行すると失敗します。

問題は前のコンテナ(再利用されたコンテナ)のキャッシュにあると思います。/tmpをクリーン後にチェックしました(ls -alh /tmp)ファイルがないが、ストレージ(df /tmp)をチェックしたとき使用率が77%であることを示します。

クリーンな/tmpフォルダーを作成するか、ソリューションを回避するための提案は非常にありがたいです。感謝!

編集:/tmpフォルダーのクリーンアップに使用するコード:

from subprocess import call
...
call('rm -rf /tmp/*', Shell=True)
24
Ngoan Tran

はい、ラムダはマネージドサービスです。ラムダが繰り返し呼び出される場合、同じ基本リソースを再利用します。これは、私たちが直面している生産上の問題であり、/ tmpを削除することで修正されました。別の注記として、AWSはFAQでこれについて言及する必要があります。

if os.path.exists(tmp_file_path):
        os.remove(tmp_file_path)
        print("Removed the file %s" % tmp_file_path)     
else:
    print("Sorry, file %s does not exist." % tmp_file_path)
5
Sid

私は lambdash を使用してこの問題を再現しようとしました。これは、「dev」アカウントでコマンドをテストするための優れた機能です。 Lambda環境で任意のUNIXコマンドを実行できます。

このコマンドを繰り返し実行したところ、問題が発生することはありませんでした。注:コマンドは実際にはデプロイされたコードに含まれていないため、このテストは潜在的な問題を完全には再現しません。

lambdash "echo Checking:;file /tmp/nullfile;rm -f /tmp/nullfile;df -h /tmp;dd if=/dev/zero bs=1024 count=88888 >> /tmp/nullfile; echo ==========;df -h /tmp"
2
Mike Behr

コンテナーはしばしば再利用されますが、同時には行われません。関数が終了したら一時ディレクトリをクリーンアップし、問題が解決するかどうかを確認します。

2
omuthu