設定 Lambda 的 Amazon MSK 事件來源 - AWS Lambda

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

設定 Lambda 的 Amazon MSK 事件來源

為 Amazon MSK 叢集建立事件來源映射之前,您需要確保您的叢集及其所在的 VPC 已正確設定。您也需要確定您的 Lambda 函數執行角色具有必要的 IAM 許可。

依照下列各節中的指示來設定 Amazon MSK 叢集、VPC 和 Lambda 函數。若要了解如何建立事件來源映射,請參閱將 Amazon MSK 新增為事件來源

MSK 叢集身分驗證

Lambda 需要許可才能存取 Amazon MSK 叢集、擷取記錄和執行其他任務。Amazon MSK 支援數個選項,用於控制用戶端對 MSK 叢集的存取。

未驗證的存取

如果沒有用戶端透過網際網路存取叢集,您可以使用未驗證存取。

SASL/SCRAM 身分驗證

Amazon MSK 支援 Simple Authentication and Security Layer/Salted Challenge Response Authentication Mechanism (SASL/SCRAM) 身分驗證與 Transport Layer Security (TLS) 加密。若要讓 Lambda 連線至叢集,您可以身分驗證憑證 (使用者名稱和密碼) 存放在 AWS Secrets Manager 秘密中。

如需使用 Secrets Manager 詳細資訊,請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的「AWS Secrets Manager 的使用者名稱和密碼身分驗證」。

Amazon MSK 不支援 SASL/PLAIN 身分驗證。

IAM 角色型身分驗證

您可以使用 IAM 來驗證連至 MSK 叢集之用戶端的身分。若您 MSK 叢集上的 IAM 身分驗證為作用中,且您未提供身分驗證密碼,則 Lambda 會自動預設使用 IAM 身分驗證。若要建立和部署使用者或角色型政策,請使用 IAM 主控台或 API。如需詳細資訊,請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的「IAM 存取控制」。

若要允許 Lambda 連線至 MSK 叢集、讀取記錄,以及執行其他必要動作,請將下列許可新增至函數的執行角色

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kafka-cluster:Connect", "kafka-cluster:DescribeGroup", "kafka-cluster:AlterGroup", "kafka-cluster:DescribeTopic", "kafka-cluster:ReadData", "kafka-cluster:DescribeClusterDynamicConfiguration" ], "Resource": [ "arn:aws:kafka:region:account-id:cluster/cluster-name/cluster-uuid", "arn:aws:kafka:region:account-id:topic/cluster-name/cluster-uuid/topic-name", "arn:aws:kafka:region:account-id:group/cluster-name/cluster-uuid/consumer-group-id" ] } ] }

您可以將這些許可的範圍設定為特定叢集、主題和群組。如需詳細資訊,請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的 Amazon MSK Kafka 動作

交互 TLS 驗證

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

若為 Amazon MSK,Lambda 會以用戶端的身分運作。您可以設定用戶端憑證 (做為 Secrets Manager 中的機密) 來驗證 Lambda 與 MSK 叢集中的代理程式。用戶端憑證必須由伺服器信任存放區中的憑證授權機構簽署。MSK 叢集會傳送伺服器憑證到 Lambda 來驗證代理程式與 Lambda。伺服器憑證必須由 AWS 信任存放區中的憑證授權機構 (CA) 簽署。

如需如何產生用戶端憑證的說明,請參閱將 Amazon MSK 的相互 TLS 身分驗證作為事件來源

Amazon MSK 不支援自行簽署的伺服器憑證,因為 Amazon MSK 中的所有代理程式都使用由 Amazon Trust Services CAs (根據預設,Lambda 信任此機構) 簽署的公有憑證

如需有關適用於 Amazon MSK 的 mTLS 之詳細資訊,請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的「相互 TLS 身分驗證」。

設定 mTLS 機密

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-----

下列範例顯示的是使用了已加密私有金鑰之 mTLS 身分驗證的機密內容。若為加密的私有金鑰,您可以在機密中包含私有金鑰密碼。

{ "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-----" }

Lambda 選擇引導代理程式的方法

Lambda 會依據叢集上可用的身分驗證方法,以及您是否提供了身分驗證密碼,以此選擇引導代理程式。若您提供了 MTL 或 SASL/SCRAM 的密碼,則 Lambda 會自動選擇該身分驗證方法。若您未提供密碼,Lambda 會選取叢集上作用中的安全強度最高的身分驗證方法。以下是 Lambda 選擇代理程式的優先順序,身分驗證安全強度依次遞減:

  • mTLS (已提供 mTLS 密碼)

  • SASL/SCRAM (已提供 SASL /SCROM 密碼)

  • SASL IAM (未提供任何密碼,且 IAM 身分驗證在作用中)

  • 未驗證的 TLS (未提供任何密碼,且 IAM 身分驗證未在作用中)

  • 純文字 (未提供任何密碼,且 IAM 身分驗證和未經身分驗證的 TLS 皆未在作用中)

