為 Lambda 設定自我管理的阿帕奇卡夫卡事件來源 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

為 Lambda 設定自我管理的阿帕奇卡夫卡事件來源

在為自我管理的 Apache Kafka 叢集建立事件來源對應之前,您必須確定您的叢集及VPC其所在叢集均已正確設定。您還需要確保 Lambda 函數的執行角色具有必要的IAM權限。

請遵循以下各節中的指示來設定自我管理的 Apache 卡夫卡叢集和 Lambda 函數。若要瞭解如何建立事件來源對應,請參閱將 Kafka 叢集新增為事件來源

Kafka 叢集身分驗證

Lambda 支持多種方法來進行您自我管理 Apache Kafka 叢集的身分驗證。請確保您已設定 Kafka 叢集使用其中一種支援的身分驗證方法。如需有關 Kafka 安全性的詳細資訊,請參閱 Kafka 文件的「安全性」一節。

VPC存取

如果只有卡夫卡使用者VPC存取您的卡夫卡代理程式,您必須為 Amazon Virtual Private Cloud (Amazon) 存取設定 Kafka 事件來源。VPC

SASL/SCRAM身份驗證

Lambda 支援使用傳輸層安全性 () 加密 (SCRAM) 的簡單驗證和安全層SASL/加密挑戰回應驗證機制 (/TLS) 驗證。SASL_SSLLambda 會傳送加密的憑證,以便向叢集進行身分驗證。Lambda 不支持SASL/SCRAM帶有明文()SASL_PLAINTEXT。如需SASL/SCRAM驗證的詳細資訊,請參閱 RFC5802

Lambda 還支持SASL/PLAIN身份驗證。由於此機制使用純文字認證,因此與伺服器的連線必須使用TLS加密來確保認證受到保護。

對於SASL身份驗證,您可以將登錄憑據存儲為密碼 AWS Secrets Manager。如需有關使用 Secrets Manager 的詳細資訊,請參閱《AWS Secrets Manager 使用者指南》中的「教學課程:建立和擷取機密」。

重要

若要使用 Secrets Manager 進行驗證,密碼必須儲存在與 Lambda 函數相同的 AWS 區域中。

相互TLS認證

相互TLS(mTLS)提供客戶端和服務器之間的雙向身份驗證。用戶端會將憑證傳送至伺服器以供伺服器驗證用戶端,而伺服器會將憑證傳送至用戶端以供用戶端驗證伺服器。

在自我管理 Apache Kafka 中,Lambda 會以用戶端的身分運作。您可以設定用戶端憑證 (做為 Secrets Manager 中的機密) 來驗證 Lambda 與 Kafka 代理程式。用戶端憑證必須由伺服器信任存放區中的憑證授權機構簽署。

Kafka 叢集會傳送伺服器憑證到 Lambda 來驗證 Kafka 代理程式與 Lambda。伺服器憑證可以是公有憑證授權機構憑證或私有憑證授權機構/自行簽署的憑證。公有憑證授權機構憑證必須由 Lambda 信任存放區中的憑證授權機構 (CA) 簽署。若為私有憑證授權機構/自行簽署的憑證,您可以設定伺服器根憑證授權機構憑證 (做為 Secrets Manager 中的機密)。Lambda 使用根憑證來驗證 Kafka 代理程式。

如需 m 的詳細資訊TLS,請參閱MSK將 Amazon 的相互TLS身份驗證作為事件來源引入

設定用戶端憑證機密

CLIENT_ CERTIFICATE TLS _ AUTH 密碼需要憑證欄位和私密金鑰欄位。若為加密的私有金鑰,機密需要私有金鑰密碼。憑證和私密金鑰都必須是PEM格式。

注意

Lambda 支援 PBES1(但不支援PBES2) 私密金鑰加密演算法。

憑證欄位必須包含憑證清單,以用戶端憑證開頭,隨後則是任何中繼憑證,並以根憑證結尾。每個憑證均必須以新的一行開始,結構如下:

-----BEGIN CERTIFICATE----- <certificate contents> -----END CERTIFICATE-----

Secrets Manager 支援高達 65,536 個位元組的機密,此空間足以容納長憑證鏈。

私密金鑰必須為 PKCS#8 格式,並具有下列結構:

