

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

# 使用 Amazon Kinesis Data Streams 作為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Kinesis"></a>

您可以使用 AWS DMS 將資料遷移至 Amazon Kinesis 資料串流。Amazon Kinesis Data Streams 服務是 Amazon Kinesis Data Streams 服務的一部分。您可以使用 Kinesis 資料串流即時收集並處理大型的資料記錄串流。

Kinesis 資料串流是碎片構成。*碎片*是串流中資料記錄的唯一識別序列。如需 Amazon Kinesis Data Streams 中碎片的詳細資訊，請參閱《Amazon Kinesis Data Streams 開發人員指南》**中的[碎片](https://docs.aws.amazon.com/streams/latest/dev/key-concepts.html#shard)。

AWS Database Migration Service 使用 JSON 將記錄發佈至 Kinesis 資料串流。在轉換過程中， AWS DMS 會將來源資料庫中的每筆記錄序列化為 JSON 格式或 JSON\_UNFORMATTED 訊息格式的屬性/值對。JSON\_UNFORMATTED 訊息格式為含新行分隔符號的單行 JSON 字串。它允許 Amazon Data Firehose 將 Kinesis 資料交付至 Amazon S3 目的地，然後使用包括 Amazon Athena 在內的各種查詢引擎進行查詢。

您要使用物件映射將資料從任何受支援的資料來源遷移到目標串流。使用物件映射，您可以決定如何建構串流中的資料記錄。您也可以定義每份資料表的分割區索引鍵，Kinesis Data Stream 會用其將資料分組為碎片。

AWS DMS 也會設定數個 Kinesis Data Streams 參數值。資料表的建立成本取決於要遷移的資料量和資料表數量。

**注意**  
 AWS DMS 主控台或 API 上的 **SSL 模式**選項不適用於某些資料串流和 NoSQL 服務，例如 Kinesis 和 DynamoDB。根據預設，它們是安全的，因此 AWS DMS 顯示 SSL 模式設定等於無 (**SSL 模式=無**)。您無需為端點提供任何其他組態即可使用 SSL。例如，使用 Kinesis 作為目標端點時，預設情況下其是安全的。所有對 Kinesis 的 API 呼叫都使用 SSL，因此端點中不需要額外的 SSL 選項 AWS DMS 。您可以使用 HTTPS 通訊協定 ( AWS DMS 在連線到 Kinesis Data Stream 時預設使用的通訊協定)，透過 SSL 端點安全地放置和擷取資料。

**Kinesis Data Streams 端點設定**

當您使用 Kinesis Data Streams 目標端點時，您可以使用 AWS DMS API 中的 `KinesisSettings`選項來取得交易和控制詳細資訊。

您可透過以下任一種方式來設定連線設定：
+ 在 AWS DMS 主控台中，使用端點設定。
+ 在 CLI 中，使用 [CreateEndpoint](https://docs.aws.amazon.com/dms/latest/APIReference/API_CreateEndpoint.html) 命令的 `kinesis-settings` 選項。

在 CLI 中，使用 `kinesis-settings` 選項的以下請求參數：
**注意**  
 AWS DMS 3.4.1 版及更高版本中提供 `IncludeNullAndEmpty` 端點設定的支援。但是， 支援 Kinesis Data Streams 目標的其他下列端點設定 AWS DMS。
+ `MessageFormat` – 在端點建立之記錄的輸出格式。訊息格式為 `JSON` (預設) 或 `JSON_UNFORMATTED` (不含製表符的單行)。
+ `IncludeControlDetails`：在 Kinesis 訊息輸出中，顯示資料表定義、欄位定義以及資料表和欄位變更的詳細控制資訊。預設值為 `false`。
+ `IncludeNullAndEmpty`：包含目標中的 NULL 和空資料欄。預設值為 `false`。
+ `IncludePartitionValue`：除非磁碟分割類型為 `schema-table-type`，否則會在 Kinesis 訊息輸出中顯示磁碟分割值。預設值為 `false`。
+ `IncludeTableAlterOperations` – 包含變更控制資料中資料表的任何資料定義語言 (DDL) 操作，例如 `rename-table`、`drop-table`、`add-column`、`drop-column` 和 `rename-column`。預設值為 `false`。
+ `IncludeTransactionDetails` – 提供來源資料庫的詳細交易資訊。此資訊包括遞交時間戳記、記錄位置，以及 `transaction_id`、`previous_transaction_id`，和 `transaction_record_id ` (交易內的記錄位移) 的值。預設值為 `false`。
+ `PartitionIncludeSchemaTable` – 當磁碟分割類型為 `primary-key-type` 時，將結構描述和資料表名稱作為磁碟分割值的前綴。這樣做會增加 Kinesis 碎片之間的資料分佈。例如，假設 `SysBench` 結構描述有數千個資料表，而每個資料表的主索引鍵只有有限的範圍。在這種情況下，相同的主索引鍵會從數千個資料表發送到相同的碎片，而這將導致調節。預設值為 `false`。
+ `UseLargeIntegerValue` – 使用最多 18 位數的整數，而不是將整數轉換為雙位元，可從 3.5.4 AWS DMS 版取得。預設值為 false。

下列範例顯示使用中的 `kinesis-settings` 選項與使用 AWS CLI發出的範例 `create-endpoint` 命令。

```
aws dms \
  create-endpoint \
    --region <aws-region> \
    --endpoint-identifier <user-endpoint-identifier> \
    --endpoint-type target \
    --engine-name kinesis \
    --kinesis-settings ServiceAccessRoleArn=arn:aws:iam::<account-id>:role/<kinesis-role-name>,StreamArn=arn:aws:kinesis:<aws-region>:<account-id>:stream/<stream-name>,MessageFormat=json-unformatted,
IncludeControlDetails=true,IncludeTransactionDetails=true,IncludePartitionValue=true,PartitionIncludeSchemaTable=true,
IncludeTableAlterOperations=true
```

**多執行緒完全載入任務設定**

為了協助提高傳輸速度， AWS DMS 支援對 Kinesis Data Streams 目標執行個體進行多執行緒完全載入。DMS 使用包括下列項目的任務設定來支援此多執行緒操作：
+ `MaxFullLoadSubTasks`：使用此選項，指出要平行載入的來源資料表數目上限。DMS 會使用專用子任務，將每個資料表載入到其對應的 Kinesis 目標資料表。預設值為 8；最大值為 49。
+ `ParallelLoadThreads` – 使用此選項指定 AWS DMS 用來將每個資料表載入其 Kinesis 目標資料表的執行緒數目。Kinesis Data Streams 目標的最大值為 32。您可以要求提高此上限。
+ `ParallelLoadBufferSize`：使用此選項，指定要在平行載入執行緒用來將資料載入至 Kinesis 目標的緩衝區中儲存的記錄數量上限。預設值為 50。最大值為 1000。使用此設定搭配 `ParallelLoadThreads`；`ParallelLoadBufferSize`，只有在有多個執行緒時才有效。
+ `ParallelLoadQueuesPerThread`：使用此選項指定每個並行執行緒存取的佇列數目，以便將資料記錄從佇列中取出，並為目標產生批次載入。預設為 1。但是，對於各種承載大小的 Kinesis 目標，有效範圍為每個執行緒 5–512 個佇列。

**多執行緒 CDC 載入任務設定**

您可以使用任務設定，提升 Kinesis 等即時資料串流目標端點的變更資料擷取 (CDC) 效能，從而修改 `PutRecords` API 呼叫行為。若要執行此操作，您可以指定並行執行緒數目、每個執行緒的佇列數，以及使用 `ParallelApply*` 任務設定儲存在緩衝區中的記錄數目。例如，假設您要執行 CDC 載入並平行套用 128 個執行緒。您也想要每個執行緒存取 64 個佇列，且每個緩衝區儲存 50 筆記錄。

為了提升 CDC 效能， AWS DMS 支援下列任務設定：
+ `ParallelApplyThreads` – 指定在 CDC 載入期間 AWS DMS 用來將資料記錄推送至 Kinesis 目標端點的並行執行緒數目。預設值為零 (0)，最大值為 32。
+ `ParallelApplyBufferSize`：指定每個緩衝區佇列中儲存的最大記錄數目，以便並行執行緒在 CDC 載入期間推送至 Kinesis 目標端點。預設值為 100，最大值為 1,000。`ParallelApplyThreads` 指定多個執行緒時，請使用此選項。
+ `ParallelApplyQueuesPerThread`：指定每個執行緒存取的佇列數目，以便從佇列中取出資料記錄，並在 CDC 期間產生 Kinesis 端點的批次載入。預設值為 １，最大值為 512。

在使用 `ParallelApply*` 任務設定時，`partition-key-type` 預設是資料表的 `primary-key`，而非 `schema-name.table-name`。

## 使用前映像檢視作為目標之 Kinesis 資料串流的 CDC 列原始值
<a name="CHAP_Target.Kinesis.BeforeImage"></a>

將 CDC 更新寫入至 Kinesis 等資料串流目標時，您可以在更新進行變更前，檢視來源資料庫列的原始值。為了實現這一點， 會根據來源資料庫引擎提供的資料， AWS DMS 填入更新事件*之前的映像*。

不同的來源資料庫引擎可提供不同的前映像資訊量：
+ Oracle 僅提供欄更新 (如果有變更的話)。
+ PostgreSQL 僅提供屬於主索引鍵一部分的欄的資料 (無論是否有變更)。若要提供所有資料欄的資料 (無論是否已變更)，您需要將 `REPLICA_IDENTITY` 設為 `FULL` (而非 `DEFAULT`)。請注意，您應該仔細選擇每個資料表的 `REPLICA_IDENTITY` 設定。如果將 `REPLICA_IDENTITY` 設為 `FULL`，所有的資料欄值都會連續寫入預寫記錄 (WAL)。這可能會對經常更新的資料表造成效能或資源問題。
+ MySQL 一般會提供所有欄的資料，但 BLOB 和 CLOB 資料類型除外 (無論是否有變更)。

若要啟用前映像功能以從來源資料庫將原始值新增至 AWS DMS 輸出，請使用 `BeforeImageSettings` 任務設定或 `add-before-image-columns` 參數。此參數會套用欄轉換規則。

`BeforeImageSettings` 會使用從來源資料庫系統收集到的值，將新的 JSON 屬性新增至所有更新操作，如下所示。

```
"BeforeImageSettings": {
    "EnableBeforeImage": boolean,
    "FieldName": string,  
    "ColumnFilter": pk-only (default) / non-lob / all (but only one)
}
```

**注意**  
僅適用於包含 CDC 元件`BeforeImageSettings` AWS DMS 的任務，例如完全載入加上 CDC 任務 （遷移現有資料並複寫持續變更），或僅適用於 CDC 的任務 （僅複寫資料變更）。請勿將 `BeforeImageSettings` 套用至僅限完全載入的任務。

針對 `BeforeImageSettings` 選項，適用的設定如下：
+ 將 `EnableBeforeImage` 選項設為 `true` 以啟用前映像功能。預設值為 `false`。
+ 使用 `FieldName` 選項，將名稱指派給新的 JSON 屬性。若 `EnableBeforeImage` 為 `true`，`FieldName` 則為必填，且不能留白。
+ `ColumnFilter` 選項會使用前映像來指定要新增的欄。若只要新增屬於資料表主索引鍵一部分的欄，請使用預設值 `pk-only`。若要新增任何具有前映像值的欄，請使用 `all`。請注意，前映像不包含具有 LOB 資料類型的資料欄，例如 CLOB 或 BLOB。

  ```
  "BeforeImageSettings": {
      "EnableBeforeImage": true,
      "FieldName": "before-image",
      "ColumnFilter": "pk-only"
    }
  ```

**注意**  
Amazon S3 目標不支援 `BeforeImageSettings`。針對 S3 目標，請僅使用 `add-before-image-columns` 轉換規則，以在 CDC 期間執行前映像功能。

### 使用前映像轉換規則
<a name="CHAP_Target.Kinesis.BeforeImage.Transform-Rule"></a>

您可使用 `add-before-image-columns` 參數做為任務設定的替代方式，它會套用欄轉換規則。透過此參數，您可以在 Kinesis 等資料串流目標上，在 CDC 期間啟用前映像功能。

只要在轉換規則中使用 `add-before-image-columns`，即可套用前映像結果的更精細的控制。轉換規則可讓您使用物件定位器，以便掌控針對規則選取的資料表。此外，您可以將轉換規則鏈結在一起，讓不同的規則套用至不同的資料表。接著，您可以使用其他規則來操控產生的欄。

**注意**  
請勿在同一個任務內將 `add-before-image-columns` 參數與 `BeforeImageSettings` 任務設定一起搭配使用。請改為將參數或設定 (擇一使用，而非兩者同時使用) 用於單一任務。

具有欄的 `add-before-image-columns` 參數的 `transformation` 規則類型必須提供 `before-image-def` 區段。下列顯示一個範例。

```
    {
      "rule-type": "transformation",
      …
      "rule-target": "column",
      "rule-action": "add-before-image-columns",
      "before-image-def":{
        "column-filter": one-of  (pk-only / non-lob / all),
        "column-prefix": string,
        "column-suffix": string,
      }
    }
```

`column-prefix` 的值會附加至欄名稱前，而`column-prefix` 的預設值為 `BI_`。`column-suffix` 的值會附加至欄名稱，而預設值為空白。請勿將 `column-prefix` 和 `column-suffix` 同時設為空白字串。

為 `column-filter` 選擇一個值。若只要新增屬於資料表主索引鍵一部分的欄，請選擇 `pk-only`。選擇 `non-lob` 以僅新增不屬於 LOB 類型的欄。或者，選擇 `all` 以新增任何具有前映像值的欄。

### 前映像轉換規則範例
<a name="CHAP_Target.Kinesis.BeforeImage.Example"></a>

下列範例中的轉換規則會在目標中新增名為 `BI_emp_no` 的欄。因此，`UPDATE employees SET emp_no = 3 WHERE emp_no = 1;` 等陳述式會以 1 填入 `BI_emp_no` 欄位。當您將 CDC 更新寫入至 Amazon S3 目標時，`BI_emp_no` 資料欄會讓它能夠分辨哪個原始列已更新。

```
{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "1",
      "rule-name": "1",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "include"
    },
    {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "employees"
      },
      "rule-action": "add-before-image-columns",
      "before-image-def": {
        "column-prefix": "BI_",
        "column-suffix": "",
        "column-filter": "pk-only"
      }
    }
  ]
}
```

如需使用 `add-before-image-columns` 規則動作的相關資訊，請參閱[轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。

## 使用 Kinesis 資料串流做為 目標的先決條件 AWS Database Migration Service
<a name="CHAP_Target.Kinesis.Prerequisites"></a>

### 使用 Kinesis 資料串流做為 目標的 IAM 角色 AWS Database Migration Service
<a name="CHAP_Target.Kinesis.Prerequisites.IAM"></a>

將 Kinesis 資料串流設定為 的目標之前 AWS DMS，請務必建立 IAM 角色。此角色必須允許 AWS DMS 擔任並授予要遷移至其中的 Kinesis 資料串流存取權。以下 IAM 政策顯示最低的存取許可集。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
   {
     "Sid": "1",
     "Effect": "Allow",
     "Principal": {
        "Service": "dms.amazonaws.com"
     },
   "Action": "sts:AssumeRole"
   }
]
}
```

------

遷移到 Kinesis 資料串流所用的角色必須擁有下列許可。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kinesis:DescribeStream",
        "kinesis:PutRecord",
        "kinesis:PutRecords"
      ],
      "Resource": "*"
    }
  ]
}
```

------

### 存取 Kinesis 資料串流做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Kinesis.Prerequisites.Access"></a>

在 3.4.7 版和更新 AWS DMS 版本中，若要連線至 Kinesis 端點，您必須執行下列其中一項操作：
+ 將 DMS 設定為使用 VPC 端點。如需有關設定 DMS 以使用 VPC 端點的詳細資訊，請參閱 [設定 的 VPC 端點 AWS DMS](CHAP_VPC_Endpoints.md)。
+ 將 DMS 設定為使用公用路由，也就是將您的複寫執行個體設為公用。如需公用複寫執行個體的詳細資訊，請參閱 [公有和私有複寫執行個體](CHAP_ReplicationInstance.PublicPrivate.md)。

## 使用 Kinesis Data Streams 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.Kinesis.Limitations"></a>

使用 Kinesis Data Streams 作為目標時，有下列限制：
+ AWS DMS 會將每個更新發佈至來源資料庫中的單一記錄，做為指定 Kinesis 資料串流中的一個資料記錄，無論交易為何。不過，您可以使用 `KinesisSettings` API 的相關參數來包含每個資料記錄的交易詳細資訊。
+ 不支援完全的 LOB 模式。
+ 支援的 LOB 大小上限是 1 MB。
+ Kinesis Data Streams 不支援刪除重複資料。取用串流資料的應用程式需要處理重複的記錄。如需的詳細資訊，請參閱《Amazon Kinesis Data Streams 開發人員指南》**中的[處理重複的記錄](https://docs.aws.amazon.com/streams/latest/dev/kinesis-record-processor-duplicates.html)。
+ AWS DMS 支援下列四種形式的分割區索引鍵：
  + `SchemaName.TableName`：結構描述和資料表名稱的組合。
  + `${AttributeName}`：JSON 其中一個欄位的值，或來源資料庫資料表的主索引鍵。
  + `transaction-id`：CDC 交易 ID。相同交易中的所有記錄都會移至相同的分割區。
  + `constant`：無論資料表或資料為何，每個記錄的固定常值。所有記錄都會傳送至相同的分割區索引鍵值「常數」，在所有資料表中提供嚴格的全域排序。

  ```
  {
      "rule-type": "object-mapping",
      "rule-id": "2",
      "rule-name": "PartitionKeyTypeExample",
      "rule-action": "map-record-to-document",
      "object-locator": {
          "schema-name": "onprem",
          "table-name": "it_system"
      },
      "mapping-parameters": {
          "partition-key-type": "transaction-id | constant | attribute-name | schema-table"
      }
  }
  ```
+ 如需在 Kinesis Data Streams 中加密靜態資料的相關資訊，請參閱《AWS Key Management Service 開發人員指南》**中的 [Kinesis Data Streams 中的資料保護](https://docs.aws.amazon.com/streams/latest/dev/server-side-encryption.html.html)。
+ 只有在來源`IncludeTransactionDetails`端點為 Oracle、SQL Server、PostgreSQL 或 MySQL 時，才支援端點設定。對於其他來源端點類型，不會包含交易詳細資訊。
+ Kinesis 端點不支援 `BatchApply`。針對 Kinesis 目標使用批次套用 （例如，`BatchApplyEnabled`目標中繼資料任務設定） 會導致任務失敗和資料遺失。使用 Kinesis 做為目標端點`BatchApply`時，請勿啟用 。
+ Kinesis 目標僅支援相同 AWS 帳戶中與複寫執行個體相同的 AWS 區域 Kinesis 資料串流。
+ 從 MySQL 來源遷移時，BeforeImage 資料不包括 CLOB 和 BLOB 資料類型。如需詳細資訊，請參閱[使用前映像檢視作為目標之 Kinesis 資料串流的 CDC 列原始值](#CHAP_Target.Kinesis.BeforeImage)。
+ AWS DMS 不支援遷移超過 16 位數的`BigInt`資料類型值。若要解決此限制，您可以使用下列轉換規則將 `BigInt` 資料欄轉換為字串。如需轉換規則的詳細資訊，請參閱 [轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。

  ```
  {
      "rule-type": "transformation",
      "rule-id": "id",
      "rule-name": "name",
      "rule-target": "column",
      "object-locator": {
          "schema-name": "valid object-mapping rule action",
          "table-name": "",
          "column-name": ""
      },
      "rule-action": "change-data-type",
      "data-type": {
          "type": "string",
          "length": 20
      }
  }
  ```
+ 當單一交易中的多個 DML 操作修改來源資料庫上的大型物件 (LOB) 資料欄時，目標資料庫只會保留該交易中最後一個操作的最終 LOB 值。相同交易中先前操作所設定的中繼 LOB 值會被覆寫，這可能會導致潛在的資料遺失或不一致。由於複寫期間處理 LOB 資料的方式，因此會發生此行為。
+ AWS DMS 使用 Kinesis 做為目標端點時， 不支援包含內嵌`'\0'`字元的來源資料。包含內嵌`'\0'`字元的資料會在第一個`'\0'`字元被截斷。

## 使用物件映射將資料遷移到 Kinesis 資料串流
<a name="CHAP_Target.Kinesis.ObjectMapping"></a>

AWS DMS 使用資料表映射規則，將資料從來源映射到目標 Kinesis 資料串流。若要將資料映射到目標串流，您要使用一種稱為物件映射的資料表映射規則。您使用物件映射定義如何將來源資料記錄映射到發佈在 Kinesis 資料串流的資料記錄。

除了擁有分割區索引鍵外，Kinesis 資料串流沒有預設結構。在物件映射規則中，資料記錄 `partition-key-type` 的可能值為 `schema-table`、`transaction-id`、`primary-key`、`constant` 和 `attribute-name`。

若要建立物件映射規則，請將 `rule-type` 指定為 `object-mapping`。此規則指定您想要使用的物件映射類型。

規則的結構如下。

```
{
    "rules": [
        {
            "rule-type": "object-mapping",
            "rule-id": "{{id}}",
            "rule-name": "{{name}}",
            "rule-action": "{{valid object-mapping rule action}}",
            "object-locator": {
                "schema-name": "{{case-sensitive schema name}}",
                "table-name": ""
            }
        }
    ]
}
```

AWS DMS 目前支援 `map-record-to-record`和 `map-record-to-document`做為 `rule-action` 參數的唯一有效值。這些設定會影響 `exclude-columns` 屬性清單中未排除的值。`map-record-to-record` 和 `map-record-to-document`值預設會指定 AWS DMS 如何處理這些記錄。這些值反正不會影響屬性映射。

從關聯式資料庫遷移到 Kinesis 資料串流時，請使用 `map-record-to-record`。此規則類型使用關聯式資料庫的 `taskResourceId.schemaName.tableName` 值作為 Kinesis 資料串流的分割區索引鍵，並為來源資料庫中的每一資料行建立一個屬性。

使用 `map-record-to-record` 時，請注意下列事項：
+ 此設定只會影響 `exclude-columns` 清單中排除的欄。
+ 對於每個這類資料欄， 會在目標主題中 AWS DMS 建立對應的屬性。
+ AWS DMS 無論屬性映射中是否使用來源資料欄， 都會建立此對應的屬性。

使用 `map-record-to-document` 將來源資料欄放入使用屬性名稱「\_doc」的適當目標串流中的單一固定文件。 AWS DMS 將資料放置在名為 "`_doc`" 之來源上的單一固定對應中。此放置適用於來源資料表中未列在 `exclude-columns` 屬性清單的任何欄。

了解 `map-record-to-record` 的一種方法是查看它運作時的狀態。在本範例中，假設您開始使用之關聯式資料庫資料表資料列的結構和資料如下。


| FirstName | LastName | StoreId | HomeAddress | HomePhone | WorkAddress | WorkPhone | DateofBirth | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
| Randy | Marsh | 5 | 221B Baker Street | 1234567890 | 31 Spooner Street, Quahog  | 9876543210 | 1988/02/29 | 

若要將此資訊從名為 `Test` 的結構描述遷移到 Kinesis 資料串流，您要建立規則，以將資料映射到目標串流。以下規則說明映射。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "rule-action": "include",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            }
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "DefaultMapToKinesis",
            "rule-action": "map-record-to-record",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customers"
            }
        }
    ]
}
```

以下說明在 Kinesis 資料串流中產生的記錄格式：
+ StreamName：XXX
+ PartitionKey：Test.Customers //schmaName.tableName
+ Data：//以下 JSON 訊息

  ```
    {
       "FirstName": "Randy",
       "LastName": "Marsh",
       "StoreId":  "5",
       "HomeAddress": "221B Baker Street",
       "HomePhone": "1234567890",
       "WorkAddress": "31 Spooner Street, Quahog",
       "WorkPhone": "9876543210",
       "DateOfBirth": "02/29/1988"
    }
  ```

但是，假設您使用相同的規則，但將 `rule-action` 參數變更為 `map-record-to-document` 並排除某些資料欄。以下規則說明映射。

```
{
	"rules": [
	   {
			"rule-type": "selection",
			"rule-id": "1",
			"rule-name": "1",
			"rule-action": "include",
			"object-locator": {
				"schema-name": "Test",
				"table-name": "%"
			}
		},
		{
			"rule-type": "object-mapping",
			"rule-id": "2",
			"rule-name": "DefaultMapToKinesis",
			"rule-action": "map-record-to-document",
			"object-locator": {
				"schema-name": "Test",
				"table-name": "Customers"
			},
			"mapping-parameters": {
				"exclude-columns": [
					"homeaddress",
					"homephone",
					"workaddress",
					"workphone"
				]
			}
		}
	]
}
```

在本例中，未列在 `exclude-columns` 參數 `FirstName`、`LastName`、`StoreId` 和 `DateOfBirth` 中的資料欄會對應到 `_doc`。以下說明產生的記錄格式。

```
       {
            "data":{
                "_doc":{
                    "FirstName": "Randy",
                    "LastName": "Marsh",
                    "StoreId":  "5",
                    "DateOfBirth": "02/29/1988"
                }
            }
        }
