Lambda 分離テクノロジー
Lambda では、ワーカーと実行環境を保護するために、さまざまなオープンソースおよび独自の分離テクノロジーが使用されています。各実行環境は、以下の項目の専用コピーで構成されます。
-
特定の関数バージョンのコード
-
関数バージョン用に選択された任意の AWS Lambda レイヤー
-
選択された関数ランタイム (Java 11、NodeJS 12、Python 3.8 など) または関数のカスタムランタイム
-
書き込み可能なディレクトリまたは tmp ディレクトリ
-
Amazon Linux 2
を基盤とする最小限の Linux ユーザースペース
実行環境は、Linux カーネルに組み込まれている、コンテナに類似した複数のテクノロジーと AWS 独自の分離テクノロジーを使用して相互に分離されます。この技術には、次のようなものがあります。
-
cgroups
– 関数の CPU とメモリーへのアクセスを制限するために使用します。 -
namespaces
– 各実行環境は、専用の名前空間で実行されます。これは、Linux カーネルが管理する一意のグループプロセス ID、ユーザー ID、ネットワークインターフェイスなどのリソースを用いることで実現します。 -
seccomp-bpf
– 実行環境内から使用できるシステムコール (syscalls) を制限します。 -
iptables
とルーティングテーブル – イングレスネットワーク通信を防止し、MVM 間のネットワーク接続を分離します。 -
chroot
– 基盤となるファイルシステムにアクセスできる範囲を指定します。 -
Firecracker 設定 – ブロックデバイスとネットワークデバイスのスループットをレート制限するために使用します。
-
Firecracker のセキュリティ機能 – Firecracker の現在のセキュリティ設計の詳細については、Firecracker の最新の設計ドキュメント
を参照してください。
AWS 独自の分離技術とこれらのメカニズムを組み合わせることで、実行環境間を強力に分離できます。
ストレージと状態
実行環境は、異なる関数バージョンやお客様の間で再利用されることはありません。ただし、同じ関数バージョンの呼び出し間では 1 つの環境を再利用できます。つまり、呼び出し間でデータと状態が保持される場合があります。データや状態は、通常の実行環境のライフサイクル管理の一環として、破棄されるまで数時間保持される場合があります。パフォーマンス上の理由から、関数ではこの動作を利用して、呼び出し間でローカルキャッシュまたは長期間有効な保持して再利用し、共通の結果をあらかじめ演算処理しておくことで、効率を向上させることができます。実行環境内では、これらの複数の呼び出しは 1 つのプロセスによって処理されるため、呼び出しが再利用の実行環境で行われた場合、プロセス全体の状態 (Java の静的状態など) をその後の呼び出しで再利用できる可能性があります。
また、各 Lambda 実行環境には、書き込み可能なファイルシステムが /tmp
にあります。このストレージはアクセスできず、実行環境間での共有もできません。プロセスの状態と同様、/tmp
に書き込まれたファイルは、実行環境の存続期間中維持されます。これにより、機械学習 (ML) モデルのダウンロードなど、コストの高い転送オペレーションを複数の呼び出しで利用できます。呼び出し間でデータを維持する必要がない関数の場合、/tmp に書き込まないか、各呼び出し間に /tmp からファイルを削除する必要があります。/tmp
ディレクトリは Amazon EC2 インスタンスストアによって保護され、保管時には暗号化されます。
実行環境外のファイルシステムにデータを保持する場合は、Lambda の Amazon Elastic File System
呼び出し間でのデータや状態の保持を望まない場合は、Lambda で実行コンテキストや実行環境を使用してデータや状態を保存しないことをお勧めします。呼び出し間でのデータや状態の漏洩を積極的に防止するには、Lambda では状態ごとに異なる関数を作成することをお勧めします。呼び出し間で変更される可能性があるため、Lambda では、セキュリティに関する状態を使用したり、実行環境に保存したりすることはお勧めしません。代わりに、呼び出しのたびに状態を再計算することをお勧めします。