

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

# 在 中版本控制 DynamoDB 資料來源 AWS AppSync
<a name="versioned-data-sources"></a>

AWS AppSync 目前支援 DynamoDB 資料來源上的版本控制。衝突偵測、衝突解決和同步作業需要 `Versioned` 資料來源。當您在資料來源上啟用版本控制時， AWS AppSync 會自動：
+ 使用物件版本控制中繼資料增強項目。
+ 記錄對 *Delta* 資料表具有 AWS AppSync 變動的項目所做的變更。
+ 針對可設定的時間量，在具有「tombstone」的 *Base* 資料表中，維護已刪除的項目。

## 版本控制的資料來源組態
<a name="versioned-data-source-configuration"></a>

當您在 DynamoDB 資料來源上啟用版本控制時，請指定以下欄位：

** `BaseTableTTL` **  
在具有「tombstone」的 *Base* 資料表中，保留已刪除項目的分鐘數 - 指出已刪除項目的中繼資料欄位。如果您想要在刪除項目時立即移除項目，可以將此值設為 *0*。此欄位為必填。

** `DeltaSyncTableName` **  
以 AWS AppSync 變動儲存項目變更的資料表名稱。此欄位為必填。

** `DeltaSyncTableTTL` **  
保留 *Delta* 資料表中項目的分鐘數。此欄位為必填。

## Delta 同步資料表記錄
<a name="delta-sync-table"></a>

AWS AppSync 目前支援使用 `PutItem`、 `UpdateItem`和 `DeleteItem` DynamoDB 操作進行變動的 Delta Sync Logging。

當 an AWS AppSync 變動變更版本控制資料來源中的項目時，該變更的記錄會存放在針對增量更新最佳化的 *Delta* 資料表中。您可以選擇針對其他版本控制的資料來源使用不同的 *Delta* 資料表 （例如，每種類型一個，每個網域區域一個），或針對您的 API 使用單一 *Delta* 資料表。 AWS AppSync 建議不要針對多個 APIs 使用單一 *Delta* 資料表，以避免主要金鑰發生衝突。

此資料表所需的結構描述如下所示：

** `ds_pk` **  
用來做為分割區索引鍵的字串值。其建構方式是串連*基本*資料來源名稱和變更發生日期的 ISO 8601 格式 （例如 `Comments:2019-01-01`)。  
當來自 VTL 映射範本的`customPartitionKey`旗標設定為分割區索引鍵的資料欄名稱時 （請參閱*AWS AppSync 開發人員指南*》中的 [ DynamoDB 解析程式映射範本參考](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem))，`ds_pk`變更格式和字串的建構方式是將分割區索引鍵的值附加到*基礎*資料表的新記錄中。例如，如果 *Base* 資料表中的記錄具有分割區索引鍵值 `1a`和排序索引鍵值 `2b`，則字串的新值將為：`Comments:2019-01-01:1a`。

** `ds_sk` **  
用來做為排序索引鍵的字串值。其建構方式是串連變更發生時間的 ISO 8601 格式、項目的主索引鍵，以及項目的版本。這些欄位的組合保證 *Delta* 資料表中每個項目的唯一性 （例如，對於 的時間`09:30:00`和 的 ID `1a`和 的版本`2`，這會是 `09:30:00:1a:2`)。  
當來自 VTL 映射範本的 `customPartitionKey`旗標設定為分割區索引鍵的資料欄名稱時 （請參閱 *AWS AppSync 開發人員指南*中的 [ DynamoDB 解析程式映射範本參考](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem))，`ds_sk`變更格式和字串的建構方式是將組合索引鍵的值取代為*基礎*資料表中排序索引鍵的值。使用上述範例，如果 *Base* 資料表中的記錄具有分割區索引鍵值 `1a`和排序索引鍵值 `2b`，則字串的新值將為：`09:30:00:2b:3`。

** `_ttl` **  
此數值用於存放應該從 *Delta* 資料表中移除項目時的時間戳記 (以 epoch 秒為單位)。此值是透過將資料來源上設定的 `DeltaSyncTableTTL` 值加入發生變更的時刻所決定的。此欄位應該設定為 DynamoDB TTL 屬性。

設定為與 *Base* 資料表搭配使用的 IAM 角色必須也包含在 *Delta* 資料表上進行操作的許可。在此範例中，`ChangeLog`會顯示名為 *的基本*資料表`Comments`和名為 的 *Delta* 資料表的許可政策：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:UpdateItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:000000000000:table/Comments",
                "arn:aws:dynamodb:us-east-1:000000000000:table/Comments/*",
                "arn:aws:dynamodb:us-east-1:000000000000:table/ChangeLog",
                "arn:aws:dynamodb:us-east-1:000000000000:table/ChangeLog/*"
            ]
        }
    ]
}
```

------

## 版本控制的資料來源中繼資料
<a name="versioned-data-source-metadata"></a>

AWS AppSync 會代表您管理`Versioned`資料來源上的中繼資料欄位。自行修改這些欄位可能會導致應用程式發生錯誤或資料遺失。這些欄位包括：

** `_version` **  
依序遞增的計數器，每當對項目進行變更時都會更新。

** `_lastChangedAt` **  
此數值用於存放上次修改項目時的時間戳記 (以 epoch 毫秒為單位)。

** `_deleted` **  
布林「tombstone」值，表示已刪除項目。應用程式可以使用此值，從本機資料存放區撤出已刪除的項目。

** `_ttl` **  
此數值用於存放應該從基礎資料來源中移除項目時的時間戳記 (以 epoch 秒為單位)。

** `ds_pk` **  
用來做為 *Delta* 資料表之分割區索引鍵的字串值。

** `ds_sk` **  
用來做為 *Delta* 資料表之排序索引鍵的字串值。

**`gsi_ds_pk`**  
產生的字串值屬性，以支援全域次要索引做為分割區索引鍵。只有在 VTL 映射範本中同時啟用 `customPartitionKey`和 `populateIndexFields`旗標時，才會包含它 （請參閱*AWS AppSync 開發人員指南*》中的 [ DynamoDB 解析程式映射範本參考](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem))。如果啟用，值將透過串連*基礎*資料來源名稱和變更發生日期的 ISO 8601 格式來建構 （例如，如果*基礎*資料表名為 *Comments*，則此記錄將設定為 `Comments:2019-01-01`)。

**`gsi_ds_sk`**  
產生的字串值屬性，支援全域次要索引做為排序索引鍵。只有在 VTL 映射範本中同時啟用 `customPartitionKey`和 `populateIndexFields`旗標時，才會包含它 （請參閱*AWS AppSync 開發人員指南*》中的 [ DynamoDB 解析程式映射範本參考](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem))。如果啟用，值的建構方式是串連發生變更的時間的 ISO 8601 格式、*基礎*資料表中項目的分割區索引鍵、*基礎*資料表中項目的排序索引鍵，以及項目的版本 （例如，在 的時間`09:30:00`、分割區索引鍵值 `1a`、排序索引鍵值 `2b`和 的版本 `3``09:30:00:1a#2b:3`)。

這些中繼資料欄位會影響基礎資料來源中項目的整體大小。 AWS AppSync 建議在設計應用程式時為版本控制資料來源中繼資料預留 *500 個位元組 \$1 最大主要金鑰大小*的儲存空間。若要在用戶端應用程式中使用此中繼資料，請在 GraphQL 類型和變動選取範圍中包含 `_version`、`_lastChangedAt` 和 `_deleted` 欄位。