如何疑難排解來自 Amazon MSK 和自我管理的 Apache Kafka 叢集的 Lambda 觸發條件?
我設計了 AWS Lambda 函數來處理來自 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 叢集或自我管理的 Apache Kafka 叢集的記錄。但是,事件來源映射不會調用我的 Lambda 函數。
簡短說明
若要調用 Lambda 函數,Apache Kafka 事件來源映射必須能夠執行下列動作:
- 與叢集進行通訊。
- 來自主題的投票記錄。
- 與 Lambda 調用 API 進行通訊。
- 與 AWS Security Token Service (AWS STS) API 進行通訊。
如果事件來源映射的網路、驗證或授權設定阻止先前的動作,則事件來源映射無法調用該函數。反之,您會收到錯誤。
解決方法
使用 Amazon MSK 觸發條件或自我管理的 Kafka 觸發條件設定 Lambda 函數後,Lambda 會自動建立新的事件來源映射資源。此事件來源映射相對於 Lambda 函數是獨立的資源。事件來源映射調查來自 Kafka 叢集的記錄,並將記錄組合到承載中。然後,呼叫 Lambda 調用 API 以將承載交付給要處理的 Lambda 函數。若要對失敗的投票進行疑難排解,請針對您收到的每個錯誤完成下列疑難排解步驟。
**重要:**Lambda 事件來源映射不會繼承 Lambda 函數的虛擬私有雲端 (VPC) 網路組態。這對於 Amazon MSK 和自我管理的 Kafka 觸發條件都是如此。Amazon MSK 事件來源映射會使用您在目標 MSK 叢集上設定的子網路和安全群組組態。依預設,自我管理的 Kafka 觸發條件具有廣域網路 (WAN) 存取權。但是,您也可以在相同 AWS 帳戶和 AWS 區域中設定 VPC 的網路存取。因為網路組態為獨立設定,您可以在無法透過路由存取 Kafka 叢集的網路內設定您的 Lambda 函數。
若要將 Amazon MSK 事件來源映射設定為來自跨帳戶 MSK 叢集的投票記錄,請設定多重 VPC 私人連線。請注意,您可以建立自我管理的 Kafka 觸發條件,該觸發條件從其他帳戶中的 MSK 叢集消耗。但是,這個解決方案有缺點。例如,即使目標叢集是 MSK 叢集,您也無法將 AWS Identity and Access Management (IAM) 驗證搭配自我管理的 Kafka 觸發條件使用。此外,若要透過 VPC 對等連線連線至 MSK 叢集,您必須設定 VPC 因應措施。如需架構範例,請參閱 Goldman Sachs 如何使用 AWS PrivateLink 與 Amazon MSK 叢集建立跨帳戶連線。
**注意:**若要使用多重 VPC 連線,請確認您是否符合需求。
疑難排解觸發條件與叢集之間的網路通訊問題
事件來源映射會傳送多個不同的請求給叢集代理程式端點,以完成 Lambda 函數的單一調用。在調用之前,事件來源映射會要求叢集代理程式端點提供叢集中繼資料資訊和主題中的記錄。成功調用後,事件來源映射會與代理程式端點進行通訊,以提交已處理的記錄。當事件來源映射將請求傳送到代理程式端點並且沒有收到回應時,請求逾時。如果您收到下列錯誤訊息:
「問題: 連線錯誤。請檢查您的事件來源連線組態。如果您的事件來源位於 VPC 內,請嘗試設定具有相同的 VPC、子網路和安全群組設定的新 Lambda 函數或 EC2 執行個體。將新裝置連線至 Kafka 叢集並取用訊息,以確保問題不與 VPC 或端點組態相關。如果新裝置能夠取用消息,請聯繫 Lambda 客戶支援以進行深入調查。」
代理程式要求在請求到達代理程式端點之前或之後發生逾時。當網路和安全群組設定封鎖事件來源映射到代理程式端點的要求時,會發生代理程式前逾時。當代理程式收到事件來源映射的請求,但無法完成請求時,會發生代理程式後逾時請求。
若要調查代理程式後逾時請求,請檢查失敗時的代理程式狀態。如果發生問題時叢集處於離線狀態,則在叢集重新上線且可用時重新啟用事件來源映射。當叢集磁碟空間不足或 CPU 使用率達到 100%,或當代理程式端點失敗時,也會發生逾時要求。若要解決這些問題,請將事件來源映射的批次大小設定為 1,然後重新啟動觸發程式。請注意,當您將批次大小設定為較高的值時,您會經歷更長的叢集回應時間。
若要疑難排解逾時錯誤,請檢查代理程式的存取記錄和系統記錄以取得更多資訊。
如果要求在該要求到達代理程式端點之前逾時,請檢查您的網路組態。
檢查 Amazon MSK 事件來源映射的網路組態
若要與 MSK 叢集通訊,Amazon MSK 事件來源映射會在叢集使用的每個子網路中建立 Hyperplane 彈性網路介面。事件來源映射是 Lambda 擁有的資源。但是,Amazon MSK 事件來源映射不會使用 Lambda 函數的 VPC 設定。反之,事件來源映射會自動使用在目標 MSK 叢集上設定的子網路和安全群組設定。然後,Amazon MSK 事件來源映射會在 MSK 叢集使用的每個子網路內建立網路介面。這些網路介面使用與 MSK 叢集使用的相同安全群組。
若要檢查您的安全群組是否允許所需的流量和連接埠,請完成下列步驟:
- 若要列出 MSK 叢集使用的所有安全群組和子網路,請執行 describe-cluster AWS CLI 命令。
- 若要顯示所有傳入和傳出規則,請在 describe-cluster 命令的輸出中列出的安全群組上執行 describe-security-groups 命令。
- 在列出的安全群組中設定規則,以允許安全群組和 MSK 叢集之間的流量。您也必須允許透過代理程式使用的下列開放驗證連接埠傳輸流量:
9092,用於純文字
9094,用於TLS
9096,用於 SASL
9098,用於 IAM
443 (傳出規則),用於所有組態
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,那麼請參閱疑難排解對於 AWS CLI 的錯誤。此外,請確定您使用的是最新的 AWS CLI 版本。
檢查自我管理 Kafka 事件來源映射的網路組態
依預設,自我管理的 Kafka 事件來源映射可以存取 WAN,但無法存取 VPC。您可以針對 Kafka 叢集中特定子網路和安全群組手動設定 VPC 存取權。但是,事件來源映射只能在包含 Lambda 函數的帳戶中存取叢集。您可以為位於下列其中一個位置的 Kafka 叢集建立自我管理 Kafka 事件來源映射:
- 內部部署資料中心
- 另一個雲端供應商
- Kafka 叢集 (位於不同帳戶的 VPC 之內) 的 Amazon MSK 代理程式
疑難排解初始化、輪詢或調用期間發生的問題
如果您在初始化、輪詢或調用期間遇到問題,則會收到下列錯誤:
「問題: 連線錯誤。您的事件來源 VPC 必須能夠連線到 Lambda 和 STS、Secret Manager (如果需要事件來源驗證),以及 OnFailure 目的地 (如果已設定)。您可以透過設定 PrivateLink 或 NAT 閘道來提供存取權。如需如何設定 VPC 端點/NAT 閘道,請查看 https://aws.amazon.com/blogs/compute/setting-up-aws-lambda-with-an-apache-kafka-cluster-within-a-vpc/」。
上述錯誤是由下列任一原因所造成:
- 事件來源映射是在 VPC 中設定,而對 AWS STS API 的呼叫失敗或逾時。
- 事件來源映射已設定為使用 Secrets Manager 叢集驗證,但呼叫 Secret Manager API 失敗或逾時。
- 事件來源映射可以成功存取您的 Kafka 叢集和投票記錄,但對 Lambda API 的呼叫失敗或逾時。
- 您將事件來源映射設定為具有失敗時的目的地,例如 Amazon Simple Storage Service (Amazon S3) 或 Amazon Simple Notification Service (Amazon SNS)。但是,當您的函數調用以錯誤結束時,對失敗時的目的地的 API 的調用會失敗或逾時。
當安全群組或路由資料表的組態不允許您的事件來源映射到其他服務時,就會發生前面的問題。這些服務包括 AWS STS、Lambda 或 AWS Secret Manager。若要正確設定您的 VPC 設定,請完成使用 VPC 中的 Apache Kafka 叢集設定 AWS Lambda 中的步驟。
若要解決自我管理的 Kafka 事件來源映射的這些問題,請執行下列動作:
- 在 VPC 中建立 Lambda VPC 端點和 STS VPC 端點,其中包含自我管理的 Kafka 事件來源映射使用的子網路。
- 如果您使用機密設定事件來源映射,則為 Secret Manager 建立 VPC 端點。
- 如果您將事件來源映射設定為具有失敗時的目的地,則為失敗時的目的地建立 VPC 端點。範例目的地包括 Amazon SNS 或 Amazon S3。
- 使用安全群組設定 VPC 端點,該群組允許自我管理的 Kafka 事件來源映射安全群組中的連接埠 443 上傳入流量。
- 設定自我管理的 Kafka 事件來源映射的安全群組,以允許連接埠 443 上的傳出流量到 VPC 端點的安全群組。
若要解決 Amazon MSK 事件來源對映的這些問題,請執行下列動作:
- 在包含 MSK 叢集的 VPC 中建立 Lambda VPC 端點和 STS VPC 端點。
- 如果事件來源映射使用密碼,或叢集使用 SASL IAM 驗證,則為 Secret Manager 建立 VPC 端點。此端點必須位於包含 MSK 叢集的 VPC 中。
- 如果您將事件來源映射設定為具有失敗時的目的地,則為失敗時的目的地建立 VPC 端點。範例目的地包括 Amazon SNS 或 Amazon S3。此 VPC 端點必須位於包含 MSK 叢集的 VPC 中。
- 使用安全性群組設定 VPC 端點,該群組允許從 MSK 叢集使用的安全群組連接埠 443 上傳入的流量。
**重要:**允許來自 MSK 叢集安全群組的傳入流量,而不是 Lambda 函數的安全群組。 - 設定 MSK 叢集的安全群組,以允許連接埠 443 上的傳出流量到 VPC 端點的安全群組。
疑難排解 VPC 政策或執行角色的問題
檢查執行角色是否有問題
如果您的 STS VPC 端點資源政策中存在組態問題,您會收到下列錯誤:
「問題: Lambda 無法承擔您的函數執行角色。」
若要解決此錯誤,請執行下列操作:
- 請確定 IAM 角色的信任政策將 lambda.amazonaws.com 服務主體列為受信任的服務。
- 請確定 STS VPC 端點政策允許 Lambda 服務主體呼叫 sts:AssumeRole。如需如何設定 VPC 的詳細資訊,請參閱設定網路安全性。
如果您的 Lambda VPC 端點具備設有限制的 VPC 端點政策,則會收到下列錯誤:
「沒有 VPC 端點政策允許 lambda:InvokeFunction 動作」
若要解決這些問題,請確保 Lambda VPC 端點政策允許 Lambda 服務主體呼叫 lambda:InvokeFunction。
**注意:**您可以將失敗時的目的地設定為 Amazon Simple Queue Service (Amazon SQS) 佇列、Amazon SNS 主題或 Amazon S3 儲存貯體。當您使用這些目的地時,請確定 VPC 端點原則允許 Lambda 執行角色中所需的動作。
檢查存取機密的問題
如果您在存取 Secrets Manager 機密時遇到問題,則會收到下列錯誤:
「問題: Lambda 無法叫用 secretsmanager:GetSecretValue。原因: 使用者: 未授權 Lambda 執行角色在資源:Secrets Manager 中的機密上執行:secretsmanager:GetSecretValue, 並在 VPC 端點政策中明確拒絕。」
若要解決此問題,請確保 VPC 端點資源政策允許 Lambda 執行角色針對機密呼叫 secretsmanager:GetSecretValue。若要從 Secrets Manager 獲取機密,Lambda 會使用您的執行角色,而非 Lambda 服務主體。
疑難排解您的機密問題
檢查機密的組態
如果您的機密不是事件來源映射可以使用的格式,則會收到下列錯誤:
「問題: 憑證和/或私有金鑰必須為 PEM 格式。」
若要解決此問題,請確保金鑰在 X.509 憑證檔案中採用 .pem 格式。若要確認您的憑證格式是否正確,請執行下列命令:
openssl x509 -in PEM FILE -text
**注意:**使用您的 .pem 檔案名稱取代 PEM FILE。
此外,請確定私有金鑰加密使用 PBES1 演算法,而不是 PBES2 演算法。
如需詳細資訊,請參閱提供的憑證或私密金鑰對於 Amazon MSK 無效或為自行管理的 Kafka 設定用戶端憑證機密。
**檢查您的機密值的格式 **
如果您的伺服器登入嘗試失敗,則會收到下列錯誤:
「問題: SASL 驗證失敗。」
當 Amazon MSK 主題呼叫 Lambda 函數時,該函數可以存取 Secret Manager 使用 SASL/SCRAM 保護的使用者名稱和密碼。如果 Lambda 無法識別您的使用者名稱和密碼為有效,則會遇到上述錯誤。若要解決此問題,請登入代理程式,然後檢查存取日誌。如需詳細資訊,請參閱 Amazon MSK 的SASL/SCRAM 驗證或針對自我管理 Kafka 的 SASL/SCRAM 驗證。
疑難排解事件來源映射伺服器設定的問題
確定事件來源映射可以觸達您的 DNS 伺服器
如果您的事件來源映射無法將主機名稱轉換為 IP 位址,則會收到下列錯誤:
「問題: 無法解析提供的 Kafka 代理程式端點。」
若要解決此問題,請確定事件來源映射可以觸達轉譯主機名稱的 DNS 伺服器。如果端點的主機名稱位於私人網路中,請將事件來源映射設定為使用具有可解決主機名稱的 DNS 設定的 VPC。
檢查事件來源映射伺服器設定的組態
如果伺服器與您在事件來源映射設定中設定的伺服器不同,則會收到下列錯誤:
「問題: 伺服器無法驗證 Lambda,或 Lambda 無法驗證伺服器。」
若要解決此問題,請確認設定中的伺服器主機名稱與您正在連線之伺服器的內部伺服器名稱相符。
確認事件來源映射具有輪詢叢集主題記錄的權限
如果事件來源映射無法存取輪詢記錄,則會收到下列錯誤:
「問題: 叢集無法授權 Lambda。」
若要解決此問題,請設定授權 MSK 叢集或 自我管理 Kafka 叢集 Lambda 所需的權限。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 1 年前