注意

若 Lambda 無法連線至最安全的代理程式類型,Lambda 便不會嘗試連線至其他 (安全強度較弱) 的代理程式類型。若您要讓 Lambda 選擇安全強度較弱較弱的代理程式類型,請停用叢集上所有安全強度較弱更高的身分驗證方法。

管理 API 存取和許可

除了存取 Amazon MSK 叢集之外,您的函數還需要執行各種 Amazon MSK API 動作的許可。您可以將這些許可新增到函數的執行角色。如果您的使用者需要存取任何 Amazon MSK API 動作,請將必要的許可新增至使用者或角色的身分政策。

您可以將下列各個許可手動新增到執行角色。或者,您可以將 AWS 受管政策 AWSLambdaMSKExecutionRole 連接到您的執行角色。AWSLambdaMSKExecutionRole 政策包含下列所有必要的 API 動作和 VPC 許可。

必要的 Lambda 函數執行角色許可

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

Lambda 函數的執行角色必須具有下列許可,Lambda 才能代您存取 Amazon MSK 叢集。

您只需要新增 kafka:DescribeClusterkafka:DescribeClusterV2 即可。針對佈建的 MSK 叢集來說,任一許可皆有效。針對無伺服器 MSK 叢集,您必須使用 kafka:DescribeClusterV2

注意

Lambda 最終計劃從相關聯的 AWSLambdaMSKExecutionRole 受管政策中移除 kafka:DescribeCluster 許可。若有使用此政策,您應遷移任何使用 kafka:DescribeCluster 的應用程式,並改用 kafka:DescribeClusterV2

VPC 許可

如果只有某個 VPC 內的使用者可以存取 Amazon MSK 叢集,則您的 Lambda 函數必須具有存取 Amazon VPC 資源的許可。這些資源包括您的 VPC、子網路、安全群組和網路界面。若要連線至這些資源,函數的執行角色必須具有下列許可:這些許可會包含在 AWS 受管政策 AWSLambdaVPCAccessExecutionRole 中。

選用 Lambda 函數許可

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

  • 若是使用 SASL/SCRAM 身分驗證,請存取您的 SCRAM 機密。

  • 描述您 Secrets Manager 機密。

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

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

Secrets Manager 和 AWS KMS 許可

視您為 Amazon MSK 代理程式設定的存取控制類型而定,您的 Lambda 函數可能需要存取您 SCRAM 機密 (若是使用 SASL/SCRAM 身分驗證) 或 Secrets Manager 機密的許可,才能夠解密您的 AWS KMS 客戶受管金鑰。若要連線至這些資源,函數的執行角色必須具有下列許可:

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

請遵循下列步驟,使用 IAM 主控台將 AWS 受管政策 AWSLambdaMSKExecutionRole 新增至您的執行角色。

新增 AWS 受管政策
  1. 開啟 IAM 主控台中的 Policies (政策) 頁面

  2. 在搜尋方塊中,輸入政策名稱 (AWSLambdaMSKExecutionRole)。

  3. 從清單中選取政策,然後選擇 政策動作附加

  4. 連接政策 頁面,從清單中選取您的執行角色,然後選擇 連接政策

使用 IAM 政策授予使用者存取權

根據預設,使用者和角色沒有執行 Amazon MSK API 操作的許可。若要將存取權授予給組織或帳戶中的使用者,您可以新增或更新身分型政策。如需詳細資訊,請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的 Amazon MSK 以身分為基礎的政策範例

身分驗證和授權錯誤

如果遺失了從 Amazon MSK 叢集取用資料的任何必要許可,Lambda 會在 LastProcessingResult 下的事件來源映射中顯示下列其中一種錯誤訊息。

叢集無法授權 Lambda

對於 SASL/SCRAM 或 mTLS,此錯誤表示提供的使用者不具備下列 Kafka 存取控制清單 (ACL) 的所有許可:

  • DescribeConfigs 叢集

  • 描述群組

  • 讀取群組

  • 描述主題

  • 讀取主題

對於 IAM 存取控制,您的函數執行角色缺少存取群組或主題所需的一個或多個許可。檢閱 IAM 角色型身分驗證 中的必要許可清單。

當您建立具有必要的 Kafka 叢集許可之 Kafka ACL 或 IAM 政策時,請將主題和群組指定為資源。主題名稱必須與事件來源映射中的主題相符。群組名稱必須與事件來源映射的 UUID 相符。

將必要的許可新增至執行角色後,可能需要數分鐘變更才會生效。

SASL 身分驗證失敗

對於 SASL/SCRAM,此錯誤表示所提供的使用者名稱和密碼是無效的。