```

### 使用屬性映射重組資料
<a name="CHAP_Target.Kinesis.AttributeMapping"></a>

您可以在使用屬性映射將資料遷移到 Kinesis 資料串流的同時，重組資料。例如，您可能想要將來源的幾個欄位合併為目標的單一欄位。以下屬性映射說明如何重組資料。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "rule-action": "include",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            }
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "TransformToKinesis",
            "rule-action": "map-record-to-record",
            "target-table-name": "CustomerData",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customers"
            },
            "mapping-parameters": {
                "partition-key-type": "attribute-name",
                "partition-key-name": "CustomerName",
                "exclude-columns": [
                    "firstname",
                    "lastname",
                    "homeaddress",
                    "homephone",
                    "workaddress",
                    "workphone"
                ],
                "attribute-mappings": [
                    {
                        "target-attribute-name": "CustomerName",
                        "attribute-type": "scalar",
                        "attribute-sub-type": "string",
                        "value": "${lastname}, ${firstname}"
                    },
                    {
                        "target-attribute-name": "ContactDetails",
                        "attribute-type": "document",
                        "attribute-sub-type": "json",
                        "value": {
                            "Home": {
                                "Address": "${homeaddress}",
                                "Phone": "${homephone}"
                            },
                            "Work": {
                                "Address": "${workaddress}",
                                "Phone": "${workphone}"
                            }
                        }
                    }
                ]
            }
        }
    ]
}
```

