

# Lambda 分離テクノロジー
<a name="lambda-isolation-technologies"></a>

Lambda では、ワーカーと実行環境を保護するために、さまざまなオープンソースおよび独自の分離テクノロジーが使用されています。各実行環境は、以下の項目の専用コピーで構成されます。
+ 特定の関数バージョンのコード
+ 関数バージョン用に選択された任意の [AWS Lambda レイヤー](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html)
+ 選択された関数ランタイム (Java 11、NodeJS 12、Python 3.8 など) または関数のカスタムランタイム
+ 書き込み可能なディレクトリまたは tmp ディレクトリ
+ [Amazon Linux 2](https://aws.amazon.com/amazon-linux/) を基盤とする最小限の Linux [ ユーザースペース](https://en.wikipedia.org/wiki/User_space)

実行環境は、Linux カーネルに組み込まれている、コンテナに類似した複数のテクノロジーと AWS 独自の分離テクノロジーを使用して相互に分離されます。この技術には、次のようなものがあります。
+ **[cgroups](https://en.wikipedia.org/wiki/Cgroups)** – 関数の CPU とメモリーへのアクセスを制限するために使用します。
+ **[namespaces ](https://en.wikipedia.org/wiki/Namespace)** – 各実行環境は、専用の名前空間で実行されます。これは、Linux カーネルが管理する一意のグループプロセス ID、ユーザー ID、ネットワークインターフェイスなどのリソースを用いることで実現します。
+ **[seccomp-bpf ](https://en.wikipedia.org/wiki/Seccomp)** – 実行環境内から使用できるシステムコール (syscalls) を制限します。
+ **[iptables](https://en.wikipedia.org/wiki/Iptables)******と**[ルーティングテーブル](https://en.wikipedia.org/wiki/Routing_table)** – イングレスネットワーク通信を防止し、MVM 間のネットワーク接続を分離します。
+ **[chroot ](https://wiki.archlinux.org/index.php/chroot)** – 基盤となるファイルシステムにアクセスできる範囲を指定します。
+ **Firecracker 設定** – ブロックデバイスとネットワークデバイスのスループットをレート制限するために使用します。
+ **Firecracker のセキュリティ機能** – Firecracker の現在のセキュリティ設計の詳細については、[Firecracker の最新の設計ドキュメント](https://github.com/firecracker-microvm/firecracker/blob/master/docs/design.md)を参照してください。

AWS 独自の分離技術とこれらのメカニズムを組み合わせることで、実行環境間を強力に分離できます。

## ストレージと状態
<a name="storagestate"></a>

実行環境は、異なる関数バージョンやお客様の間で再利用されることはありません。ただし、同じ関数バージョンの呼び出し間では 1 つの環境を再利用できます。つまり、呼び出し間でデータと状態が保持される場合があります。データや状態は、通常の実行環境のライフサイクル管理の一環として、破棄されるまで数時間保持される場合があります。パフォーマンス上の理由から、関数ではこの動作を利用して、呼び出し間でローカルキャッシュまたは長期間有効な保持して再利用し、共通の結果をあらかじめ演算処理しておくことで、効率を向上させることができます。実行環境内では、これらの複数の呼び出しは 1 つのプロセスによって処理されるため、呼び出しが再利用の実行環境で行われた場合、プロセス全体の状態 (Java の静的状態など) をその後の呼び出しで再利用できる可能性があります。

また、各 Lambda 実行環境には、書き込み可能なファイルシステムが `/tmp` にあります。このストレージはアクセスできず、実行環境間での共有もできません。プロセスの状態と同様、`/tmp` に書き込まれたファイルは、実行環境の存続期間中維持されます。これにより、機械学習 (ML) モデルのダウンロードなど、コストの高い転送オペレーションを複数の呼び出しで利用できます。呼び出し間でデータを維持する必要がない関数の場合、/tmp に書き込まないか、各呼び出し間に /tmp からファイルを削除する必要があります。`/tmp` ディレクトリは [Amazon EC2 インスタンスストア](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html)によって保護され、保管時には暗号化されます。

実行環境外のファイルシステムにデータを保持する場合は、Lambda の [Amazon Elastic File System](https://aws.amazon.com/efs/) (Amazon EFS) との統合を検討する必要があります。詳細については、「[AWS Lambda で Amazon EFS を使用する](https://docs.aws.amazon.com/lambda/latest/dg/services-efs.html)」を参照してください。

呼び出し間でのデータや状態の保持を望まない場合は、Lambda で[実行コンテキスト](https://docs.aws.amazon.com/lambda/latest/dg/running-lambda-code.html)や実行環境を使用してデータや状態を保存しないことをお勧めします。呼び出し間でのデータや状態の漏洩を積極的に防止するには、Lambda では状態ごとに異なる関数を作成することをお勧めします。呼び出し間で変更される可能性があるため、Lambda では、セキュリティに関する状態を使用したり、実行環境に保存したりすることはお勧めしません。代わりに、呼び出しのたびに状態を再計算することをお勧めします。