

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

# DynamoDB Streams 的變更資料擷取
<a name="Streams"></a>

 DynamoDB Streams 可擷取任何 DynamoDB 資料表中依時間順序排序的項目層級修改，並將此資訊存放於日誌中長達 24 小時。應用程式可以存取此日誌，並近乎即時地檢視資料項目修改前後的顯示內容。

 靜態加密功能會加密 DynamoDB Streams 中的資料。如需詳細資訊，請參閱 [DynamoDB 靜態加密](EncryptionAtRest.md)。

*DynamoDB 串流*是 DynamoDB 資料表中項目變更資訊的排序流程。當您在資料表啟用串流時，DynamoDB 會擷取資料表中資料項目的每項修改資訊。

應用程式每次建立、更新或刪除資料表中的項目時，DynamoDB Streams 都會使用已修改項目的主索引鍵屬性寫入串流紀錄。*串流紀錄*包含 DynamoDB 資料表中單一項目資料修改的相關資訊。您可以設定串流，讓串流紀錄擷取其他資訊，例如修改項目的「之前」與「之後」影像。

DynamoDB Streams 可協助確保下列事項：
+ 每個串流紀錄只在串流中出現一次。
+ 對於 DynamoDB 資料表中的每個修改項目，串流紀錄的出現順序與項目的實際修改順序相同。

DynamoDB Streams 會近乎即時地寫入串流紀錄，讓您可以建立使用這些串流並根據內容採取動作的應用程式。