對於 IAM 存取控制,執行角色缺少 MSK 叢集的 kafka-cluster:Connect 許可。將此許可新增至角色,並將叢集的 Amazon Resource Name (ARN) 指定為資源。

您可能會間歇性地看到此錯誤發生。TCP 連線數量超過 Amazon MSK 服務配額後,此叢集就會拒絕連線。Lambda 會關閉並重試,直到連線成功為止。Lambda 連接到叢集並輪詢記錄之後,上次處理結果會變更為 OK

伺服器無法驗證 Lambda

此錯誤表示 Amazon MSK Kafka 代理程式無法使用 Lambda 來驗證。此狀況的發生原因如下:

  • 您並未提供 mTLS 身分驗證的用戶端憑證。

  • 您已提供用戶端憑證,但代理程式並未設定為使用 mTLS。

  • 用戶端憑證不受代理程式信任。

提供的憑證或私有金鑰無效

此錯誤表示 Amazon MSK 取用者無法使用提供的憑證或私有金鑰。請確定憑證和金鑰使用 PEM 格式,且私有金鑰加密使用 PBES1 演算法。

設定網路安全

若要透過事件來源映射授予 Lambda 對 Amazon MSK 的完整存取權,您的叢集必須使用公有端點 (公有 IP 位址),或者您必須提供建立叢集之 Amazon VPC 的存取權。

當您將 Amazon MSK 與 Lambda 搭配使用時,請建立 AWS PrivateLink VPC 端點,為您的函數提供 Amazon VPC 中資源的存取權。

注意

具有事件來源映射的函數需要使用 AWS PrivateLink VPC 端點,該映射使用事件輪詢器的預設 (隨需) 模式。如果您的事件來源映射使用佈建模式,則不需要設定 AWS PrivateLink VPC 端點。

建立端點以提供對下列資源的存取權:

  • Lambda:為 Lambda 服務主體建立端點。

  • AWS STS:為 AWS STS 建立端點,以便服務主體代表您擔任角色。

  • Secrets Manager:如果您的叢集使用 Secrets Manager 來儲存憑證,請為 Secrets Manager 建立端點。

或者,在 Amazon VPC 中的每個公有子網路上設定一個 NAT 閘道。如需詳細資訊,請參閱啟用 VPC 連線的 Lambda 函數的網際網路存取

當您為 Amazon MSK 建立事件來源映射時,Lambda 會檢查是否已存在彈性網絡介面 (ENI),適用於為您的 Amazon VPC 設定的子網路和安全群組。如果 Lambda 找到現有的 ENI,它會嘗試重複使用它們。否則,Lambda 會建立新的 ENI 以連線至事件來源並調用您的函數。

注意

Lambda 函數一律會在 Lambda 服務所擁有的 VPC 內執行。函數的 VPC 組態不會影響事件來源映射。只有事件來源的聯網組態會決定 Lambda 如何連線至您的事件來源。

為包含叢集的 Amazon VPC 設定安全群組。根據預設,Amazon MSK 會使用下列連接埠:9092 用於純文字,9094 用於 TLS,9096 用於 SASL,9098 用於 IAM。

  • 傳入規則:允許與事件來源相關聯之安全群組的預設叢集連接埠上的所有流量。

  • 傳出規則:針對所有目的地,允許連接埠 443 上的所有流量。允許與事件來源相關聯之安全群組的預設叢集連接埠上的所有流量。

  • Amazon VPC 端點傳入規則:如果您使用的是 Amazon VPC 端點,與您的 Amazon VPC 端點相關聯的安全群組必須允許來自叢集安全群組的連接埠 443 上的傳入流量。

如果您的叢集使用身分驗證,您也可以限制 Secrets Manager 端點的端點政策。若要呼叫 Secrets Manager API,Lambda 會使用您的函數角色,而不是 Lambda 服務主體。

範例 VPC 端點政策 — Secrets Manager 端點
{ "Statement": [ { "Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws::iam::123456789012:role/my-role" ] }, "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret" } ] }

當您使用 Amazon VPC 端點時,AWS 會使用端點的彈性網絡介面 (ENI) 來路由您的 API 呼叫,以調用您的函數。Lambda 服務主體需要在使用這些 ENI 的任何角色和函數上呼叫 lambda:InvokeFunction

根據預設,Amazon VPC 端點具有開放的 IAM 政策,允許廣泛存取資源。最佳實務是限制這些政策,以使用該端點執行所需的動作。為了確保事件來源映射能夠調用 Lambda 函數,VPC 端點政策必須允許 Lambda 服務主體呼叫 sts:AssumeRolelambda:InvokeFunction。限制您的 VPC 端點政策以僅允許源自您組織內部的 API 呼叫,可阻止事件來源映射正常運作,因此在這些政策中需要 "Resource": "*"

下列範例 VPC 端點政策展示了如何授予 Lambda 服務主體對 AWS STS 和 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": "*" } ] }