-----BEGIN PRIVATE KEY----- <private key contents> -----END PRIVATE KEY-----

對於已加密的私有金鑰,請使用下列結構:

-----BEGIN ENCRYPTED PRIVATE KEY----- <private key contents> -----END ENCRYPTED PRIVATE KEY-----

下列範例顯示使用加密私密金鑰進行 m TLS 驗證的密碼內容。若為加密的私有金鑰,請在機密中包含私有金鑰密碼。

{"privateKeyPassword":"testpassword", "certificate":"-----BEGIN CERTIFICATE----- MIIE5DCCAsygAwIBAgIRAPJdwaFaNRrytHBto0j5BA0wDQYJKoZIhvcNAQELBQAw ... j0Lh4/+1HfgyE2KlmII36dg4IMzNjAFEBZiCRoPimO40s1cRqtFHXoal0QQbIlxk cmUuiAii9R0= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFgjCCA2qgAwIBAgIQdjNZd6uFf9hbNC5RdfmHrzANBgkqhkiG9w0BAQsFADBb ... rQoiowbbk5wXCheYSANQIfTZ6weQTgiCHCCbuuMKNVS95FkXm0vqVD/YpXKwA/no c8PH3PSoAaRwMMgOSA2ALJvbRz8mpg== -----END CERTIFICATE-----", "privateKey":"-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFKzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUiAFcK5hT/X7Kjmgp ... QrSekqF+kWzmB6nAfSzgO9IaoAaytLvNgGTckWeUkWn/V0Ck+LdGUXzAC4RxZnoQ zp2mwJn2NYB7AZ7+imp0azDZb+8YG2aUCiyqb6PnnA== -----END ENCRYPTED PRIVATE KEY-----" }

設定伺服器根憑證授權機構憑證機密

如果您的 Kafka 代理程式使用私有 CA 簽署的憑證TLS加密,則會建立此機密。您可以使用TLS加密VPC,SASL/SCRAMPLAIN,SASL/或 m TLS 身份驗證。

伺服器根 CA 憑證密碼需要一個欄位,其格式包含 Kafka 代理人的根 CA 憑證。PEM下列範例說明機密的結構。

{"certificate":"-----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dG... -----END CERTIFICATE-----" }

網路組態

若要讓 Lambda 使用您的 Kafka 叢集做為事件來源,它需要存取VPC您叢集所在的 Amazon。我們建議您為 Lambda 部署 AWS PrivateLink VPC端點以存取您的VPC. 部署 Lambda 和 AWS Security Token Service (AWS STS) 的端點。如果代理程式使用驗證,請同時為 Secrets Manager 部署VPC端點。如果您設定了故障時的目的地,請同時為目的地服務部署VPC端點。

或者,請確定與 Kafka 叢集VPC相關聯的每個公用子網路都包含一個NAT閘道。如需詳細資訊,請參閱為VPC連線的 Lambda 函數啟用網際網路存取

如果您使用VPC端點,也必須將它們設定為啟用私人DNS名稱

當您為自我管理的 Apache Kafka 叢集建立事件來源對應時,Lambda 會檢查叢集的子網路和安全群組是否已存在彈性網路介面 (ENIs)。VPC如果 Lambda 找到現有的ENIs,它會嘗試重複使用它們。否則,Lambda 會建立新的連線ENIs至事件來源並叫用您的函數。

注意

Lambda 函數一律會在 Lambda 服務VPCs擁有的內部執行。這VPCs些由服務自動維護,客戶不可見。您也可以將您的功能連接到 Amazon VPC。在任何一種情況下,函數的VPC配置都不會影響事件源映射。只有事件來源的組態才VPC會決定 Lambda 連線至事件來源的方式。

如需AWS Lambda 有關設定網路的詳細資訊,請參閱VPC在 AWS 計算部落格中使用 Apache Kafka 叢集進行設定。

VPC安全群組規則

使用下列規則 (至少) 為VPC包含叢集的 Amazon 設定安全群組:

  • 傳入規則 - 允許為事件來源指定之安全群組的所有 Kafka 代理程式連接埠上的所有流量。Kafka 預設使用連接埠 9092。

  • 傳出規則:針對所有目的地,允許連接埠 443 上的所有流量。允許為事件來源指定之安全群組的所有 Kafka 代理程式連接埠上的所有流量。Kafka 預設使用連接埠 9092。

  • 如果您使用的是VPC端點而非NAT閘道,則與VPC端點關聯的安全群組必須允許來自事件來源安全群組的通訊埠 443 上的所有輸入流量。

