/dev/null

Lambdaの/tmpにファイルを置く前に

March 08, 2019

感覚値ベースですがマイクロサービスアーキテクチャを設計する上で、AWSのLambdaが選択肢として検討されることが多くなりました。テストやデプロイの煩わしさを加味しても、プロビジョニング管理のコストと天秤にかければ幾らかの釣銭が期待できるサービスであると考えています。

先日、Lambda関数を作成するにあたり、/tmpにデータをそっと置いてしまいたい衝動に駆られたため、/tmpに置いたファイルはいつどこへいくのかという観点で調査しました。

結論、/tmpに置いたファイルは一定時間が経つと削除されます。しかし、使い方やアーキテクチャによっては、これらをしっかりケアする必要があると考えています。

下記、調査した内容になります。

/tmpに設置したデータはいつ削除されるのか

After a certain time interval of a Lambda function not being invoked, its associated container is deleted and in the process all the data stored in the memory or disk associated with the container is destroyed as well.

Lambda関数が呼び出されていない一定の時間が経過すると、コンテナや関連付けられているメモリまたはディスクに格納されているすべてのデータが破棄されるとのことです。

https://forums.aws.amazon.com/thread.jspa?messageID=761089

/tmpに設置したデータの機密性は確保可能か

最低限は可能、後は使い方やアーキテクチャに依存するという結論を持っており、設計の段階で一考の余地があります。

Important to note is that the container will only be reused for your particular Lambda function, other functions from your account or different accounts will run in other isolated containers. So there is a 1-to-1 association between a Lambda function and its container.

Lambda関数は、実行時に新しく生成されたコンテナ(サンドボックス)上で動作し、そのコンテナが他の関数やリソース・メモリからは独立して実行される旨の記載があります。Lambda関数とコンテナは1対1の関連付けがあることで、他の関数ましてや他のAWSユーザーとコンテナを共有するといったことはないと考えています。

there is the possibility of reusing the same Lambda container if your function is executed at close time intervals.

また、合わせてLambda関数は一度起動したコンテナを再利用する可能性があると言う点についても触れられています。つまり、Lambda関数を短時間で複数回実行したタイミングで/tmpに作成したファイルを参照できる可能性が残っているので、これを踏まえた上での設計が必要になります。

https://forums.aws.amazon.com/thread.jspa?messageID=761089

/tmpにファイルを置きっぱなしにしても問題ないのか

下記、省略が良い感じですが/tmpにYYYYMMDDHH24MISS.txtというファイルの作成を行うコードです。これをLambdaで連続して実行した際のログにて/tmpの内容を確認します。

exports.handler = (event, context) => {
    
    var date = new Date();
	var timestamp = date.toFormat('YYYYMMDDHH24MISS');
	
    //ファイル書き込み

};
1回目
START RequestId:
2019-03-07T17:08:42.261Z	9dc33717-7063-4018-ba36-6003f5104acc	TIMESTAMP: 20190307170842
2019-03-07T17:08:42.479Z	9dc33717-7063-4018-ba36-6003f5104acc	[ '20190307170842.txt' ]
END RequestId:
2回目
START RequestId:
2019-03-07T17:09:18.499Z	b617bbad-4af4-4747-82df-b84635028637	TIMESTAMP: 20190307170918
2019-03-07T17:09:18.500Z	b617bbad-4af4-4747-82df-b84635028637	[ '20190307170842.txt', '20190307170918.txt' ]
END RequestId:

ファイルが複数作成されていることが確認できます。/tmpへは、512 MBまで書き込み可能なので、使い方によってはファイルは使用したら削除する必要があります。少なくとも/tmpのファイルが残ったまま続けてLambda関数が起動し、意図しない動作が起きないような配慮は必要かと考えます。

蛇足ですが、下記のように日付の計算をグローバルに放り出した場合の動きも確認します。

var date = new Date();
var timestamp = date.toFormat('YYYYMMDDHH24MISS');

exports.handler = (event, context) => {
    
	//ファイル書き込み

};
1回目
START RequestId:
2019-03-07T17:16:01.407Z	e405f674-9a6c-48e4-a5ad-2823adac33bf	TIMESTAMP: 20190307171601
2019-03-07T17:16:01.447Z	e405f674-9a6c-48e4-a5ad-2823adac33bf	[ '20190307171601.txt' ]
END RequestId:
2回目
START RequestId:
2019-03-07T17:17:17.306Z	a5bfbf10-1e76-41cc-a354-1af241833f21	TIMESTAMP: 20190307171601
2019-03-07T17:17:17.307Z	a5bfbf10-1e76-41cc-a354-1af241833f21	[ '20190307171601.txt' ]
END RequestId:

1回目と2回目でタイムスタンプが変わっておらず、1回目で生成したファイルが同一ファイル名で2回目で上書きされていることが推測できます。コンテナが再利用されるため、この挙動にも配慮すべきです。

参考URL

https://forums.aws.amazon.com/thread.jspa?messageID=610055

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/limits.html

https://forums.aws.amazon.com/thread.jspa?messageID=761089

https://aws.amazon.com/jp/blogs/compute/container-reuse-in-lambda/


hoge

Written by hoge who lives and works in Tokyo.