

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

# Lambda 如何處理來自串流和佇列式事件來源的記錄
<a name="invocation-eventsourcemapping"></a>

*事件來源映射*是 Lambda 資源，可從串流和佇列式服務讀取項目，並使用成批的記錄來調用函數。在事件來源映射中，名為*事件輪詢器*的資源會主動輪詢新訊息並調用函數。依預設，Lambda 會自動擴展事件輪詢器，但對於某些事件來源類型，可以使用[佈建模式](#invocation-eventsourcemapping-provisioned-mode)來控制專用於事件來源映射的事件輪詢器數量下限和上限。

下列服務使用事件來源映射調用 Lambda 函數：
+ [Amazon DocumentDB (with MongoDB compatibility) (Amazon DocumentDB)](with-documentdb.md)
+ [Amazon DynamoDB](with-ddb.md)
+ [Amazon Kinesis](with-kinesis.md)
+ [Amazon MQ](with-mq.md)
+ [Amazon Managed Streaming for Apache Kafka (Amazon MSK)](with-msk.md)
+ [自我管理的 Apache Kafka](with-kafka.md)
+ [Amazon Simple Queue Service (Amazon SQS)](with-sqs.md)

**警告**  
Lambda 事件來源映射至少會處理每個事件一次，而且可能會重複處理記錄。為避免與重複事件相關的潛在問題，強烈建議您讓函數程式碼具有等冪性。若要進一步了解，請參閱 AWS 知識中心中的[如何使 Lambda 函數成為等](https://repost.aws/knowledge-center/lambda-function-idempotent)冪。

## 事件來源映射與直接觸發條件有何不同
<a name="eventsourcemapping-trigger-difference"></a>

有些 AWS 服務 可以使用*觸發*直接叫用 Lambda 函數。這些服務會將事件推送至 Lambda，並在發生指定事件時立即調用函數。觸發條件適用於離散事件和即時處理。當您[使用 Lambda 主控台建立觸發](lambda-services.md#lambda-invocation-trigger)時，主控台會與對應的 AWS 服務互動，以在該服務上設定事件通知。觸發條件實際上由產生事件的服務 (而非 Lambda) 儲存和管理。以下是一些使用觸發條件調用 Lambda 函數的服務範例：
+ **Amazon Simple Storage Service (Amazon S3)：**在儲存貯體中建立、刪除或修改物件時調用函數。如需詳細資訊，請參閱[教學課程：使用 Amazon S3 觸發條件調用 Lambda 函數](with-s3-example.md)。
+ **Amazon Simple Notification Service (Amazon SNS)：**當有訊息發布至 SNS 主題時調用函數。如需詳細資訊，請參閱[教學課程： AWS Lambda 搭配 Amazon Simple Notification Service 使用](with-sns-example.md)。
+ **Amazon API Gateway：**在對特定端點提出 API 請求時調用函數。如需詳細資訊，請參閱[使用 Amazon API Gateway 端點調用 Lambda 函數](services-apigateway.md)。

事件來源映射是在 Lambda 服務內建立和管理的 Lambda 資源。事件來源映射旨在處理來自佇列的大量串流資料或訊息。批次處理來自串流或佇列的記錄比個別處理記錄更有效率。

## 批次處理行為
<a name="invocation-eventsourcemapping-batching"></a>

根據預設，事件來源映射會將記錄批次處理到 Lambda 傳送給函數的單個承載中。若要微調批次處理行為，可以設定一個批次間隔 ([MaximumBatchingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumBatchingWindowInSeconds)) 和批次大小 ([BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-response-BatchSize))。批次間隔是將記錄收集到單一承載的最長時間。批次大小是單一批次中記錄的最大數目。當下列三個條件之一成立時，Lambda 會調用您的函數：
+ **批次間隔達到其最大值。**預設批次間隔行為會有所不同，這取決於特定的事件來源。
  + **對於 Kinesis、DynamoDB 和 Amazon SQS 事件來源：**預設批次間隔為 0 秒。這表示 Lambda 會在記錄可用時立即調用函數。若要設定批次處理間隔，請設定 `MaximumBatchingWindowInSeconds`。可以將此參數設定為從 0 秒到 300 秒之間的任意值，增量為 1 秒。如果設定批次處理間隔，則在上一個函數調用完成時開始下一個批次處理間隔。
  + **如果事件來源是 Amazon MSK、自主管理 Apache Kafka 、Amazon MQ 以及 Amazon DocumentDB：**預設批次處理時段為 500 毫秒。您可以將 `MaximumBatchingWindowInSeconds` 設定為從 0 秒到 300 秒之間的任意值，增量為秒。在 Kafka 事件來源映射的佈建模式下，如果設定了批次處理時段，則下一個時段會在上一個批次完成後立即開始。在 Kafka 事件來源映射的非佈建模式下，如果設定了批次處理時段，則下一個時段會在上一個函式調用完成後立即開始。若要最大限度降低在佈建模式下使用 Kafka 事件來源映射時的延遲，請將 `MaximumBatchingWindowInSeconds` 設定為 0。此設定可確保 Lambda 在完成目前的函式調用後立即開始處理下一個批次。如需有關低延遲處理的更多資訊，請參閱[低延遲 Apache Kafka](with-kafka-low-latency.md)。
  + **對於 Amazon MQ 和 Amazon DocumentDB 事件來源：**預設批次處理時段為 500 毫秒。您可以將 `MaximumBatchingWindowInSeconds` 設定為從 0 秒到 300 秒之間的任意值，增量為秒。一旦第一條記錄到達，批次間隔就會開始。
**注意**  
因為您只能以秒為增量變更 `MaximumBatchingWindowInSeconds`，所以在變更之後無法恢復到 500 毫秒的預設批次處理間隔。要恢復預設批次間隔，必須建立新的事件來源映射。
+ **已滿足批次大小。**批次大小下限為 1。預設和最大批次大小取決於事件來源。如需這些值的詳細資訊，請參閱 `CreateEventSourceMapping` API 操作的 [BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-BatchSize) 規格。
+ **承載大小達到 [6 MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。**您無法修改此限制。

下圖說明了這三種情況。假設批次間隔從第 `t = 7` 秒開始。在第一種情況下，批次間隔在累積 5 條記錄後在第 `t = 47` 秒達到其最大值 40 秒。在第二種情況下，批次大小在批次間隔到期之前達到 10，因此批次間隔提前結束。在第三種情況下，承載大小在批次間隔到期之前達到最大值，因此批次間隔提前結束。

![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/batching-window.png)


建議使用不同的批次與記錄大小測試，讓每個事件來源的輪詢頻率調整為函數可以多快完成作業。[CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) `BatchSize` 參數會控制每次調用時可傳送至函數的記錄數目上限。更大的批次大小通常會更有效吸收更大集合的記錄的呼叫成本，增加您的傳輸量。

Lambda 在傳送下一批進行處理前不會等待任何已設定的[擴充](lambda-extensions.md)完成。換句話說，當 Lambda 處理下一批記錄時，您的擴充功能可能會繼續執行。如果您違反任何帳戶的 [並行](lambda-concurrency.md) 設定或限制，便可能會產生限流的問題。若要偵測此是否為潛在問題，請監控您的函數，並確認您看到的 [並行指標](monitoring-concurrency.md#general-concurrency-metrics) 是否高於事件來源映射的預期值。由於兩次調用之間的時間很短，Lambda 可能會短暫報告比碎片數目更高的並行用量。即使對於沒有延伸項目的 Lambda 函數也可能如此。

根據預設，如果您的函數傳回錯誤，則事件來源映射會重新處理整個批次，直到函數成功，或批次中的項目過期為止。若要確保依序處理，事件來源映射會暫停處理受影響的碎片，直到錯誤解決為止。針對串流來源 (DynamoDB 和 Kinesis)，您可以設定函數傳回錯誤時 Lambda 重試的次數上限。導致批次未抵達函數的服務錯誤或限流不會計入重試嘗試次數。您也可以設定事件來源映射，在捨棄事件批次時將調用記錄傳送至[目的地](invocation-async-retain-records.md#invocation-async-destinations)。

## 佈建模式
<a name="invocation-eventsourcemapping-provisioned-mode"></a>

Lambda 事件來源映射使用事件輪詢器來輪詢您的事件來源，以取得新訊息。根據預設，Lambda 會根據訊息磁碟區管理這些輪詢器的自動擴展。當訊息流量增加時，Lambda 會自動增加事件輪詢器的數量以處理負載，並在流量減少時減少輪詢器。

在佈建模式中，您可以透過定義專用輪詢資源的最小和最大限制來微調事件來源映射的輸送量，這些資源仍然準備好處理預期的流量模式。這些資源的自動擴展速度快 3 倍，可處理事件流量突然峰值，並提供 16 倍的容量來處理數百萬個事件。這可協助您建置具有嚴格效能要求的高度回應事件驅動型工作負載。

在 Lambda 中，事件輪詢器是一種運算單位，具有因事件來源類型而異的輸送量功能。對於 Amazon MSK 和自我管理的 Apache Kafka，每個事件輪詢器最多可以處理 5 MB/秒的輸送量或最多 5 個並行調用。例如，如果您的事件來源產生平均承載 1 MB，且函數的平均持續時間為 1 秒，則單一 Kafka 事件輪詢器可以支援 5 MB/秒輸送量和 5 個並行 Lambda 調用 （假設沒有承載轉換）。對於 Amazon SQS，每個事件輪詢器最多可以處理每秒 1 MB 的輸送量或最多 10 個並行調用。使用佈建模式會根據您的事件輪詢器用量產生額外費用。如需定價詳細資訊，請參閱 [AWS Lambda 定價](https://aws.amazon.com/lambda/pricing/)。

佈建模式適用於 Amazon MSK、自我管理 Apache Kafka 和 Amazon SQS 事件來源。雖然並行設定可讓您控制函數的擴展，但佈建的模式可讓您控制事件來源映射的輸送量。若要確保最大效能，您可能需要獨立調整這兩個設定。

佈建模式非常適合需要一致事件處理延遲的即時應用程式，例如處理市場資料饋送的金融服務公司、提供即時個人化建議的電子商務平台，以及管理即時玩家互動的遊戲公司。

每個事件輪詢器都支援不同的輸送量容量：
+ 對於 Amazon MSK 和自我管理的 Apache Kafka：高達 5 MB/秒的輸送量或高達 5 個並行調用
+ 對於 Amazon SQS：高達 1 MB/秒的輸送量或高達 10 個並行調用或每秒高達 10 個 SQS 輪詢 API 調用。

對於 Amazon SQS 事件來源映射，您可以將輪詢器數目下限設定為 2 到 200，預設值為 2，上限為 2 到 2，000，預設值為 200。Lambda 會在設定的最小值和最大值之間擴展事件輪詢器的數量，每分鐘快速增加最多 1，000 個並行，以提供事件的一致、低延遲處理。

對於 Kafka 事件來源映射，您可以將輪詢器的最小數量設定為 1 到 200，預設值為 1，最大值為 1 到 2，000，預設值為 200。Lambda 會根據主題中的事件待處理項目，在設定的最小值和最大值之間擴展事件輪詢器的數量，以提供事件的低延遲處理。

請注意，對於 Amazon SQS 事件來源，最大並行設定不能與佈建模式搭配使用。使用佈建模式時，您可以透過最大事件輪詢器設定來控制並行。

如需設定佈建模式的詳細資訊，請參閱下列章節：
+ [設定 Amazon MSK 事件來源映射的佈建模式](kafka-scaling-modes.md)
+ [為自我管理的 Apache Kafka 事件來源映射設定佈建模式](kafka-scaling-modes.md#kafka-provisioned-mode)
+ [搭配 Amazon SQS 事件來源映射使用佈建模式](with-sqs.md#sqs-provisioned-mode)

若要將佈建模式中的延遲降至最低，請將 `MaximumBatchingWindowInSeconds`設為 0。此設定可確保 Lambda 在完成目前的函式調用後立即開始處理下一個批次。如需有關低延遲處理的更多資訊，請參閱[低延遲 Apache Kafka](with-kafka-low-latency.md)。

設定佈建模式後，可以透過監控 `ProvisionedPollers` 指標來觀察工作負載的事件輪詢器使用情況。如需詳細資訊，請參閱[事件來源映射指標](monitoring-metrics-types.md#event-source-mapping-metrics)。

## 事件來源映射 API
<a name="event-source-mapping-api"></a>

若要透過 [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 或 [AWS SDK](https://aws.amazon.com/getting-started/tools-sdks/) 來管理事件來源，可以使用下列 API 操作：
+ [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)
+ [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html)
+ [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html)
+ [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)
+ [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html)

# 在事件來源映射上使用標籤
<a name="tags-esm"></a>

可以標記事件來源映射來組織和管理資源。標籤是與跨 AWS 服務支援的資源相關聯的自由格式索引鍵值對。如需標籤使用案例的詳細資訊，請參閱*《標記 AWS 資源和標籤編輯器指南*》中的[常見標記策略](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#tag-strategies)。

事件來源映射與函數相關聯，而函數可以有自己的標籤。事件來源映射不會自動從函數繼承標籤。您可以使用 AWS Lambda API 來檢視和更新標籤。您也可以在 Lambda 主控台中管理特定事件來源映射時檢視和更新標籤，包括使用 Amazon SQS 佈建模式的對應。

## 使用標籤所需的許可
<a name="esm-tags-required-permissions"></a>

若要允許 AWS Identity and Access Management (IAM) 身分 (使用者、群組或角色) 讀取或設定資源上的標籤，請為其授予相應許可：
+ **lambda:ListTags**：當資源具有標籤時，將此許可授予給需要對其呼叫 `ListTags` 的任何人員。對於已標記函數，`GetFunction` 也需要此許可。
+ **lambda:TagResource**：將此許可授予給需要呼叫 `TagResource` 或在建立時執行標記的任何人員。

或者，也可以考慮授予 **lambda：UntagResource** 許可，以允許對資源進行 `UntagResource` 呼叫。

如需詳細資訊，請參閱[Lambda 適用的身分型 IAM 政策](access-control-identity-based.md)。

## 搭配使用標籤與 Lambda 主控台
<a name="tags-esm-console"></a>

您可以使用 Lambda 主控台建立具有標籤的事件來源映射、將標籤新增至現有事件來源映射，以及依標籤篩選事件來源映射，包括在 Amazon SQS 的佈建模式中設定的事件來源映射。

當使用 Lambda 主控台為支援的串流和佇列型服務新增觸發條件時，Lambda 會自動建立事件來源映射。如需這些事件來源的詳細資訊，請參閱[Lambda 如何處理來自串流和佇列式事件來源的記錄](invocation-eventsourcemapping.md)。若要在主控台中建立事件來源映射，需要滿足下列先決條件：
+ 一個函數。
+ 來自受影響服務的事件來源。

可以新增標籤，做為用於建立或更新觸發條件的相同使用者介面的一部分。

**若要在建立事件來源映射時新增標籤**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇 函數的名稱。

1. 在**函數概觀**下，選擇**新增觸發條件**。

1. 在**觸發條件組態**下面的下拉式清單中，選擇事件來源所來自的服務名稱。

1. 為事件來源提供核心組態。如需設定事件來源的詳細資訊，請查閱[使用來自其他服務的事件叫用 Lambda AWS](lambda-services.md)中相關服務的章節。

1. 在**事件來源映射組態**下，選擇**其他設定**。

1. 在**標籤**下，選擇**新增標籤**

1. 在**索引鍵**欄位中，輸入標籤索引鍵。如需有關標記限制的資訊，請參閱《* AWS *[標記資源和標籤編輯器指南》中的標記命名限制和要求](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices)。

1. 選擇**新增**。

**若要將標籤新增至現有的事件來源映射**

1. 在 Lambda 主控台中開啟[事件來源映射](https://console.aws.amazon.com/lambda/home#/event-source-mappings)。

1. 從資源清單中，選擇與您的**函數**和**事件來源 ARN** 對應的事件來源映射的 **UUID**。

1. 從**一般組態窗格**下的索引標籤清單中，選擇**標籤**。

1. 選擇**管理標籤**。

1. 選擇 **Add new tag** (新增標籤)。

1. 在**索引鍵**欄位中，輸入標籤索引鍵。如需有關標記限制的資訊，請參閱《* AWS *[標記資源和標籤編輯器指南》中的標記命名限制和要求](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices)。

1. 選擇**儲存**。

**若要依標籤篩選事件來源映射**

1. 在 Lambda 主控台中開啟[事件來源映射](https://console.aws.amazon.com/lambda/home#/event-source-mappings)。

1. 選取搜尋方塊。

1. 從下拉式清單中的**標籤**子標題下方，選取您的標籤索引鍵。

1. 選取**使用：「tag-name」**以查看所有標記有此索引鍵的事件來源映射，或選擇**運算子**以進一步依值篩選。

1. 選取標籤值，依標籤索引鍵和值的組合進行篩選。

搜尋方塊也支援搜尋標籤索引鍵。輸入索引鍵的名稱，以便在清單中尋找該索引鍵。

## 搭配 使用標籤 AWS CLI
<a name="tags-esm-cli"></a>

可以使用 Lambda API 在現有的 Lambda 資源 (包括事件來源映射) 上新增和移除標籤。也可以在建立事件來源映射時新增標籤，這可讓您在整個生命週期中標記資源。

### 使用 Lambda 標籤 API 來更新標籤
<a name="tags-esm-api-config"></a>

可以透過 [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html) 和 [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html) API 操作來新增和移除受支援 Lambda 資源的標籤。

可使用 AWS CLI來呼叫這些操作。若要將標籤新增至現有資源，請使用 `tag-resource` 命令。此範例會新增兩個標籤，一個包含索引鍵 *Department*，另一個包含索引鍵 *CostCenter*。

```
aws lambda tag-resource \
--resource arn:aws:lambda:us-east-2:123456789012:resource-type:my-resource \
--tags Department=Marketing,CostCenter=1234ABCD
```

若要移除標籤，請使用 `untag-resource` 命令。此範例會移除具有索引鍵 *Department* 的標籤。

```
aws lambda untag-resource --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier \
--tag-keys Department
```

### 在建立事件來源映射時新增標籤
<a name="tags-esm-on-create"></a>

若要建立具有標籤的新 Lambda 事件來源映射，請使用 [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) API 操作。指定 `Tags` 參數。您可以使用 `create-event-source-mapping` AWS CLI 命令和 `--tags`選項呼叫此操作。如需關於 CLI 命令的詳細資訊，請參閱《AWS CLI 命令參考》**中的 [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)。

將 `Tags` 參數與 `CreateEventSourceMapping` 搭配使用之前，請確保您的角色除了此操作所需的一般許可外，還擁有標記資源的許可。如需有關標記許可的詳細資訊，請參閱[使用標籤所需的許可](#esm-tags-required-permissions)。

### 使用 Lambda 標籤 API 來檢視標籤
<a name="tags-esm-api-view"></a>

若要檢視套用至特定 Lambda 資源的標籤，請使用 `ListTags` API 操作。如需詳細資訊，請參閱 [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)。

您可以使用 `list-tags` AWS CLI 命令呼叫此操作，方法是提供 ARN (Amazon Resource Name)。

```
aws lambda list-tags --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier
```

### 依標籤篩選資源
<a name="tags-esm-filtering"></a>

您可以使用 AWS Resource Groups Tagging API [GetResources](https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html) API 操作，依標籤篩選資源。`GetResources` 操作可接收最多 10 個篩選條件，每個篩選條件皆包含標籤索引鍵與最多 10 個標籤值。為 `GetResources` 提供一個 `ResourceType`，即可依特定資源類型進行篩選。

您可以使用 `get-resources` AWS CLI 命令呼叫此操作。如需使用 `get-resources` 的範例，請參閱《AWS CLI 命令參考》中的 [get-resources](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/resourcegroupstaggingapi/get-resources.html#examples)。**