使用 VPC 端點

當您使用VPC端點時,API呼叫函數的呼叫會透過這些端點使用ENIs. Lambda 服務主體需要呼叫sts:AssumeRolelambda:InvokeFunction呼叫使用這些角色和函數的任何角色和函數ENIs。

依預設,VPC端點具有開啟的IAM策略。最佳做法是將這些原則限制為只允許特定主參與者使用該端點執行所需的動作。為了確保您的事件來源對應能夠叫用 Lambda 函數,VPC端點政策必須允許 Lambda 服務原則呼叫sts:AssumeRolelambda:InvokeFunction。將VPC端點策略限制為僅允許來自組織內的API呼叫,可防止事件來源對應正常運作。

下列範例VPC端點原則示範如何授與 AWS STS 和 Lambda 端點的必要存取權限,存取 Lambda 服務主體。

範例 VPC端點策略- AWS STS 端點
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }
範例 VPC端點政策-Lambda 點
{ "Statement": [ { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }

如果您的 Kafka 代理程式使用驗證,您也可以限制 Secrets Manager VPC 端點的端點原則。若要呼叫 Secrets ManagerAPI,Lambda 會使用您的函數角色,而不是 Lambda 服務主體。下列範例顯示 Secrets Manager 端點策略。

範例 VPC端點策略-Secrets Manager 端點
{ "Statement": [ { "Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Principal": { "AWS": [ "customer_function_execution_role_arn" ] }, "Resource": "customer_secret_arn" } ] }

如果您設定了故障時的目的地,Lambda 也會使用函數的角色來呼叫或s3:PutObjectsqs:sendMessage使用 Lamb ENIs da 管理的。sns:Publish

API存取權和 Lambda 函數許可

除了存取自我管理的 Kafka 叢集之外,Lambda 函數還需要執行各種動作的許可。API您可以將這些許可新增到函數的執行角色。如果您的使用者需要存取任何API動作,請將所需的權限新增至 AWS Identity and Access Management (IAM) 使用者或角色的身分識別原則。

必要的 Lambda 函數許可

若要在 Amazon 日誌中建立日誌並將日誌存放在 CloudWatch 日誌群組中,Lambda 函數的執行角色必須具有下列許可:

選用 Lambda 函數許可

您的 Lambda 函數可能需要許可,才能:

  • 描述您 Secrets Manager 機密。

  • 存取您的 AWS Key Management Service (AWS KMS) 客戶管理金鑰。

  • 訪問您的 Amazon VPC。

  • 將失敗調用的記錄傳送到目的地。

Secrets Manager 和 AWS KMS 權限

視您為 Kafka 代 Secrets Manager 程式設定的存取控制類型而定,Lambda 函數可能需要存取您的秘密密碼或解密 AWS KMS 客戶受管金鑰的權限。若要連線至這些資源,函數的執行角色必須具有下列許可:

VPC權限

如果只有一個中的使用者VPC可以存取您自我管理的 Apache Kafka 叢集,則您的 Lambda 函數必須具有存取 Amazon 資源的權限。VPC這些資源包括您的VPC子網路、安全群組和網路介面。若要連線至這些資源,函數的執行角色必須具有下列許可:

將許可新增至您的執行角色

若要存取自我管理的 Apache Kafka 叢集使用的其他 AWS 服務,Lambda 會使用您在 Lambda 函數執行角色中定義的許可政策。

根據預設,Lambda 不允許針對自我管理 Apache Kafka 叢集執行必要或選用的動作。您必須在執行角色的IAM信任原則中建立並定義這些動作。此範例顯示如何建立允許 Lambda 存取您的 Amazon VPC 資源的政策。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeVpcs", "ec2:DeleteNetworkInterface", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups" ], "Resource":"*" } ] }

透過IAM原則授與使用者存取權

根據預設,使用者和角色沒有執行事件來源API作業的權限。若要將存取權授予組織或帳戶中的使用者,您可能需要建立或更新身分型政策。如需詳細資訊,請參閱《使用指南》中的使用策略控制 AWS 資源的存取。IAM