Lambda の実行 - AWS Lambda のセキュリティの概要

Lambda の実行

Lambda がユーザーに代わって関数を実行する際、コードの実行に必要となる基盤のシステムのプロビジョニングと設定の両方が Lambda によって管理されます。これにより、デベロッパーは基盤となるシステムの管理ではなく、ビジネスロジックやコードの記述に集中できます。

Lambda サービスはコントロールプレーンとデータプレーンに分割されています。各プレーンは、サービスで別々の役割を果たします。コントロールプレーンは、管理 API (CreateFunctionUpdateFunctionCodePublishLayerVersion など) を提供し、すべての AWS のサービスとの統合を管理します。Lambda のコントロールプレーンへの通信は、転送中に TLS により保護されます。Lambda のコントロールプレーンに保存されるすべての顧客データは、不正な開示や改ざんから保護するために設計された AWS KMS を使用して、保存時に暗号化されます。

データプレーンは、Lambda 関数の呼び出しをトリガーする Lambda の Invoke API です。Lambda 関数が呼び出されると、データプレーンは AWS Lambda ワーカー (または単に Amazon EC2 インスタンスの一種であるワーカー) 上の実行環境をその関数バージョンに割り当てるか、すでにセットアップされている既存の実行環境を選択します。この環境が呼び出しを完了するために使用されます。詳細については、このドキュメントの「AWS Lambda MicroVM とワーカー」セクションを参照してください。

Lambda 実行環境

各呼び出しは、Lambda の Invoke サービスによって、リクエストを処理できるワーカー上の実行環境にルーティングされます。お客様やその他のユーザーは、実行環境とのインバウンドネットワーク通信またはイングレスネットワーク通信をデータプレーン経由以外で直接開始することはできません。これにより、実行環境への通信が確実に認証および承認されます。

実行環境は特定の関数バージョン向けに予約されており、関数バージョン、関数、または AWS アカウント間で再利用することはできません。つまり、2 つの異なるバージョンを持つ関数には、少なくとも 2 つの一意の実行環境が生成されることになります。

各実行環境は、一度に 1 つの同時呼び出しに対してのみ使用できます。パフォーマンス上の理由から、同じ関数バージョンの複数の呼び出し間で再利用できます。さまざまな要因 (呼び出し速度、関数設定など) により、特定の関数バージョンに対して複数の実行環境が存在する場合もあります。このアプローチを採用すると、Lambda は関数のバージョンレベルを分離することができます。

Lambda は現在、関数バージョンの実行環境内での呼び出しを分離していません。つまり、ある呼び出しにより、次の呼び出し (/tmp に書き込まれたファイルやメモリ内のデータなど) に影響を与える可能性のある状態が残される場合があります。ある呼び出しにより、別の呼び出しに影響を与えることを避けるには、Lambda では追加の個別の関数を作成することをお勧めします。たとえば、エラーが発生する可能性が高い複雑な解析操作向けに個別の関数を作成したり、セキュリティに関する操作を実行しない関数を再利用したりすることができます。Lambda では現在、お客様が作成できる関数の数に制限はありません。制限の詳細については、「Lambda のクォータ」のページを参照してください。

実行環境は Lambda によって継続的にモニタリングおよび管理されていますが、次のようなさまざまな理由で作成または破棄される可能性があります。

  • 新しい呼び出しが到着しても、適切な実行環境が存在しない場合

  • 内部ランタイムまたはワーカーソフトウェアのデプロイがあった場合

  • プロビジョニングされた同時実行数の設定が新しく公開された場合

  • 実行環境またはワーカーのリース時間がライフタイムの上限に近づいているか、ライフタイムの上限を超えている場合

  • その他の内部ワークロード再分散プロセス

関数設定にプロビジョニングされた同時実行数を設定すると、関数バージョンに存在する事前プロビジョニングされた実行環境の数を管理できます。この設定を行うと、Lambda は設定された数の実行環境を作成、管理し、その存在を常に確認します。これにより、規模を問わず、サーバーレスアプリケーションスタートアップ時のパフォーマンスを確実により詳細に制御できます。

呼び出しに応じて Lambda によって作成または管理される実行環境の数を確実に制御する方法は、プロビジョニングされた同時実行数を設定する以外にはありません。

実行ロール