**Topics**
+ [DynamoDB Streams 的端點](#Streams.Endpoints)
+ [啟用串流](#Streams.Enabling)
+ [讀取及處理串流](#Streams.Processing)
+ [DynamoDB Streams 和存留時間](time-to-live-ttl-streams.md)
+ [使用 DynamoDB Streams Kinesis 轉接器處理串流記錄](Streams.KCLAdapter.md)
+ [DynamoDB Streams 低階 API：Java 範例](Streams.LowLevel.Walkthrough.md)
+ [DynamoDB 串流和 AWS Lambda 觸發](Streams.Lambda.md)
+ [DynamoDB Streams 和 Apache Flink](StreamsApacheFlink.xml.md)

## DynamoDB Streams 的端點
<a name="Streams.Endpoints"></a>

AWS 會維護 DynamoDB 和 DynamoDB Streams 的個別端點。為了使用資料庫資料表與索引，應用程式必須能存取 DynamoDB 端點。為了讀取及處理 DynamoDB Streams 紀錄，應用程式必須能存取同一區域中的 DynamoDB Streams 端點。

DynamoDB Streams 提供兩組端點。這些類別為：
+ **IPv4-only 端點**：具有命名慣例的端點。 `streams.dynamodb.{{<region>}}.amazonaws.com`
+ **雙堆疊端點**：與 IPv4 和 IPv6 相容並遵循`streams-dynamodb.{{<region>}}.api.aws`命名慣例的新端點。

**注意**  
如需 DynamoDB 和 DynamoDB Streams 區域與端點的完整清單，請參閱 *AWS 一般參考* 中的[區域與端點](https://docs.aws.amazon.com/general/latest/gr/rande.html)。

 AWS SDKs 為 DynamoDB 和 DynamoDB Streams 提供單獨的用戶端。視您需求的不同，應用程式可以存取 DynamoDB 端點、DynamoDB Streams 端點，或同時存取這兩種端點。若要連線到這兩種端點，您的應用程式必須具體化兩個用戶端：一個用於 DynamoDB，另一個用於 DynamoDB Streams。

## 啟用串流
<a name="Streams.Enabling"></a>

您可以使用 AWS CLI 或其中一個 AWS SDKs 在新資料表上啟用串流。您也可以在現有的資料表上啟用或停用串流，或變更串流的設定。DynamoDB Streams 會以非同步方式運作，因此若您啟用串流，也不會影響資料表的效能。

管理 DynamoDB Streams 最簡單的方式就是使用 AWS 管理主控台。

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1. 在 DynamoDB 主控台儀表板上，選擇 **Tables** (資料表)，然後選取現有的資料表。

1. 選擇 **Exports and streams** (匯出與串流) 索引標籤。

1. 在 **DynamoDB 串流詳細資訊**區段中，選擇**開啟**。

1. 在**開啟 DynamoDB 串流**頁面中，選擇每次修改資料表資料時會寫入串流的資訊：
   + **僅限金鑰屬性**：僅已修改項目的金鑰屬性。
   + **新映像**：在修改後出現的整個項目。
   + **舊映像**：在修改前出現的整個項目。
   + **新舊映像**：項目的新舊映像。

   當您滿意設定後，請選擇**開啟串流**。

1. (選用) 若要停用現有的串流，請選擇 **DynamoDB 串流詳細資訊**下的**關閉**。

您也可以使用 `CreateTable` 或 `UpdateTable` API 操作來啟用或修改串流。`StreamSpecification` 參數可決定串流的設定方式：
+ `StreamEnabled`：指定是否啟用 (`true`) 或停用 (`false`) 資料表的串流。
+ `StreamViewType`：指定每次修改資料表資料時，將會寫入串流的資訊：
  + `KEYS_ONLY`：僅已修改項目的索引鍵屬性。
  + `NEW_IMAGE`：在修改後出現的整個項目。
  + `OLD_IMAGE`：在修改前出現的整個項目。
  + `NEW_AND_OLD_IMAGES`：項目的新舊映像。

您可以隨時啟用或停用串流。但若嘗試在已有串流的資料表中啟用串流，就會收到 `ValidationException`。若嘗試在沒有串流的資料表中停用串流，也會收到 `ValidationException`。

當您將 `StreamEnabled` 設定為 `true` 時，DynamoDB 會建立新的串流，並對其指派唯一的串流描述項。如果您停用再重新啟用資料表串流，則會使用不同的串流描述項建立新的串流。

每個串流都可依 Amazon Resource Name (ARN) 唯一識別。以下是名為 `TestTable` 的 DynamoDB 資料表上串流的 ARN 範例。

```
arn:aws:dynamodb:us-west-2:111122223333:table/TestTable/stream/2015-05-11T21:21:33.291
```

若要判斷資料表的最新串流描述項，請發出 DynamoDB `DescribeTable` 請求，並尋找回應中的 `LatestStreamArn` 元素。

**注意**  
一旦串流設定完畢，就無法再編輯 `StreamViewType`。若您需要變更已設定完畢的串流，就必須停用目前的串流並建立一個新的串流。

## 讀取及處理串流
<a name="Streams.Processing"></a>

若要讀取及處理串流，您的應用程式必須連線到 DynamoDB Streams 端點，並發出 API 請求。

串流由*串流紀錄*所組成。每個串流紀錄均代表串流所屬之 DynamoDB 資料表中的一項資料修改。每個串流紀錄會獲派一個序號，其反映出紀錄發布至串流的順序。

串流紀錄會整理成群組，即*碎片*。每個碎片皆代表多個串流紀錄的容器，並含有存取及重複處理這些紀錄所需的資訊。碎片內的串流紀錄會在 24 小時後自動移除。

碎片為暫時性：系統會視需要自動建立及刪除這些碎片。任何碎片還可分割成多個新的碎片，這也會自動發生。(父碎片也可能只有一個子碎片。) 碎片可能會為了回應其父資料表上的上層寫入活動而分割，讓應用程式可同時處理多個碎片中的紀錄。

如果您停用串流，所有開啟的碎片都會關閉。串流中的資料在 24 小時內仍可供讀取。

由於碎片具有系屬關係 (父系與子系)，因此應用程式一律必須先處理父碎片，再處理子碎片。這有利於確保串流紀錄也按照正確順序處理。(如果您使用的是 DynamoDB Streams Kinesis 轉接器，則系統會為您處理這個問題。應用程式會依正確順序處理碎片和串流紀錄。除了當應用程式正在執行時分割的碎片，其還會自動處理新的或過期碎片。如需詳細資訊，請參閱 [使用 DynamoDB Streams Kinesis 轉接器處理串流記錄](Streams.KCLAdapter.md)。)

下圖說明串流、串流中的碎片及碎片中的串流紀錄之間的關係。

![DynamoDB Streams 結構。代表資料修改的串流記錄，會以碎片的形式組織。](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/streams-terminology.png)


**注意**  
如果您執行的 `PutItem` 或 `UpdateItem` 操作不會變更項目中的任何資料，則 DynamoDB Streams *不會*寫入該操作的串流紀錄。

若要存取串流及處理其中的串流紀錄，您必須執行下列操作：
+ 判斷您要存取之串流的唯一 ARN。
+ 判斷串流中包含您感興趣之串流紀錄的碎片。
+ 存取碎片及擷取您要的串流紀錄。

**注意**  
最多不得同時從同一個串流碎片讀取 2 個以上的處理程序。每個碎片具有 2 個以上的讀取器會導致限流。

DynamoDB Streams API 提供下列可讓應用程式使用的動作：
+  `[ListStreams](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_ListStreams.html)`：傳回目前帳戶及端點的串流描述項清單。您可以只選擇性地請求特定資料表名稱的串流描述項。
+ `[DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html)` – 傳回串流相關資訊，包含目前串流狀態，其 Amazon Resource Name (ARN)、構成的碎片數量，以及其對應的 DynamoDB 資料表。您可以選擇性使用 `ShardFilter` 欄位擷取與父碎片相關的現有子碎片。
+ `[GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html)`：傳回*碎片疊代運算*，其描述了碎片內的位置。您可以請求疊代運算提供串流中最舊點、最新點或特定點的存取權。
+ `[GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)`：傳回指定碎片內的串流紀錄。您必須提供從 `GetShardIterator` 請求傳回的碎片疊代運算。

如需這些 API 操作的完整說明 (包括範例請求與回應)，請參閱《[Amazon DynamoDB Streams API 參考](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB_Streams.html)》。

### 碎片探索
<a name="Streams.ShardDiscovery"></a>



使用兩項強大的方法來探索 DynamoDB 串流中的新碎片。Amazon DynamoDB Streams 使用者可以透過兩種有效的方式追蹤並識別新的碎片：

**輪詢整個串流拓撲**  
使用 `DescribeStream` API 定期輪詢串流。此步驟會傳回串流中的所有碎片，包括任何已建立的新碎片。您可以透過比較結果，偵測新增的碎片。

**探索子碎片**  
使用 `DescribeStream` API 搭配 `ShardFilter` 參數以尋找碎片的子集。透過在請求中指定父碎片，DynamoDB Streams 會傳回其直屬子碎片。此方法適用於僅追蹤碎片譜系，而不掃描整個串流的情況。  
從 DynamoDB Streams 取用資料的應用程式，可使用 `ShardFilter` 參數，有效地從讀取封閉碎片，轉換為讀取其子碎片，避免重複呼叫 `DescribeStream` API，以擷取和周遊所有封閉及開啟碎片的碎片對應。這有助於在父碎片關閉後快速探索子碎片，提高串流處理應用程式的回應性並更符合成本效益。

這兩項方法都有助於您掌握 DynamoDB Streams 不斷變化的結構，確保您不會錯過重要的資料更新或碎片修改。

### DynamoDB Streams 的資料保留限制
<a name="Streams.DataRetention"></a>

DynamoDB Streams 中所有資料的生命週期皆為 24 小時。您可以擷取並分析任何指定資料表過去 24 小時的活動。但超過 24 小時的資料容易隨時受到裁剪 (移除) 的影響。

如果您停用資料表的串流，則串流中的資料在 24 小時內仍可供讀取。過了這段時間後，資料就會過期，且串流紀錄也會自動刪除。沒有手動刪除現有串流的機制。您必須等到保留限制過期 (24 小時)，所有串流紀錄才會被刪除。