本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
注意
如要將資料傳送到 Lambda 函數以外的目標,或在傳送資料之前讓資料更豐富,請參閱 Amazon EventBridge Pipes。
Amazon MQ 是一項受管訊息代理程式服務,適用於 Apache ActiveMQ
Amazon MQ 還可以透過安裝 ActiveMQ 或 RabbitMQ 代理程式,並提供不同的網路拓撲和其他基礎架構需求,來代表您管理 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。
您可以使用 Lambda 函數來處理您的 Amazon MQ 訊息代理程式中的記錄。Lambda 透過事件來源映射叫用函數,這是從您的代理程式讀取訊息並同步叫用函數的 Lambda 資源。
警告
Lambda 事件來源映射至少會處理每個事件一次,而且可能會重複處理記錄。為避免與重複事件相關的潛在問題,強烈建議您讓函數程式碼具有等冪性。若要進一步了解,請參閱 AWS 知識中心中的如何使 Lambda 函數成為等
Amazon MQ 事件來源映射具有下列組態限制:
-
並行:使用 Amazon MQ 事件來源映射的 Lambda 函數具有預設並行上限設定。若使用 ActiveMQ,Lambda 服務會將並行執行環境的數量上限設為每個 Amazon MQ 事件來源映射 5 個。若使用 RabbitMQ,並行執行環境的數量上限為每個 Amazon MQ 事件來源映射 1 個。即使您變更函數的保留或佈建並行設定,Lambda 服務還是無法提供更多可用的執行環境。若要請求增加單一 Amazon MQ 事件來源映射的預設並行上限, Support 請聯絡事件來源映射 UUID 以及 區域。由於增加會套用在特定事件來源映射層級,而不是帳戶或區域層級,因此您需要為每個事件來源映射手動請求擴展增加。
跨帳戶 - Lambda 不支援跨帳戶處理。您無法用 Lambda 處理來自不同 AWS 帳戶中 Amazon MQ 訊息代理程式的記錄。
-
身分驗證支援 - 對於 ActiveMQ,僅支援 ActiveMQ SimpleAuthenticationPlugin
。對於 RabbitMQ,僅支援 PLAIN 身分驗證機制。使用者必須使用 AWS Secrets Manager 來管理其登入資料。如需 ActiveMQ 身分驗證的詳細資訊,請參閱 Amazon MQ 開發人員指南中的將 ActiveMQ 代理程式與 LDAP 整合。 -
連線配額 - 代理程式每個線路層級協定允許的連線數量上限。此配額以代理程式執行個體類型為基礎。如需詳細資訊,請參閱 Amazon MQ 開發人員指南中的 Amazon MQ 中的配額的代理程式。
-
連線 - 您可以在公有或私有 Virtual Private Cloud (VPC) 中建立代理程式。若是私有 VPC,您的 Lambda 函數需要存取 VPC 才能接收訊息。如需詳細資訊,請參閱本節稍後的設定網路安全。
-
事件目的地 - 僅支援佇列目的地。然而,您可以使用虛擬主題,當作為佇列與 Lambda 互動時,其行為在內部可作為主題。如需詳細資訊,請參閱 Apache ActiveMQ 網站上的虛擬目的地
,以及 RabbitMQ 網站上的虛擬主機 。 -
網路拓撲 - 對於 ActiveMQ,每個事件來源映射僅支援單一執行個體或待命代理程式。對於 RabbitMQ,每個事件來源映射僅支援單一執行個體代理程式或叢集部署。單一執行個體代理程式需要容錯移轉端點。如需這些代理程式部署模式的詳細資訊,請參閱 Amazon MQ 開發人員指南中的 ActiveMQ 代理程式架構和 Rabbit MQ 代理程式架構。
-
協定 - 支援的協定取決於 Amazon MQ 整合的類型。
對於 ActiveMQ 整合,Lambda 會使用 OpenWire/Java Message Service (JMS) 協定來取用訊息。不支援透過其他協定來取用訊息。在 JMS 協定中,僅支援
TextMessage
和 BytesMessage
。Lambda 也支援 JMS 自訂屬性。如需有關 OpenWire 協定的詳細資訊,請參閱 Apache ActiveMQ 網站上的 OpenWire 。 對於 RabbitMQ 整合,Lambda 透過 AMQP 0-9-1 協定來取用訊息。不支援透過其他協定來取用訊息。如需 RabbitMQ 實作 AMQP 0-9-1 協定的詳細資訊,請參閱 RabbitMQ 網站上的 AMQP 0-9-1 完整參考指南
。
Lambda 會自動支援 Amazon MQ 支援的最新版 ActiveMQ 和 RabbitMQ。如需支援的最新版,請參閱 Amazon MQ 開發人員指南中的 Amazon MQ 版本備註。
注意
根據預設,Amazon MQ 具有每週代理程式維護時段。代理程式在該時段不可用。若是無待命狀態的代理程式,則 Lambda 無法在該時段處理任何訊息。
主題
了解 Amazon MQ 的 Lambda 取用者群組
若要與 Amazon MQ 互動,Lambda 會建立可以從您的 Amazon MQ 代理程式讀取的取用者群體。建立取用者群組時,會使用與事件來源映射 UUID 相同的 ID。
對於 Amazon MQ 事件來源,Lambda 會批次處理記錄,並在單個承載中將它們傳送到您的函數。要控制行為,您可以設定批次間隔和批次大小。Lambda 會提取訊息,直到它處理最大為 6 MB 的承載大小、批次間隔過期或記錄數達到完整批次大小。如需詳細資訊,請參閱批次處理行為。
取用者群組會將訊息擷取為位元組 BLOB,並透過 base64 將其編碼成單一 JSON 承載,然後調用您的函數。如果函數針對批次中的任何訊息傳回錯誤,Lambda 會重試整個批次的訊息,直至處理成功或訊息過期。
注意
雖然 Lambda 函數的逾時上限通常為 15 分鐘,但 Amazon MSK、自我管理的 Apache Kafka、Amazon DocumentDB 以及 Amazon MQ for ActiveMQ 和 Amazon MQ for RabbitMQ 的事件來源映射只支援 14 分鐘逾時限制上限的函數。此限制條件可確保事件來源映射能夠正確處理函數錯誤和重試。
您可以使用 Amazon CloudWatch 中的 ConcurrentExecutions
指標,監控指定函數的並行用量。如需並行的詳細資訊,請參閱設定函數的預留並行。
範例 Amazon MQ 記錄事件
{
"eventSource": "aws:mq",
"eventSourceArn": "arn:aws:mq:us-east-2:111122223333:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8",
"messages": [
{
"messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1---mq---us-east-2.amazonaws.com.rproxy.goskope.com-37557-1234520418293-4:1:1:1:1",
"messageType": "jms/text-message",
"deliveryMode": 1,
"replyTo": null,
"type": null,
"expiration": "60000",
"priority": 1,
"correlationId": "myJMSCoID",
"redelivered": false,
"destination": {
"physicalName": "testQueue"
},
"data":"QUJDOkFBQUE=",
"timestamp": 1598827811958,
"brokerInTime": 1598827811958,
"brokerOutTime": 1598827811959,
"properties": {
"index": "1",
"doAlarm": "false",
"myCustomProperty": "value"
}
},
{
"messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1---mq---us-east-2.amazonaws.com.rproxy.goskope.com-37557-1234520418293-4:1:1:1:1",
"messageType": "jms/bytes-message",
"deliveryMode": 1,
"replyTo": null,
"type": null,
"expiration": "60000",
"priority": 2,
"correlationId": "myJMSCoID1",
"redelivered": false,
"destination": {
"physicalName": "testQueue"
},
"data":"LQaGQ82S48k=",
"timestamp": 1598827811958,
"brokerInTime": 1598827811958,
"brokerOutTime": 1598827811959,
"properties": {
"index": "1",
"doAlarm": "false",
"myCustomProperty": "value"
}
}
]
}
注意
在 RabbitMQ 範例中,pizzaQueue
是 RabbitMQ 佇列的名稱,/
是虛擬主機的名稱。接收訊息時,事件來源會在 pizzaQueue::/
列出訊息。