本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
加密 AWS Lambda 持久的執行資料
透過AWS Lambda 耐用的 函數,您可以建置彈性的多步驟應用程式,執行時間長達一年,使用檢查點重新執行已完成的工作,從失敗中復原每個執行。
Lambda 一律加密持久的靜態執行資料。您還可以在 函數上設定自己的 AWS KMS 客戶受管金鑰,以進行輪換控制、稽核可見性或合規性。使用客戶受管金鑰,只有您授權的委託人才能讀取執行資料。
加密的運作方式
Lambda 持久性執行使用與從 開始的整個生命週期相同的 KMS 金鑰。在函數上變更或移除金鑰只會影響變更後開始的執行。請參閱 當客戶受管金鑰無法使用時,了解持久性執行在金鑰無法使用時的行為。
客戶受管金鑰會產生標準 AWS KMS 費用。如需定價詳細資訊,請參閱 AWS Key Management Service 定價
加密的內容
當您在持久性函數上設定客戶受管金鑰時,Lambda 會使用該金鑰來加密下列持久性靜態執行資料:
您隨每個
Invoke請求傳遞的輸入承載。CheckpointDurableExecutionAPI 保留的檢查點資料,包括步驟結果、步驟錯誤和鏈結調用輸入。執行結果和錯誤。
您透過 和 提交的回呼結果
SendDurableExecutionCallbackSuccess和錯誤SendDurableExecutionCallbackFailure。
函數層級和耐用的執行金鑰是獨立的
設定客戶受管金鑰加密
為耐用函數設定客戶受管金鑰加密是一個三步驟的程序。依序完成下列步驟。
建立客戶自管金鑰
耐用函數支援與函數位於相同區域中 AWS 的對稱加密 KMS 金鑰。不支援跨區域金鑰。若要建立對稱客戶受管金鑰,請遵循《 AWS Key Management Service 開發人員指南》中的建立對稱加密 KMS 金鑰的步驟。
許可
您可以透過 KMS 金鑰的金鑰政策授予 AWS KMS 許可。
設定客戶受管金鑰需要建立或更新函數之主體的 AWS KMS 許可。叫用耐用的函數不需要呼叫者的 AWS KMS 許可;Lambda 會對其服務主體執行加密。
金鑰政策
金鑰政策會控制客戶受管金鑰的存取權限。每個客戶受管金鑰必須只有一個金鑰政策。在金鑰政策中, 僅Resource: "*"參考政策連接的 KMS 金鑰,而不是您帳戶中的所有 KMS 金鑰。
耐用函數的金鑰政策只會授予每個委託人所需的 AWS KMS 動作,範圍依服務和函數 ARN 而定。下列各節說明陳述式、條件和完整範例。
必要的政策陳述式
此政策會授予下列功能:
啟用 IAM 使用者許可。授予帳戶根無條件存取以管理金鑰。此陳述式不使用任何條件,因為它會阻止您輪換、更新或刪除金鑰。
允許 Lambda 使用此金鑰進行耐用的函數。授予 Lambda 服務主體
kms:GenerateDataKey和kms:Decrypt。允許函數執行角色解密持久的執行資料。授予執行角色
kms:Decrypt讀取狀態和進行執行。允許函數作者描述此金鑰。授予
kms:DescribeKeyLambda 以驗證金鑰是否對稱,並在CreateFunction或 期間啟用UpdateFunctionConfiguration。允許函數作者驗證特定函數的此金鑰。授予
kms:GenerateDataKey和kms:Decrypt,因此 Lambda 可以在CreateFunction或 期間,使用函數的加密內容來驗證金鑰許可和存取權UpdateFunctionConfiguration。這會確認金鑰政策在建立或更新函數之前接受此特定函數的呼叫。允許耐用的執行運算子。
GetDurableExecutionHistory使用GetDurableExecution、IncludeExecutionData=true、GetDurableExecutionState和 回kms:Decrypt呼 APIsStopDurableExecution,授予運算子對 的呼叫。
最佳實務是,針對執行角色、函數作者和耐用的執行運算子使用不同的主體,讓每個身分都只有其所需的功能。
建議政策條件
此政策使用下列條件來縮小存取範圍:
kms:ViaService將金鑰使用限制為透過 Lambda 路由的請求。將此套用到執行角色、函數作者和運算子陳述式,可防止他們直接透過 使用金鑰 AWS KMS。aws:SourceArn和aws:SourceAccount可防範跨服務混淆代理人問題。Lambda AWS KMS 會在使用自己的服務登入資料呼叫 時轉送這些值。此條件僅適用於 Lambda 服務主體陳述式。執行角色、函數作者和運算子陳述式 AWS KMS 會使用發起人的轉送存取工作階段登入資料呼叫 ,這些登入資料不會包含這些標頭。kms:EncryptionContext:aws:lambda:FunctionArn會將金鑰範圍限定為特定 函數。Lambda 會將此新增至每次 AWS KMS 呼叫的加密內容,以取得持久的執行資料。
下列範例結合了上述陳述式和條件。
範例耐用函數的金鑰政策
{ "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 開發人員指南》中的如何變更金鑰政策。
在耐用的函數上設定客戶受管金鑰
您可以透過 DurableConfig 物件KMSKeyArn的 欄位,設定客戶受管金鑰以取得持久的執行資料。當您使用 CreateFunction 建立函數時加以設定;使用 UpdateFunctionConfiguration 更新現有耐用函數上的函數。
重要
每個持久性執行都會使用啟動時在函數上設定的客戶受管金鑰。變更或移除金鑰只會影響變更後開始的執行;傳輸中執行會繼續使用其啟動的金鑰,直到完成或失敗為止。
讀取耐久的執行資料
兩個讀取 APIs會傳回持久的執行資料:
GetDurableExecution會傳回單一執行的目前狀態,包括其輸入承載、最新的檢查點資料,以及結果或錯誤資訊。GetDurableExecutionHistory傳回執行發出的事件排序清單,顯示檢查點輸入和結果、鏈結調用輸入和結果,以及最終結果。
兩個 APIs都接受 IncludeExecutionData請求參數。當 IncludeExecutionData為 時true,Lambda 會使用發起人的登入資料來kms:Decrypt呼叫客戶受管金鑰。Lambda 接著會在回應中傳回解密的執行資料。發起人的身分必須在客戶受管金鑰kms:Decrypt上具有 。
當 IncludeExecutionData為 時false,Lambda 不會呼叫 AWS KMS 或解密執行資料,且回應會ExecutionDataIncluded設為 false。回應仍然包含 DurableConfig,這與執行所使用的客戶受管金鑰 ARN 相呼應。 IncludeExecutionData預設為 false,因此只需要中繼資料的呼叫者不需要 AWS KMS 許可。
範例:使用 GetDurableExecution回應 IncludeExecutionData=false
{ "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:Decrypt上具有 kms:GenerateDataKey和 。如果父系和子系函數使用不同的客戶受管金鑰,您可以分別授予每個金鑰的服務主體存取權。父函數的執行角色不需要子系客戶受管金鑰的許可。
識別哪個金鑰加密了哪個執行
GetDurableExecution 和 都會ListDurableExecutionsByFunction傳回加密每個執行的客戶受管金鑰 ARN。使用這些 APIs來確認哪個金鑰在父系或子系執行開始時生效。
資料金鑰快取
為了減少 AWS KMS 通話量並改善服務中斷期間的可用性,Lambda 會快取從客戶受管金鑰產生的資料金鑰最多 15 分鐘。雖然快取是暖的,Lambda 會在 執行內的操作和快取時段期間啟動的執行之間重複使用相同的資料金鑰。
成本
每個執行 AWS KMS 成本保持低,因為 Lambda 每個快取時段GenerateDataKey最多呼叫一次,而不是每個檢查點呼叫一次。在高請求率下,每次執行的成本會進一步下降,因為更多執行會共用每個快取的資料金鑰。您需要支付 Lambda 實際進行的 AWS KMS 呼叫費用,而不是每個檢查點或讀取。
靜態穩定性
資料金鑰會保持快取長達 15 分鐘。金鑰的變更會在下次快取重新整理時生效。在延長服務中斷期間,Lambda 會繼續從快取提供服務,保持執行中的執行。
CloudTrail
資料金鑰快取表示您在 CloudTrail 中看到GenerateDataKey的事件少於您擁有的執行或檢查點。如需範例事件監控 KMS 金鑰的耐用函數,請參閱 。
當客戶受管金鑰無法使用時
如果停用從 開始執行的客戶受管金鑰、排定刪除,或透過金鑰政策撤銷其存取權,則執行無法進一步進行。在下一個檢查點,Lambda 會以無法重試的 AWS KMS 錯誤使執行失敗。還原對金鑰的存取不會自動繼續執行。您必須啟動新的執行。
當金鑰無法使用時,讀取或寫入承載的 APIs 也會失敗。他們可以傳回下列其中一個例外狀況:
KMSAccessDeniedException:Lambda 無法解密持久的執行資料,因為對 KMS 金鑰的存取遭拒。KMSDisabledException:由於 KMS 金鑰已停用,Lambda 無法解密持久的執行資料。KMSInvalidStateException:Lambda 無法解密持久的執行資料,因為 KMS 金鑰的狀態對 無效Decrypt。KMSNotFoundException:由於找不到 KMS 金鑰,Lambda 無法解密持久的執行資料。
還原對 KMS 金鑰的存取可讓這些讀取 APIs 在已失敗的執行中再次成功。失敗的執行會保持失敗;您必須啟動新的執行。
若要在 KMS 金鑰無法使用時檢查執行中繼資料,GetDurableExecution請使用 呼叫 IncludeExecutionData=false。這會傳回執行的狀態、時間戳記和 DurableConfig(包括 KMS 金鑰 ARN),而無需呼叫 AWS KMS。
由於 Lambda 快取資料金鑰,停用金鑰不會立即生效。如需詳細資訊,請參閱資料金鑰快取。
重要
刪除傳輸中或保留執行的 KMS 金鑰仍然依賴於永久銷毀這些執行及其歷史記錄。
監控 KMS 金鑰的耐用函數
當您使用具有耐用函數的客戶受管金鑰時,您可以使用 AWS CloudTrail 來追蹤 Lambda 代表您進行的 AWS KMS 呼叫。如需搜尋 AWS KMS 事件的一般指引,請參閱搜尋 AWS KMS API 活動。
若要確認 Lambda 是否如預期般使用您的金鑰,請在每個事件中尋找這些欄位:
eventName:GenerateDataKey、Decrypt或 之一DescribeKeyeventSource:kms.amazonaws.com.rproxy.goskope.comuserIdentity.invokedBy:lambda.amazonaws.com.rproxy.goskope.comrequestParameters.encryptionContext.aws:lambda:FunctionArn:耐用函數的 ARN
下列範例是來自 CreateFunction或 UpdateFunctionConfiguration呼叫的 CloudTrail 事件,可在耐用函數上設定客戶受管金鑰。Lambda 發出三個 AWS KMS 呼叫來驗證金鑰:實際 DescribeKey、試轉 GenerateDataKey和 Decrypt。