AWS Lambda の耐久性のある実行のデータを暗号化する
AWS Lambda の耐久性のある関数を使用すると、チェックポイントを使用して完了した作業を再生することで、最大 1 年間実行する耐障害性のある複数ステップのアプリケーションを構築できます。
Lambda は、耐久性のある実行の保管中のデータを常に暗号化します。さらに、ローテーション制御、監査の可視性、またはコンプライアンスの目的で関数で独自の AWS KMS カスタマーマネージドキーを設定できます。カスタマーマネージドキーでは、ユーザーが認可したプリンシパルのみが実行データを読み取ることができます。
暗号化の仕組み
Lambda の耐久性のある実行は、それが開始したのと同じ KMS キーが存続期間にわたって使用されます。関数のキーを変更または削除した場合、変更後に開始される実行のみに影響します。キーが使用できない場合の耐久性のある実行の動作については、「カスタマーマネージドキーが使用できない場合」を参照してください。
カスタマーマネージドキーには、標準の AWS KMS 料金が発生します。料金の詳細については、「AWS Key Management Service の料金
暗号化されるもの
耐久性のある関数でカスタマーマネージドキーを設定すると、Lambda はそのキーを使用して、次の耐久性のある実行の保管中のデータを暗号化します。
各
Invokeリクエストで渡す入力ペイロード。CheckpointDurableExecutionAPI によって保持されるチェックポイントデータ (ステップ結果、ステップエラー、連鎖呼び出し入力など)。実行結果とエラー。
SendDurableExecutionCallbackSuccessとSendDurableExecutionCallbackFailureをから送信したコールバック結果とエラー。
関数レベルと耐久性のある実行のキーは相互に関係ありません。
環境変数、.zip デプロイパッケージ、SnapStart スナップショットを暗号化する関数レベルの KMSKeyArnは、耐久性のある実行データを暗号化する DurableConfig の KMSKeyArn とは別のものです。一方を設定しても、もう一方が設定されるわけではありません。両方に同じ KMS キーを使用することも、異なる KMS キーを使用することもできます。
カスタマーマネージドキーの暗号化をセットアップする
耐久性のある関数のカスタマーマネージドキー暗号化の設定は、3 ステップのプロセスです。以下の手順を順に実行します。
カスタマーマネージドキーを作成する
耐久性のある関数は、関数と同じ AWS リージョンで対称暗号化 KMS キーをサポートします。クロスリージョンキーはサポートされていません。カスタマーマネージド型の対称キーを作成するには、「AWS Key Management Service デベロッパーガイド」の対称暗号化 KMS キーを作成する手順に従います。
アクセス許可
AWS KMS アクセス許可は、KMS キーのキーポリシーを介して付与します。
カスタマーマネージドキーを設定するには、関数を作成または更新するプリンシパルに対する AWS KMS アクセス許可が必要です。耐久性のある関数を呼び出す場合、呼び出し元に対する AWS KMS アクセス許可は必要ありません。Lambda はサービスプリンシパルで暗号化を実行します。
キーポリシー
キーポリシーは、カスタマーマネージドキーへのアクセスを制御します。すべてのカスタマーマネージドキーには、厳密に 1 つのキーポリシーが必要です。キーポリシーでは、Resource: "*" はポリシーがアタッチされている KMS キーのみを参照します。アカウントのすべての KMS キーは参照しません。
耐久性のある関数のキーポリシーは、サービスおよび関数 ARN の範囲に応じて、必要な AWS KMS アクションのみを各プリンシパルに付与します。以下のセクションでは、ステートメント、条件、および完全な例について説明します。
必要なポリシーステートメント
ポリシーは、次の機能を付与します。
IAM ユーザーのアクセス許可を有効にする キーを管理するための無条件アクセスをアカウントルートに付与します。範囲を設定するとキーのローテーション、更新、削除ができなくなるため、このステートメントは条件を使用しません。
このキーを耐久性のある関数に使用することを Lambda に許可します。Lambda サービスプリンシパル
kms:GenerateDataKeyとkms:Decryptを付与します。耐久性のある実行のデータを復号することを関数実行ロールに許可します。状態を読み取って実行を進める実行ロール
kms:Decryptを付与します。このキーを記述することを関数作成者に許可します。キーが対称であること、および
CreateFunctionまたはUpdateFunctionConfiguration中にキーが対象であることを Lambda が検証できるようにkms:DescribeKeyを付与します。このキーを特定の関数に対して検証することを関数作成者に許可します。
CreateFunctionまたはUpdateFunctionConfiguration中に Lambda が関数の暗号化コンテキストで主要なアクセス許可とアクセスを検証できるようにkms:GenerateDataKeyとkms:Decryptを付与します。これにより、関数が作成または更新される前に、この特定の関数の呼び出しをキーポリシーが受け入れることが保証されます。耐久性のある実行のオペレーションを許可します。
IncludeExecutionData=true、GetDurableExecutionState、StopDurableExecution、およびコールバック API でのGetDurableExecution、GetDurableExecutionHistoryへの呼び出しをオペレーターkms:Decryptに付与します。
ベストプラクティスとして、実行ロール、関数作成者、耐久性のある実行のオペレーターに個別のプリンシパルを使用して、必要な機能だけをそれぞれの ID に付与します。
推奨される IAM ポリシー条件
ポリシーは、以下の条件を使用してアクセスの範囲を絞り込みます。
kms:ViaServiceは、キーの使用を Lambda 経由でルーティングされるリクエストに制限します。これを実行ロール、関数作成者、オペレーターステートメントに適用すると、これらのエンティティは AWS KMS からキーを直接使用できなくなります。aws:SourceArnとaws:SourceAccountは、サービス間の混乱した代理問題から保護します。AWS KMS を呼び出すとき、Lambda は独自のサービス認証情報を使用して、これらの値を転送します。この条件は、Lambda サービスプリンシパルステートメントにのみ適用されます。実行ロール、関数作成者、オペレーターステートメントは、発信元の転送アクセスセッション認証情報 (これらのヘッダーは含まれません) で AWS KMS を呼び出します。kms:EncryptionContext:aws:lambda:FunctionArnはキーを特定の関数に制限します。耐久性のある実行のデータに対するすべての AWS KMS 呼び出しにおいて、Lambda は、これを暗号化コンテキストに追加します。
次の例は、上記のステートメントと条件を組み合わせています。
例耐久性のある関数のキーポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow Lambda to use this key for durable functions", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333", "aws:SourceArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow the function execution role to decrypt durable execution data", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/myDurableFunctionRole" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow the function author to describe this key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/FunctionAuthor" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com" } } }, { "Sid": "Allow the function author to validate this key for a specific function", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/FunctionAuthor" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow durable execution operators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/DurableExecutionOperator" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } } ] }
AWS KMS キーポリシーの詳細については、「AWS Key Management Service デベロッパーガイド」の「How to change a key policy」を参照してください。
耐久性のある関数でカスタマーマネージドキーを設定する
DurableConfig オブジェクトの KMSKeyArn フィールドを使用して、耐久性のある実行のデータのカスタマーマネージドキーを設定します。これは、関数を作成するときに CreateFunction で設定し、UpdateFunctionConfiguration で既存の耐久性のある関数で更新します。
重要
それぞれの耐久性のある実行では、起動時に関数で設定されたカスタマーマネージドキーを使用します。キーの変更または削除は、変更後に開始される実行にのみ影響します。進行中の実行は、完了または失敗するまで、開始に使用したキーを引き続き使用します。
耐久性のある実行のデータを読み取る
2 つの読み取り API が耐久性のある実行のデータを返します。
GetDurableExecutionは、単一の実行の現在の状態 (入力ペイロード、最新のチェックポイントデータ、結果またはエラー情報など) を返します。GetDurableExecutionHistoryは、実行によって出力されたイベントの順序付けられたリストを返します。このリストは、チェックポイントの入力と結果、連鎖呼び出しの入力と結果、最終結果が表示されます。
どちらの API も IncludeExecutionData リクエストパラメータを受け入れます。IncludeExecutionData が true の場合、Lambda は発信元の認証情報を使用してカスタマーマネージドキーで kms:Decrypt を呼び出します。その後、Lambda は復号された実行データをレスポンスで返します。発信元の ID は、カスタマーマネージドキーに kms:Decrypt を持っている必要があります。
IncludeExecutionData が false の場合、Lambda は AWS KMS の呼び出しや実行データの復号を行わず、レスポンスが ExecutionDataIncluded を false に設定します。レスポンスには引き続き DurableConfig が含まれます。これは実行が使用したカスタマーマネージドキー ARN をエコーします。IncludeExecutionData はデフォルトで false に設定されるので、メタデータのみを必要とする発信元には AWS KMS アクセス許可は必要ありません。
例: IncludeExecutionData=false を含む GetDurableExecution レスポンス
{ "DurableExecutionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction:execution:exec-abc123", "DurableExecutionName": "exec-abc123", "FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction", "StartTimestamp": 1733256000, "Status": "RUNNING", "ExecutionDataIncluded": false, "DurableConfig": { "ExecutionTimeout": 3600, "KMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id", "RetentionPeriodInDays": 30 } }
連鎖呼び出し
耐久性のある関数が連鎖呼び出しを使用して別の耐久性のある関数を呼び出す場合、Lambda は子実行を独立した耐久性のある実行として扱います。この実行には、独自の実行 ID、独自のチェックポイントストリーム、独自のカスタマーマネージドキーがあります。親のカスタマーマネージドキー設定は子のデータには影響せず、子のカスタマーマネージドキー設定は親のデータに影響しません。
アクセス許可
Lambda サービスプリンシパルは、子関数のカスタマーマネージドキーに kms:GenerateDataKey と kms:Decrypt が必要です。親関数と子関数が別々のカスタマーマネージドキーを使用する場合は、各キーに対するサービスプリンシパルアクセスを個別に付与します。親関数の実行ロールには、子のカスタマーマネージドキーに対するアクセス許可は必要ありません。
どのキーがどの実行を暗号化したかを特定する
GetDurableExecution と ListDurableExecutionsByFunction は両方とも、各実行を暗号化したカスタマーマネージドキー ARN を返します。これらの API を使用して、親または子の実行が開始したときに有効だったキーを確認します。
データキーキャッシュ
AWS KMS のコール量を削減し、サービスの中断時の可用性を改善するために、Lambda はカスタマーマネージドキーから生成されたデータキーを最大 15 分間キャッシュします。キャッシュがウォームの間、Lambda は実行内のオペレーション間とキャッシュウィンドウ中に開始した実行間で同じデータキーを再利用します。
Cost
Lambda はチェックポイントあたり 1 回ではなく、キャッシュウィンドウあたり最大 1 回 GenerateDataKey を呼び出すため、実行あたりの AWS KMS コストが低く抑えられます。リクエストレートが高いと、キャッシュされた各データキーを共有する実行の数が増えるため、実行あたりのコストがさらに低下します。請求は、Lambda が実際に行う AWS KMS コールに対して行われます。個々のチェックポイントや読み取りに対する請求は行われません。
静的安定性
データキーは最大 15 分間キャッシュされたままになります。キーの変更は、次回のキャッシュ更新時に有効になります。サービスが長時間中断しても、Lambda はキャッシュから引き続きサービスを提供し、実行中の実行を維持します。
CloudTrail
データキーキャッシュは、CloudTrail の GenerateDataKey イベントが実行やチェックポイントよりも少ないことを意味します。イベントの例については、「耐久性のある関数の KMS キーをモニタリングする」を参照してください。
カスタマーマネージドキーが使用できない場合
実行が開始されたカスタマーマネージドキーが無効になっている場合、そのキーの削除がスケジュールされている場合、キーのアクセスがキーポリシーで取り消されている場合、実行をさらに進めることはできません。次のチェックポイントで、Lambda は再試行不可能な AWS KMS エラーで実行に失敗します。キーへのアクセスを復元しても、実行は自動的に再開されません。新しい実行を開始する必要があります。
キーが使用できない場合、ペイロードの読み取りと書き込みを行う API も失敗します。次のいずれかの例外が返されます。
KMSAccessDeniedException: KMS キーへのアクセスが拒否されたため、Lambda は耐久性のある実行のデータを復号できませんでした。KMSDisabledException: KMS キーが無効化されているため、Lambda は耐久性のある実行のデータを復号できませんでした。KMSInvalidStateException: KMS キーの状態がDecryptに対して無効なため、Lambda は耐久性のある実行のデータを復号できませんでした。KMSNotFoundException: KMS キーが見つからなかったため、Lambda は耐久性のある実行のデータを復号できませんでした。
KMS キーへのアクセスを復元すると、これらの読み取り API は既に失敗した実行に対して成功します。失敗した実行は失敗したままです。新しい実行を開始する必要があります。
KMS キーが使用できないときに実行メタデータを検査するには、IncludeExecutionData=false で GetDurableExecution を呼び出します。これにより、AWS KMS を呼び出すことなく、実行のステータス、タイムスタンプ、DurableConfig (KMS キー ARN を含む) が返されます。
Lambda はデータキーをキャッシュするため、キーを無効にしても、その影響が直ちに生じることはありません。詳細については、「データキーキャッシュ」を参照してください。
重要
実行中または保持中の実行が依存する KMS キーを削除すると、それらの実行とその履歴は完全に破棄されます。
耐久性のある関数の KMS キーをモニタリングする
耐久性のある関数でカスタマーマネージドキーを使用する場合、AWS CloudTrail を使用して、Lambda がユーザーに代わって行う AWS KMS コールを追跡できます。AWS KMS イベントの検索に関する一般的なガイダンスについては、「Searching AWS KMS API activity」を参照してください。
意図した通りに Lambda がキーを使用していることを確認するには、各イベントで以下のフィールドを探します。
eventName:GenerateDataKey、Decrypt、またはDescribeKeyeventSource:kms.amazonaws.com.rproxy.govskope.causerIdentity.invokedBy:lambda.amazonaws.com.rproxy.govskope.carequestParameters.encryptionContext.aws:lambda:FunctionArn: 耐久性のある関数の ARN
次の例は、耐久性のある関数でカスタマーマネージドキーを設定する CreateFunction または UpdateFunctionConfiguration コールからの CloudTrail イベントです。Lambda は、キーを検証するために 3 つのAWS KMS コール (実際の DescribeKey、ドライラン GenerateDataKey、Decrypt) を発行します。