若要設定 的常數值`partition-key`，請指定 `"partition-key-type: "constant"`，這會將分割區值設定為 `constant`。例如，您可以執行此操作，將所有資料強制儲存在單一碎片中。以下映射說明此方法。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "TransformToKinesis",
            "rule-action": "map-record-to-document",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customer"
            },
            "mapping-parameters": {
                "partition-key-type": "constant",
                "exclude-columns": [
                    "FirstName",
                    "LastName",
                    "HomeAddress",
                    "HomePhone",
                    "WorkAddress",
                    "WorkPhone"
                ],
                "attribute-mappings": [
                    {
                        "target-attribute-name": "CustomerName",
                        "attribute-type": "scalar",
                        "attribute-sub-type": "string",
                        "value": "${FirstName},${LastName}"

                    },
                    {
                        "target-attribute-name": "ContactDetails",
                        "attribute-type": "scalar",
                        "attribute-sub-type": "string",
                        "value": {
                            "Home": {
                                "Address": "${HomeAddress}",
                                "Phone": "${HomePhone}"
                            },
                            "Work": {
                                "Address": "${WorkAddress}",
                                "Phone": "${WorkPhone}"
                            }
                        }
                    },
                    {
                        "target-attribute-name": "DateOfBirth",
                        "attribute-type": "scalar",
                        "attribute-sub-type": "string",
                        "value": "${DateOfBirth}"
                    }
                ]
            }
        }
    ]
}
```

**注意**  
用於特定資料表的控制記錄 `partition-key` 值是 `TaskId.SchemaName.TableName`。用於特定任務的控制記錄 `partition-key` 值是該記錄的 `TaskId`。在物件映射中指定 `partition-key` 值對控制記錄的 `partition-key` 沒有影響。  
 在資料表映射規則`attribute-name`中`partition-key-type`將 設定為 時，您必須指定 `partition-key-name`，其必須參考來源資料表中的資料欄或映射中定義的自訂資料欄。此外，`attribute-mappings`必須提供 來定義來源資料欄如何對應至目標 Kinesis Stream。

### Kinesis Data Streams 的訊息格式
<a name="CHAP_Target.Kinesis.Messageformat"></a>

JSON 輸出僅是索引鍵/值對的清單。JSON\_UNFORMATTED 訊息格式為含新行分隔符號的單行 JSON 字串。

AWS DMS 提供下列預留欄位，讓您更輕鬆地使用 Kinesis Data Streams 中的資料：

**RecordType**  
記錄類型可以是資料或控制。*資料記錄*代表來源的實際資料列。*控制記錄*用於串流的重要事件，例如重新啟動任務。

**作業**  
針對資料記錄，操作可以是 `load`、`insert`、`update` 或 `delete`。  
針對控制記錄，操作可以是 `create-table`、`rename-table`、`drop-table`、`change-columns`、`add-column`、`drop-column`、`rename-column` 或 `column-type-change`。

**SchemaName**  
記錄的來源結構描述。控制記錄的此欄位可以為空。

**TableName**  
記錄的來源資料表。控制記錄的此欄位可以為空。

**時間戳記**  
JSON 訊息建構時間的時間戳記。此欄位格式為 ISO 8601 格式。