それぞれの Lambda 関数には実行ロールを設定する必要があります。実行ロールとは、関数に関するコントロールプレーンおよびデータプレーンのオペレーションを実行する際に Lambda サービスが引き受ける IAM ロールです。Lambda サービスはこのロールを引き受け、一時的なセキュリティ認証情報をフェッチします。この認証情報は、関数の呼び出し中に環境変数として使用できます。Lambda サービスは、パフォーマンス上の理由で、この認証情報をキャッシュし、同じ実行ロールを使用する異なる実行環境で再利用する場合があります。

最小特権の原則を確実に遵守するため、Lambda では、各関数が固有のロールを持ち、必要最小限のアクセス権限のセットで設定を行うことをお勧めします。

Lambda サービスは、VPC 関数用の Elastic Network Interface (ENI) の作成と設定、Amazon CloudWatch Application Insights へのログの送信、AWS X-Ray へのトレースの送信に関連する操作や、呼び出しに関係のないその他のオペレーションなど、特定のコントロールプレーンオペレーションを実行するための実行ロールを引き受けることもあります。これらのユースケースは、AWS CloudTrail の監査ログでいつでも確認および監査できます。

このトピックの詳細については、「AWS Lambda 実行ロール」のドキュメントページを参照してください。

Lambda MicroVM とワーカー

Lambda は、AWS Lambda ワーカーと呼ばれる Amazon EC2 インスタンスのフリートに実行環境を作成します。ワーカーとはベアメタル EC2 Nitro インスタンスであり、Lambda によって、分離された AWS アカウントで、ユーザーには見えないところで起動および管理されます。ワーカーには、Firecracker により作成された 1 つまたは複数のハードウェア仮想化マイクロ仮想マシン (MVM) があります。Firecracker は、Linux のカーネルベースの仮想マシン (KVM) を使用して MVM を作成および管理する、オープンソースの仮想マシンモニター (VMM) です。サーバーレス運用モデルを提供する、安全性の高いマルチテナントコンテナおよび機能ベースのサービスの作成と管理を目的として構築されています。Firecracker のセキュリティモデルの詳細については、Firecracker プロジェクトの Web サイトを参照してください。

責任共有モデルの一環として、ワーカーのセキュリティ設定、コントロール、パッチ適用レベルを維持する責任は Lambda が担います。Lambda チームは、Amazon Inspector に加え、その他のカスタムセキュリティ問題通知メカニズムと事前開示リスト使用して、既知の潜在的なセキュリティ問題を検出するため、ユーザーが実行環境の基盤となるセキュリティ体制を管理する必要はなくなります。

AWS Lambda ワーカーの分離モデルを説明する図表。

図 3 – AWS Lambda ワーカーの分離モデル

ワーカーの最大リース有効期間は 14 時間です。ワーカーのリース有効期間の終わりに近づくと、それ以降は呼び出しのルーティングが行われず、MVM は正常終了され、基盤となるワーカーインスタンスは終了します。Lambda は、フリートのライフサイクルアクティビティを継続的にモニタリングし、アラームを発します。

ワーカーへのすべてのデータプレーン通信は、ガロア/カウンターモードによる高度暗号化標準 (AES-GCM) を使用して暗号化されます。ワーカーは、Lambda のサービスアカウントで Lambda が管理する、ネットワーク分離された Amazon VPC でホストされているため、データプレーンオペレーション以外の手段ではワーカーを直接操作することはできません。

ワーカーが新しい実行環境を作成する必要がある場合、ワーカーにはお客様の関数アーティファクトにアクセスするための期限付きの権限が付与されます。これらのアーティファクトは、Lambda の実行環境とワーカー向けに最適化されています。ZIP 形式を使用してアップロードされた関数コードは一度最適化され、AWS が管理するキーと AES-GCM を使用して暗号化された形式で保存されます。

コンテナイメージ形式を使用して Lambda にアップロードされた関数も最適化されます。コンテナイメージは、まず元のソースからダウンロードされ、個別のチャンクに最適化された後、AES-CTR、AES-GCM、SHA-256 MAC の組み合わせを使用する認証済みコンバージェント暗号化方式を使用して暗号化されたチャンクとして保存されます。コンバージェント暗号化方式を採用することにより、Lambda は暗号化されたチャンクを安全に重複除去できます。顧客データの復号化に必要なすべてのキーは、カスタマー管理の AWS KMS カスタマーマスターキー (CMK) を使用して保護されます。Lambda サービスによる CMK の使用状況の追跡と監査は、AWS CloudTrail ログで提供されます。