

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

# AWS AppSync 解析程式映射範本參考 (VTL)
<a name="resolver-mapping-template-reference"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

下列各節將說明如何在映射範本中使用公用程式操作：
+  [ 解析程式映射範本概觀 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-overview.html) - 進一步了解解析程式如何在 中運作 AWS AppSync。
+  [ 解析程式映射範本程式設計指南 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-programming-guide.html) - 進一步了解基本 VTL 資料結構和邏輯處理。
+  [ 解析程式映射範本內容參考 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html) - 進一步了解內容映射及其在解析程式中的使用方式。
+  [ 解析程式映射範本公用程式參考 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html) - 進一步了解如何使用公用程式來簡化程式碼。
+  [ DynamoDB 的解析程式映射範本參考 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html) - 進一步了解解析程式如何與 DynamoDB 互動。
+  [ RDS 的解析程式映射範本參考 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-rds.html) - 進一步了解解析程式結構和與 RDS 的互動。
+  [ OpenSearch 的解析程式映射範本參考 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-elasticsearch.html) - 進一步了解解析程式請求和回應結構，以及與 OpenSearch Service 的互動。
+  [ Lambda 的解析程式映射範本參考 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-lambda.html) - 進一步了解解析程式請求和回應結構，以及與 Lambda 的互動。
+  [ EventBridge 的解析程式映射範本參考 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-eventbridge.html) - 進一步了解解析程式請求和回應結構，以及與 EventBridge 的互動。
+  [ 無資料來源的解析程式映射範本參考 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-none.html) - 進一步了解解析程式請求和回應結構，以及與 NONE 資料來源的互動。
+  [ HTTP 的解析程式映射範本參考 ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-http.html) - 進一步了解解析程式請求和回應結構，以及與 HTTP 端點的互動。

# AWS AppSync 解析程式映射範本概觀
<a name="resolver-mapping-template-reference-overview"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

AWS AppSync 可讓您透過對資源執行操作來回應 GraphQL 請求。對於您想要執行查詢或變動的每個 GraphQL 欄位，必須連接解析程式，才能與資料來源通訊。通訊通常是透過資料來源獨有的參數或操作進行。

解析程式是 GraphQL 和資料來源之間的連接器。他們 tell AWS AppSync 如何將傳入的 GraphQL 請求轉譯為後端資料來源的指示，以及如何將來自該資料來源的回應轉譯回 GraphQL 回應。它們是以 [Apache Velocity 範本語言 (VTL)](https://velocity.apache.org/engine/1.7/user-guide.html) 撰寫，會將您的請求視為輸入，並輸出包含解析程式指示的 JSON 文件。您可以將映射範本用於簡單的指示，例如從 GraphQL 欄位傳入引數，或用於更複雜的指示，例如循環使用引數來建置項目，然後再將項目插入 DynamoDB。

解析程式 in AWS AppSync 有兩種類型，會以稍微不同的方式利用映射範本：
+ 單位解析程式
+ 管道解析程式

## 單位解析程式
<a name="unit-resolvers"></a>

單位解析程式是獨立的實體，僅包含請求和回應範本。這種類型可以用於簡易、單一的操作，例如列出來自單一資料來源的清單項目。
+ 請求範本：剖析 GraphQL 操作後接受傳入請求，並將其轉換為所選資料來源操作的請求組態。
+ 回應範本：解譯資料來源的回應，並將其映射至 GraphQL 欄位輸出類型的形狀。

## 管道解析程式
<a name="pipeline-resolvers"></a>

管道解析程式包含一個或多個按順序執行的*函數*。每個函數都包含請求範本和回應範本。管道解析程式也具有 *預*範本和 *後*範本，包圍範本包含的函數序列。後續**範本會映射至 GraphQL 欄位輸出類型。管道解析程式與單位解析程式的不同之處在於回應範本映射輸出的方式。管道解析程式可以映射到您想要的任何輸出，包括另一個函數的輸入或管道解析程式的*後續*範本。

 管道解析程式*函數*可讓您撰寫可在結構描述中的多個解析程式之間重複使用的常見邏輯。函數會直接連接到資料來源，就像單位解析程式一樣，包含相同的請求和回應映射範本格式。

下圖示範左側單元解析程式和右側管道解析程式的處理流程。

![\[與單一資料來源通訊的單元解析程式圖表，以及與多個資料來源通訊的管道解析程式圖表。\]](http://docs.aws.amazon.com/zh_tw/appsync/latest/devguide/images/unit-pipeline-resolver.png)


管道解析程式包含單元解析程式支援等功能的超集，其成本略高。

### 管道解析程式剖析
<a name="anatomy-of-a-pipeline-resolver"></a>

管道解析程式由**預先**映射範本、**後續**映射範本和函數清單組成。每個函數都有一個**請求**和**回應**映射範本，它會針對資料來源執行。由於管道解析程式是將執行委派到一份函數清單，所以不會連結到任何資料來源。單位解析程式和函數是對資料來源執行操作的基本元素。如需詳細資訊，請參閱[解析程式映射範本概觀](#aws-appsync-resolver-mapping-template-reference-overview)。

#### 映射範本之前
<a name="before-mapping-template"></a>

管道解析程式的請求映射範本，或 **Before** 步驟，可讓您在執行定義的函數之前執行一些準備邏輯。

#### 函數清單
<a name="functions-list"></a>

管道解析程式將會依序執行的函數清單。管道解析程式要求映射範本評估的結果，會依 `$ctx.prev.result` 提供給第一個函數。每個函數輸出都會依 `$ctx.prev.result` 提供給下一個函數。

#### After 映射範本
<a name="after-mapping-template"></a>

管道解析程式的回應映射範本，或 **After** 步驟，可讓您執行從最後一個函數輸出到預期 GraphQL 欄位類型的一些最終映射邏輯。在函數清單的最後一個函數的輸出，將依 `$ctx.prev.result` 或 `$ctx.result` 提供給管道解析程式映射範本。

#### 執行流程
<a name="execution-flow"></a>

假設管道解析程式包含兩個函數，以下清單代表呼叫解析程式時的執行流程：

![\[GraphQL request flow diagram showing template processing and data source interactions.\]](http://docs.aws.amazon.com/zh_tw/appsync/latest/devguide/images/PipelineResolver.jpg)


1. 映射範本**前**的管道解析程式

1. 第 1 個函數：函數要求映射範本

1. 第 1 個函數：資料來源呼叫

1. 第 1 個函數：函數回應映射範本

1. 第 2 個函數：函數要求映射範本

1. 第 2 個函數：資料來源呼叫

1. 第 2 個函數：函數回應映射範本

1. 映射範本**之後**的管道解析程式

**注意**  
管道解析程式執行流程為單向，並已在解析程式靜態定義。

#### 實用的 Apache 速度範本語言 (VTL) 公用程式
<a name="useful-apache-velocity-template-language-vtl-utilities"></a>

隨著應用程式複雜性提高，VTL 公用程式和此處的指示詞可加速開發生產力。下列公用程式可在您使用管道解析程式時提供協助。

##### \$1ctx.stash
<a name="ctx-stash"></a>

stash 是在每個解析程式和函數映射範本中`Map`提供的 。在單一個解析程式執行期間，則會存在相同的 stash 執行個體。這表示您可以使用 stash 在管道解析程式中的所有要求和回應映射範本、以及全部函數中，傳遞任意資料。停止會公開與 [Java 地圖](https://docs.oracle.com/javase/8/docs/api/java/util/Map.html)資料結構相同的方法。

##### \$1ctx.prev.result
<a name="ctx-prev-result"></a>

`$ctx.prev.result` 代表在管道解析程式中執行的先前操作的結果。

如果先前的操作是管道解析程式的映射前範本，則 `$ctx.prev.result` 代表範本評估的輸出，並可供管道中的第一個函數使用。如果先前操作是第一個函數，則 `$ctx.prev.result` 會顯示第一個函數的輸出，並將資料提供給管道中的第二個函數。如果先前的操作是最後一個函數，則 `$ctx.prev.result` 代表最後一個函數的輸出，並可供管道解析程式的映射後範本使用。

##### \$1return(data: Object)
<a name="return-data-object"></a>

當您需要從任何映射範本提前傳回時，這時使用 `#return(data: Object)` 指令就能完成。`#return(data: Object)` 類似於程式設計語言中的 *return* 關鍵字，因為它會從最靠近範圍的邏輯區塊傳回。這表示在解析程式映射範本中使用 `#return` 時，將從該解析程式傳回。在解析程式映射範本中使用 `#return(data: Object)`，將會設定 GraphQL 欄位上的 `data`。此外，使用函數映射範本的 `#return(data: Object)` 時會從該函數傳回，且執行將持續到該管道或是解析程式回應映射範本中的下一個函數。

##### \$1return
<a name="return"></a>

這與 相同`#return(data: Object)`，但`null`會改為傳回。

##### \$1util.error
<a name="util-error"></a>

`$util.error` 公用程式非常適合用來擲出欄位錯誤。在函數映射範本內使用 `$util.error` 會立即擲出錯誤，其可阻止後續函數執行。如需詳細資訊和其他`$util.error`簽章，請參閱[解析程式映射範本公用程式參考](resolver-util-reference.md#aws-appsync-resolver-mapping-template-util-reference)。

##### \$1util.appendError
<a name="util-appenderror"></a>

`$util.appendError` 的功能類似於 `$util.error()`，主要的差別在於前者不會中斷映射範本的評估，而是在欄位出現錯誤時發出訊號，但允許範本的評估，進而將資料傳回。在函數中使用 `$util.appendError` 並不會中斷管道的執行流程。如需詳細資訊和其他`$util.error`簽章，請參閱[解析程式映射範本公用程式參考](resolver-util-reference.md#aws-appsync-resolver-mapping-template-util-reference)。

## 範例 範本
<a name="example-template"></a>

假設您在名為 的欄位上有 DynamoDB 資料來源和**單位**解析程式`getPost(id:ID!)`，該欄位會傳回具有下列 GraphQL 查詢的`Post`類型：

```
getPost(id:1){
    id
    title
    content
}
```

解析程式範本看起來可能會類似於下列的範例：

```
{
    "version" : "2018-05-29",
    "operation" : "GetItem",
    "key" : {
        "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
    }
}
```

這會用 `id` 輸入的參數值 `1` 來取代 `${ctx.args.id}`，並產生下列 JSON：

```
{
    "version" : "2018-05-29",
    "operation" : "GetItem",
    "key" : {
        "id" : { "S" : "1" }
    }
}
```

AWS AppSync 使用此範本來產生與 DynamoDB 通訊和取得資料 （或視需要執行其他操作） 的指示。資料傳回後， AWS AppSync 會透過選用的回應映射範本執行它，您可以使用該範本來執行資料成形或邏輯。例如，當我們從 DynamoDB 取得結果時，結果可能如下所示：

```
{
        "id" : 1,
        "theTitle" : "AWS AppSync works offline!",
        "theContent-part1" : "It also has realtime functionality",
        "theContent-part2" : "using GraphQL"
}
```

您可以利用下列的回應映射範本，來選擇將其中兩個欄位合併為單一欄位：

```
{
        "id" : $util.toJson($context.data.id),
        "title" : $util.toJson($context.data.theTitle),
        "content" : $util.toJson("${context.data.theContent-part1} ${context.data.theContent-part2}")
}
```

在將範本套用到資料之後，資料的格式如下所示：

```
{
        "id" : 1,
        "title" : "AWS AppSync works offline!",
        "content" : "It also has realtime functionality using GraphQL"
}
```

這些資料會再做為回應傳回給用戶端，如下所示：

```
{
        "data": {
                "getPost":      {
                        "id" : 1,
                        "title" : "AWS AppSync works offline!",
                        "content" : "It also has realtime functionality using GraphQL"
                }
        }
}
```

請注意，在大部分情況下，回應映射範本是簡單的資料傳遞，主要差別在於您是傳回個別項目或項目清單。若是個別項目，則傳遞是：

```
$util.toJson($context.result)
```

若是清單，則傳遞通常是：

```
$util.toJson($context.result.items)
```

若要查看單元和管道解析程式的更多範例，請參閱[解析程式教學課程](tutorials.md#aws-appsync-tutorials)。

## 評估的映射範本還原序列化規則
<a name="evaluated-mapping-template-deserialization-rules"></a>

對於一個字串的對應範本評估。In AWS AppSync，輸出字串必須遵循 JSON 結構才能有效。

此外，系統會強制執行下列還原序列化規則。

### JSON 物件中不允許重複金鑰
<a name="duplicate-keys-are-not-allowed-in-json-objects"></a>

如果已評估的對應範本字串代表 JSON 物件，或包含具有重複金鑰的物件，則對應範本會傳回下列錯誤訊息：

 `Duplicate field 'aField' detected on Object. Duplicate JSON keys are not allowed.` 

已評估要求對應範本中重複金鑰的範例：

```
{
    "version": "2018-05-29",
    "operation": "Invoke",
    "payload": {
        "field": "getPost",
        "postId": "1",
        "field": "getPost" ## key 'field' has been redefined
    }
}
```

若要修正此錯誤，請勿在 JSON 物件中重新定義金鑰。

### JSON 物件中不允許結尾字元
<a name="trailing-characters-are-not-allowed-in-json-objects"></a>

如果已評估的對應範本字串代表 JSON 物件，且包含額外的結尾字元，則對應範本會傳回下列錯誤訊息：

 `Trailing characters at the end of the JSON string are not allowed.` 

已評估請求映射範本中結尾字元的範例：

```
{
    "version": "2018-05-29",
    "operation": "Invoke",
    "payload": {
        "field": "getPost",
        "postId": "1",
    }
}extraneouschars
```

若要修正此錯誤，請確保評估的範本嚴格評估為 JSON。

# AWS AppSync 解析程式映射範本程式設計指南
<a name="resolver-mapping-template-reference-programming-guide"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

這是使用 Apache Velocity 範本語言 (VTL) 進行程式設計的技術指南樣式教學 AWS AppSync課程。如果您熟悉其他程式設計語言 (例如 JavaScript、C 或 Java)，此做法應相當直覺。

AWS AppSync 使用 VTL 將來自用戶端的 GraphQL 請求轉譯為對資料來源的請求。然後，它會反轉程序，來將資料來源轉換回 GraphQL 回應。VTL 是一種邏輯範本語言，可讓您使用下列技術，在 Web 應用程式的標準請求/回應流程中同時操作請求和回應：
+ 新項目的預設值
+ 輸入驗證和格式化
+ 轉換與打造資料
+ 逐一查看清單、映射和陣列以移出或更改值
+ 根據使用者身分篩選條件/變更回應
+ 複雜的授權檢查

例如，您可能想要在 GraphQL 引數的服務中執行電話號碼驗證，或先將輸入參數轉換為大寫，再將其儲存在 DynamoDB 中。或者，您希望用戶端系統能以 GraphQL 引數、JWT 字符或 HTTP 標頭的形式提供程式碼，並在程式碼符合清單中的特定字串時才回應資料。這些都是您可以使用 VTL in AWS AppSync 執行的邏輯檢查。

VTL 可讓您使用熟悉的程式設計技巧，來套用邏輯。不過，其受到限制，必須在標準請求/回應流程內執行，以確保 GraphQL API 可隨著您的使用者成長而擴展。Because AWS AppSync 也支援 AWS Lambda 做為解析程式，如果您需要更多彈性，您可以使用您選擇的程式設計語言 (Node.js、Python、Go、Java 等） 撰寫 Lambda 函數。

## 設定
<a name="setup"></a>

學習語言的一項常用技巧是將結果列印出來 (例如，在 JavaScript 中的 `console.log(variable)`)，以查看發生的情況。在本教學中，我們透過建立簡單的 GraphQL 結構描述並將對應值傳遞到 Lambda 函式來示範此技巧。Lambda 函式會列印出值，然後加以回應。這可讓您了解請求/回應流程，並查看不同的程式設計技巧。

開始建立以下 GraphQL 結構描述：

```
type Query {
    get(id: ID, meta: String): Thing
}

type Thing {
    id: ID!
    title: String!
    meta: String
}

schema {
    query: Query
}
```

現在使用 Node.js 做為語言，建立下列 AWS Lambda 函數：

```
exports.handler = (event, context, callback) => {
    console.log('VTL details: ', event);
    callback(null, event);
};
```

在 AWS AppSync 主控台的**資料來源**窗格中，將此 Lambda 函數新增為新的資料來源。導覽回主控台的**結構描述**頁面，然後按一下`get(...):Thing`查詢旁邊的右側 **ATTACH** 按鈕。如需請求範本，從 **Invoke and forward arguments (叫用和轉送引數)** 功能表中選擇現有的範本。如需回應範本，請選擇 **Return Lambda result (傳回 Lambda 結果)**。

在一個位置開啟 Lambda 函數的 Amazon CloudWatch Logs，並從 AWS AppSync 主控台的**查詢**索引標籤執行下列 GraphQL 查詢：

```
query test {
  get(id:123 meta:"testing"){
    id
    meta
  }
}
```

GraphQL 回應應包含 `id:123` 和 `meta:testing`，因為 Lambda 函式會參考這兩者。幾秒鐘後，您也應該會在 CloudWatch Logs 中看到包含這些詳細資訊的記錄。

## Variables
<a name="variables"></a>

VTL 使用[參考](https://velocity.apache.org/engine/1.7/user-guide.html#references)，供您用來存放或操作資料。在 VTL 中有三種類型的參考：變數、屬性和方法。變數的前面會有 `$` 符號且這些變數的建立是透過 `#set` 指令：

```
#set($var = "a string")
```

變數會使用其他語言存放您所熟悉的類似類型，例如數字、字串、陣列、清單和映射。您可能已經注意到傳送至預設請求範本以供 Lambda 解析程式使用的 JSON 承載：

```
"payload": $util.toJson($context.arguments)
```

這裡要注意的幾件事 - 首先， AWS AppSync 為常見操作提供數種便利功能。在這個範例中，`$util.toJson` 會將變數轉換為 JSON。其次，會自動從 GraphQL 請求填入變數 `$context.arguments` 做為映射物件。您可以建立新的映射，如下所示：

```
#set( $myMap = {
  "id": $context.arguments.id,
  "meta": "stuff",
  "upperMeta" : $context.arguments.meta.toUpperCase()
} )
```

現在，您可以建立名為 `$myMap` 的變數，其擁有 `id`、`meta` 以及 `upperMeta` 的金鑰。這也展現了以下幾點：
+  從 GraphQL 引數將金鑰填入 `id`。在 VTL 中從用戶端擷取引數是很常見的做法。
+  是以值來將 `meta` 硬式編碼，以展現預設值。
+  `upperMeta` 會使用方法 `meta` 來轉換 `.toUpperCase()` 引數。

將之前的程式碼放在請求範本的頂部並變更 `payload` 以使用新的 `$myMap` 變數：

```
"payload": $util.toJson($myMap)
```

執行您的 Lambda 函式，您可以查看回應變更與在 CloudWatch 日誌中的此資料。在您逐步完成本教學的其餘部分，我們將保持填入 `$myMap` 如此您就可以執行類似的測試。

您也可以對變數設定 *properties\$1*。它們可以是簡單的字串、陣列或 JSON：

```
#set($myMap.myProperty = "ABC")
#set($myMap.arrProperty = ["Write", "Some", "GraphQL"])
#set($myMap.jsonProperty = {
    "AppSync" : "Offline and Realtime",
    "Cognito" : "AuthN and AuthZ"
})
```

### 靜音參考
<a name="quiet-references"></a>

由於 VTL 是一種範本化語言，在預設情況下，您給予的每個參考將會執行 `.toString()`。如果參考是未定義的，它會列印實際參考呈現做為字串。例如：

```
#set($myValue = 5)
##Prints '5'
$myValue

##Prints '$somethingelse'
$somethingelse
```

為了解決這個問題，VTL 有*安靜參考*或*無提示參考*語法，可告訴範本引擎抑制這種行為。此語法是 `$!{}`。例如，如果我們稍微變更之前的程式碼以使用 `$!{somethingelse}`，系統會抑制列印：

```
#set($myValue = 5)
##Prints '5'
$myValue

##Nothing prints out
$!{somethingelse}
```

## 呼叫方法
<a name="calling-methods"></a>

在之前的範例中，我們示範了如何建立變數並同時設定值。您也可以如下所示將資料新增到映射，以兩個步驟執行此操作：

```
#set ($myMap = {})
#set ($myList = [])

##Nothing prints out
$!{myMap.put("id", "first value")}
##Prints "first value"
$!{myMap.put("id", "another value")}
##Prints true
$!{myList.add("something")}
```

 **然而**，有一些需了解這種行為的原因。雖然安靜參考表示法可讓您 `$!{}` 如以上方式呼叫方法，它將不會抑制執行方法的傳回值。這也是為什麼我們會說明以上的 `##Prints "first value"` 及 `##Prints true`。您逐一查看映射或清單可能會導致錯誤，例如插入索引鍵已存在的值，因為輸出會在評估時將未預期的字串加入範本中。

此問題的解決方法有時會使用 `#set` 指令來呼叫方法並忽略變數。例如：

```
#set ($myMap = {})
#set($discard = $myMap.put("id", "first value"))
```

您可以在範本中使用此技術，因為它可防止在範本中列印出非預期的字串。 AWS AppSync 提供替代的便利函數，可在更簡潔的表示法中提供相同的行為。這可讓您不需要考慮這些實作特性。您可以透過 `$util.quiet()` 或其別名 `$util.qr()` 存取此函式。例如：

```
#set ($myMap = {})
#set ($myList = [])

##Nothing prints out
$util.quiet($myMap.put("id", "first value"))
##Nothing prints out
$util.qr($myList.add("something"))
```

## Strings
<a name="strings"></a>

隨著使用多種程式設計語言，字串可能會變得難以處理，尤其是當您想要透過變數建構字串時。有一些與 VTL 相關的常見事件。

假設您要將資料作為字串插入 DynamoDB 之類的資料來源，但會從變數填入，例如 GraphQL 引數。字串會有雙引號，並在您只需要的字串中參考變數 `"${}"`（因此在[安靜參考表示法](https://velocity.apache.org/engine/1.7/user-guide.html#quiet-reference-notation)中不會`!`有 )。這與 JavaScript 中的範本常值類似：[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template\$1literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) 

```
#set($firstname = "Jeff")
$!{myMap.put("Firstname", "${firstname}")}
```

您可以在 DynamoDB 請求範本中看到此問題，例如使用來自 GraphQL 用戶端的引數`"author": { "S" : "${context.arguments.author}"}`時，或自動產生 ID 時，例如 `"id" : { "S" : "$util.autoId()"}`。這表示您可以參考變數或字串內部的方法結果來填入資料。

您也可以使用 Java [字串類別](https://docs.oracle.com/javase/6/docs/api/java/lang/String.html)的公有方法 (例如取出子字串)：

```
#set($bigstring = "This is a long string, I want to pull out everything after the comma")
#set ($comma = $bigstring.indexOf(','))
#set ($comma = $comma +2)
#set ($substring = $bigstring.substring($comma))

$util.qr($myMap.put("substring", "${substring}"))
```

字串連接也是非常常見的任務。您可以單獨使用變數參考或使用變數參考搭配靜態值來這樣做：

```
#set($s1 = "Hello")
#set($s2 = " World")

$util.qr($myMap.put("concat","$s1$s2"))
$util.qr($myMap.put("concat2","Second $s1 World"))
```

## 迴圈
<a name="loops"></a>

現在您已建立變數和呼叫方法，您可以將一些邏輯到新增到程式碼。與其他語言不同，VTL 只允許迴圈，其中反覆次數是預先決定的。在速度中沒有 `do..while`。此設計可確保評估處理一律終止，並提供 GraphQL 操作執行時的擴充界限。

迴圈是使用 `#foreach` 所建立並需要您輸入**迴圈變數**和 **iterable 物件** (例如陣列、清單、映射或集合)。`#foreach` 迴圈的典型程式設計範例，即是循環執行集合中的項目並將他們印出，因此我們的案例中，我們將這些項目移出，並將他們新增至映射：

```
#set($start = 0)
#set($end = 5)
#set($range = [$start..$end])

#foreach($i in $range)
   ##$util.qr($myMap.put($i, "abc"))
   ##$util.qr($myMap.put($i, $i.toString()+"foo")) ##Concat variable with string
   $util.qr($myMap.put($i, "${i}foo"))     ##Reference a variable in a string with "${varname}"
#end
```

此範例顯示一些考量。第一種是使用變數與範圍 `[..]` 運算子來建立 iterable 物件。然後，您可以操作的變數 `$i` 會參考每個項目。在上述範例中，您還可以查看**註解**，註解會加上雙井字號 `##` 來表示。這也展示在金鑰或值兩者中使用迴圈變數，以及使用字串的不同串連方法。

請注意，`$i` 是一個整數，因此您可以呼叫 `.toString()` 方法。若是 INT 的 GraphQL 類型，此技巧非常實用。

您也可以直接使用各種操作，例如：

```
#foreach($item in [1..5])
    ...
#end
```

## 陣列
<a name="arrays"></a>

您到目前為止已完成映射的操控，但在 VTL 中陣列也相當常見。您也可以使用陣列存取一些基本方法，例如 `.isEmpty()`、`.size()`、`.set()`、`.get()` 和 `.add()`，如下所示：

```
#set($array = [])
#set($idx = 0)

##adding elements
$util.qr($array.add("element in array"))
$util.qr($myMap.put("array", $array[$idx]))

##initialize array vals on create
#set($arr2 = [42, "a string", 21, "test"])

$util.qr($myMap.put("arr2", $arr2[$idx]))
$util.qr($myMap.put("isEmpty", $array.isEmpty()))  ##isEmpty == false
$util.qr($myMap.put("size", $array.size()))

##Get and set items in an array
$util.qr($myMap.put("set", $array.set(0, 'changing array value')))
$util.qr($myMap.put("get", $array.get(0)))
```

上一個範例使用陣列索引表示法來擷取具有 的 元素`arr2[$idx]`。您可以透過類似的方式從 Map/字典中來查詢名稱：

```
#set($result = {
    "Author" : "Nadia",
    "Topic" : "GraphQL"
})

$util.qr($myMap.put("Author", $result["Author"]))
```

在使用條件時，在回應範本中篩選來自資料來源的結果是很常見的。

## 條件式檢查
<a name="conditional-checks"></a>

`#foreach` 的舊區段說明使用邏輯來透過 VTL 轉換資料的部分範例。您也可以套用條件式檢查來評估執行時間的資料：

```
#if(!$array.isEmpty())
    $util.qr($myMap.put("ifCheck", "Array not empty"))
#else
    $util.qr($myMap.put("ifCheck", "Your array is empty"))
#end
```

上述布林值表達式 `#if()` 的檢查是精細的，但您也可以使用運算子和 `#elseif()` 來進行分支：

```
#if ($arr2.size() == 0)
    $util.qr($myMap.put("elseIfCheck", "You forgot to put anything into this array!"))
#elseif ($arr2.size() == 1)
    $util.qr($myMap.put("elseIfCheck", "Good start but please add more stuff"))
#else
    $util.qr($myMap.put("elseIfCheck", "Good job!"))
#end
```

這兩個範例示範 negation(\$1) 和 equality (==)。我們也可以使用 \$1\$1、&&、>、<、>=、<= 和 \$1=。

```
#set($T = true)
#set($F = false)

#if ($T || $F)
  $util.qr($myMap.put("OR", "TRUE"))
#end

#if ($T && $F)
  $util.qr($myMap.put("AND", "TRUE"))
#end
```

 **注意：**在條件中只有 `Boolean.FALSE` 和 `null` 會被視為 false。零 (0) 和空白字串 ("") 不等同於 false。

## 運算子
<a name="operators"></a>

程式設計語言需要運算子來執行數學動作才得以完整。有幾種簡單的入門方式：

```
#set($x = 5)
#set($y = 7)
#set($z = $x + $y)
#set($x-y = $x - $y)
#set($xy = $x * $y)
#set($xDIVy = $x / $y)
#set($xMODy = $x % $y)

$util.qr($myMap.put("z", $z))
$util.qr($myMap.put("x-y", $x-y))
$util.qr($myMap.put("x*y", $xy))
$util.qr($myMap.put("x/y", $xDIVy))
$util.qr($myMap.put("x|y", $xMODy))
```

### 同時使用迴圈和條件
<a name="loops-and-conditionals-together"></a>

這在 VTL 中轉換資料很常見 (例如在從資料來源寫入或讀取前)，以循環執行物件，然後執行檢查，再執行動作。將之前區段的一些工具進行整合，讓您有更多功能可使用。一個便利的工具是知道 `#foreach` 會自動提供您每個項目的 `.count`：

```
#foreach ($item in $arr2)
  #set($idx = "item" + $foreach.count)
  $util.qr($myMap.put($idx, $item))
#end
```

例如，如果值小於特定大小，則也許您會希望將其從映射移出。使用計數以及條件和 `#break` 陳述式可讓您執行此操作：

```
#set($hashmap = {
  "DynamoDB" : "https://aws.amazon.com/dynamodb/",
  "Amplify" : "https://github.com/aws/aws-amplify",
  "DynamoDB2" : "https://aws.amazon.com/dynamodb/",
  "Amplify2" : "https://github.com/aws/aws-amplify"
})

#foreach ($key in $hashmap.keySet())
    #if($foreach.count > 2)
    #break
  #end
    $util.qr($myMap.put($key, $hashmap.get($key)))
#end
```

先前 `#foreach` 已透過 `.keySet()` (您可以在映射上使用此項目) 來重複使用。這讓您能夠取得 `$key` 並使用 `.get($key)` 來參考該值。來自用戶端 in AWS AppSync 的 GraphQL 引數會儲存為映射。也可以透過 `.entrySet()` (您可以同時存取金鑰和值做為 Set) 來重複使用這些項目，並填入其他變數或執行複雜條件式檢查 (例如驗證或輸入的轉換)：

```
#foreach( $entry in $context.arguments.entrySet() )
#if ($entry.key == "XYZ" && $entry.value == "BAD")
    #set($myvar = "...")
  #else
    #break
  #end
#end
```

其他常見範例會自動填入預設資訊，例如同步資料時的初始物件版本 （在衝突解決中非常重要） 或授權檢查物件的預設擁有者 - Mary 建立此部落格文章，因此：

```
#set($myMap.owner ="Mary")
#set($myMap.defaultOwners = ["Admins", "Editors"])
```

## Context
<a name="context"></a>

現在您已更熟悉在具有 VTL 的解析程式中 AWS AppSync 執行邏輯檢查，請查看內容物件：

```
$util.qr($myMap.put("context", $context))
```

這包含所有資訊，您可以在 GraphQL 請求中存取這些資訊。有關詳細說明，請參閱[內容參考](resolver-context-reference.md#aws-appsync-resolver-mapping-template-context-reference)。

## 篩選
<a name="filtering"></a>

此教學到目前為止，會透過非常簡單的 JSON 轉換，將 Lambda 函式的所有資訊傳回到 GraphQL 查詢：

```
$util.toJson($context.result)
```

VTL 邏輯就跟您從資料來源取得回應時一樣強大，尤其是在對回應進行授權檢查時。讓我們逐步介紹一些範例。首先，嘗試如下變更回應範本：

```
#set($data = {
    "id" : "456",
    "meta" : "Valid Response"
})

$util.toJson($data)
```

無論您對 GraphQL 操作進行何種操作，系統會將硬式編碼值傳回用戶端。稍微變更此項目，以從 Lambda 回應填入 `meta` 欄位，如需了解條件時則在教學課程中以 `elseIfCheck` 值來較早設立此值：

```
#set($data = {
    "id" : "456"
})

#foreach($item in $context.result.entrySet())
    #if($item.key == "elseIfCheck")
        $util.qr($data.put("meta", $item.value))
    #end
#end

$util.toJson($data)
```

 `$context.result` 是一種映射，因此您可以使用 `entrySet()` 來對金鑰或傳回的值執行邏輯。由於 `$context.identity` 包含使用者執行 GraphQL 操作的相關資訊，如果您從資料來源傳回授權資訊，則可以根據邏輯決定是否向使用傳回全部、部分資料或不傳回資料。將您的回應範本變更為如下所示：

```
#if($context.result["id"] == 123)
    $util.toJson($context.result)
  #else
    $util.unauthorized()
#end
```

如果您執行 GraphQL 查詢，系統會以一般的方式傳回。不過，如果您將 id 引數變更 123 以外的值 (`query test { get(id:456 meta:"badrequest"){} }`)，您會收到授權失敗的訊息。

您可以在[授權使用案例](security-authorization-use-cases.md#aws-appsync-security-authorization-use-cases)小節中找到更多授權案例的範例。

### 範本範例
<a name="appendix-template-sample"></a>

若您遵循此教學至今，您可以逐步建立此範本。若您並未遵循此教學，我們已在下方提供，可讓您複製並進行測試。

 **請求範本** 

```
#set( $myMap = {
  "id": $context.arguments.id,
  "meta": "stuff",
  "upperMeta" : "$context.arguments.meta.toUpperCase()"
} )

##This is how you would do it in two steps with a "quiet reference" and you can use it for invoking methods, such as .put() to add items to a Map
#set ($myMap2 = {})
$util.qr($myMap2.put("id", "first value"))

## Properties are created with a dot notation
#set($myMap.myProperty = "ABC")
#set($myMap.arrProperty = ["Write", "Some", "GraphQL"])
#set($myMap.jsonProperty = {
    "AppSync" : "Offline and Realtime",
    "Cognito" : "AuthN and AuthZ"
})

##When you are inside a string and just have ${} without ! it means stuff inside curly braces are a reference
#set($firstname = "Jeff")
$util.qr($myMap.put("Firstname", "${firstname}"))

#set($bigstring = "This is a long string, I want to pull out everything after the comma")
#set ($comma = $bigstring.indexOf(','))
#set ($comma = $comma +2)
#set ($substring = $bigstring.substring($comma))
$util.qr($myMap.put("substring", "${substring}"))

##Classic for-each loop over N items:
#set($start = 0)
#set($end = 5)
#set($range = [$start..$end])
#foreach($i in $range)          ##Can also use range operator directly like #foreach($item in [1...5])
   ##$util.qr($myMap.put($i, "abc"))
   ##$util.qr($myMap.put($i, $i.toString()+"foo")) ##Concat variable with string
   $util.qr($myMap.put($i, "${i}foo"))     ##Reference a variable in a string with "${varname)"
#end

##Operators don't work
#set($x = 5)
#set($y = 7)
#set($z = $x + $y)
#set($x-y = $x - $y)
#set($xy = $x * $y)
#set($xDIVy = $x / $y)
#set($xMODy = $x % $y)
$util.qr($myMap.put("z", $z))
$util.qr($myMap.put("x-y", $x-y))
$util.qr($myMap.put("x*y", $xy))
$util.qr($myMap.put("x/y", $xDIVy))
$util.qr($myMap.put("x|y", $xMODy))

##arrays
#set($array = ["first"])
#set($idx = 0)
$util.qr($myMap.put("array", $array[$idx]))
##initialize array vals on create
#set($arr2 = [42, "a string", 21, "test"])
$util.qr($myMap.put("arr2", $arr2[$idx]))
$util.qr($myMap.put("isEmpty", $array.isEmpty()))  ##Returns false
$util.qr($myMap.put("size", $array.size()))
##Get and set items in an array
$util.qr($myMap.put("set", $array.set(0, 'changing array value')))
$util.qr($myMap.put("get", $array.get(0)))

##Lookup by name from a Map/dictionary in a similar way:
#set($result = {
    "Author" : "Nadia",
    "Topic" : "GraphQL"
})
$util.qr($myMap.put("Author", $result["Author"]))


##Conditional examples
#if(!$array.isEmpty())
$util.qr($myMap.put("ifCheck", "Array not empty"))
#else
$util.qr($myMap.put("ifCheck", "Your array is empty"))
#end

#if ($arr2.size() == 0)
$util.qr($myMap.put("elseIfCheck", "You forgot to put anything into this array!"))
#elseif ($arr2.size() == 1)
$util.qr($myMap.put("elseIfCheck", "Good start but please add more stuff"))
#else
$util.qr($myMap.put("elseIfCheck", "Good job!"))
#end

##Above showed negation(!) and equality (==), we can also use OR, AND, >, <, >=, <=, and !=
#set($T = true)
#set($F = false)
#if ($T || $F)
  $util.qr($myMap.put("OR", "TRUE"))
#end

#if ($T && $F)
  $util.qr($myMap.put("AND", "TRUE"))
#end

##Using the foreach loop counter - $foreach.count
#foreach ($item in $arr2)
  #set($idx = "item" + $foreach.count)
  $util.qr($myMap.put($idx, $item))
#end

##Using a Map and plucking out keys/vals
#set($hashmap = {
    "DynamoDB" : "https://aws.amazon.com/dynamodb/",
    "Amplify" : "https://github.com/aws/aws-amplify",
    "DynamoDB2" : "https://aws.amazon.com/dynamodb/",
    "Amplify2" : "https://github.com/aws/aws-amplify"
})

#foreach ($key in $hashmap.keySet())
    #if($foreach.count > 2)
        #break
    #end
    $util.qr($myMap.put($key, $hashmap.get($key)))
#end

##concatenate strings
#set($s1 = "Hello")
#set($s2 = " World")
$util.qr($myMap.put("concat","$s1$s2"))
$util.qr($myMap.put("concat2","Second $s1 World"))

$util.qr($myMap.put("context", $context))

{
    "version" : "2017-02-28",
    "operation": "Invoke",
    "payload": $util.toJson($myMap)
}
```

 **回應範本** 

```
#set($data = {
"id" : "456"
})
#foreach($item in $context.result.entrySet())   ##$context.result is a MAP so we use entrySet()
    #if($item.key == "ifCheck")
        $util.qr($data.put("meta", "$item.value"))
    #end
#end

##Uncomment this out if you want to test and remove the below #if check
##$util.toJson($data)

#if($context.result["id"] == 123)
    $util.toJson($context.result)
  #else
    $util.unauthorized()
#end
```

# AWS AppSync 解析程式映射範本內容參考
<a name="resolver-context-reference"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

AWS AppSync 定義一組變數和函數，以使用解析程式映射範本。這樣可讓使用 GraphQL 對資料進行邏輯運算更簡單。本文件說明這些函式，並提供範本使用範例。

## 正在存取 `$context`
<a name="accessing-the-context"></a>

`$context` 變數是一種映射，保存您的解析程式叫用的所有情境資訊。其結構如下：

```
{
   "arguments" : { ... },
   "source" : { ... },
   "result" : { ... },
   "identity" : { ... },
   "request" : { ... },
   "info": { ... }
}
```

**注意**  
如果您嘗試透過索引鍵存取字典/地圖項目 （例如 中的項目`context`) 來擷取值，則 Velocity 範本語言 (VTL) 可讓您直接使用符號 `<dictionary-element>.<key-name>`。不過，這可能不是所有案例皆適用，例如當索引鍵名稱有特殊字元 (例如，底線「\$1」)。建議您一律使用 `<dictionary-element>.get("<key-name>")` 表示法。

`$context` 映射中每個欄位的定義如下：

### `$context` 欄位
<a name="accessing-the-context-list"></a>

** `arguments` **  
包含此欄位所有 GraphQL 引數的映射。

** `identity` **  
包含有關發起人資訊的物件。如需此欄位結構的詳細資訊，請參閱[身分](#aws-appsync-resolver-context-reference-identity)。

** `source` **  
包含父欄位解析度的映射。

** `stash` **  
此 stash 是每個解析程式和函數映射範本中都會提供的「映射」。在單一個解析程式執行期間，則會存在相同的 stash 執行個體。這表示您可以使用 stash 在管道解析程式中的所有要求和回應映射範本、以及全部函數中，傳遞任意資料。此 stash 會公開與 [Java 映射](https://docs.oracle.com/javase/8/docs/api/java/util/Map.html)資料結構相同的方法。

** `result` **  
此解析程式結果的容器。此欄位僅適用於回應映射範本。  
例如，如果您要解決下列查詢`author`的欄位：  

```
query {
    getPost(id: 1234) {
        postId
        title
        content
        author {
            id
            name
        }
    }
}
```
那麼，在處理回應映射範本時，可用的完整 `$context` 變數可能是：  

```
{
  "arguments" : {
    id: "1234"
  },
  "source": {},
  "result" : {
      "postId": "1234",
      "title": "Some title",
      "content": "Some content",
      "author": {
        "id": "5678",
        "name": "Author Name"
      }
  },
  "identity" : {
      "sourceIp" : ["x.x.x.x"],
      "userArn" : "arn:aws:iam::123456789012:user/appsync",
      "accountId" : "666666666666",
      "user" : "AIDAAAAAAAAAAAAAAAAAA"
  }
}
```

** `prev.result` **  
在管道解析程式中執行任何先前操作的結果。  
如果先前的操作是管道解析程式的映射前範本，則 `$ctx.prev.result` 代表範本評估的輸出，並可供管道中的第一個函數使用。  
如果先前操作是第一個函數，則 `$ctx.prev.result` 會顯示第一個函數的輸出，並將資料提供給管道中的第二個函數。  
如果先前的操作是最後一個函數，則 `$ctx.prev.result` 代表最後一個函數的輸出，並可供管道解析程式的映射後範本使用。

** `info` **  
包含有關 GraphQL 請求資訊的物件。如需此欄位的結構，請參閱[資訊](#aws-appsync-resolver-context-reference-info)。

### Identity
<a name="aws-appsync-resolver-context-reference-identity"></a>

包含有關發起人資訊的 `identity` 區段。本節的形狀取決於 AWS AppSync API 的授權類型。

如需 AWS AppSync 安全選項的詳細資訊，請參閱[授權和身分驗證](security-authz.md#aws-appsync-security)。

** `API_KEY` 授權**  
`identity` 欄位未填入。

**`AWS_LAMBDA` 授權**  
`identity` 包含 `resolverContext`金鑰，其中包含由授權請求的 Lambda 函數傳回的相同`resolverContext`內容。

** `AWS_IAM` 授權**  
`identity` 的格式如下：  

```
{
    "accountId" : "string",
    "cognitoIdentityPoolId" : "string",
    "cognitoIdentityId" : "string",
    "sourceIp" : ["string"],
    "username" : "string", // IAM user principal
    "userArn" : "string",
    "cognitoIdentityAuthType" : "string", // authenticated/unauthenticated based on the identity type
    "cognitoIdentityAuthProvider" : "string" // the auth provider that was used to obtain the credentials
}
```

** `AMAZON_COGNITO_USER_POOLS` 授權**  
`identity` 的格式如下：  

```
{
    "sub" : "uuid",
    "issuer" : "string",
    "username" : "string"
    "claims" : { ... },
    "sourceIp" : ["x.x.x.x"],
    "defaultAuthStrategy" : "string"
}
```

每個欄位的定義如下：

** `accountId` **  
發起人 AWS 的帳戶 ID。

** `claims` **  
使用者擁有的宣告。

** `cognitoIdentityAuthType` **  
經身分驗證或未經身分驗證 (根據身分類型)。

** `cognitoIdentityAuthProvider` **  
以逗號分隔的外部身分提供者資訊清單，用於取得用於簽署請求的登入資料。

** `cognitoIdentityId` **  
發起人的 Amazon Cognito 身分 ID。

** `cognitoIdentityPoolId` **  
與發起人相關聯的 Amazon Cognito 身分集區 ID。

** `defaultAuthStrategy` **  
此發起人 (`ALLOW` 或 `DENY`) 的預設授權策略。

** `issuer` **  
字符發行者。

** `sourceIp` **  
 AWS AppSync 接收的發起人的來源 IP 地址。如果請求不包含 `x-forwarded-for`標頭，來源 IP 值只會包含來自 TCP 連線的單一 IP 地址。如果要求包含 `x-forwarded-for` 標頭，則來源 IP 除了有 TCP 連線的 IP 地址外，也將有 `x-forwarded-for` 標頭中 IP 地址的清單。

** `sub` **  
已驗證使用者的 UUID。

** `user` **  
IAM 使用者。

** `userArn` **  
IAM 使用者的 Amazon Resource Name (ARN)。

** `username` **  
已驗證使用者的使用者名稱。如果是 `AMAZON_COGNITO_USER_POOLS` 授權，*使用者名稱*的值是屬性 *cognito:username* 的值。在`AWS_IAM`授權的情況下，*使用者名稱*的值是 AWS 使用者主體的值。如果您使用 IAM 授權搭配來自 Amazon Cognito 身分集區的憑證，我們建議您使用 `cognitoIdentityId`。

### 存取請求標頭
<a name="aws-appsync-resolver-context-reference-util"></a>

AWS AppSync 支援從用戶端傳遞自訂標頭，並使用 在 GraphQL 解析程式中存取它們`$context.request.headers`。然後，您可以將 標頭值用於動作，例如將資料插入資料來源或授權檢查。您可以將 與來自命令列的 API 金鑰`$curl`搭配使用的單一或多個請求標頭，如下列範例所示：

**單一標頭範例** 

假設您設定使用 `custom` 值的 `nadia` 標頭，如下所示：

```
curl -XPOST -H "Content-Type:application/graphql" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql
```

可使用 `$context.request.headers.custom` 對此進行存取。例如，它可能位於 DynamoDB 的下列 VTL 中：

```
"custom": $util.dynamodb.toDynamoDBJson($context.request.headers.custom)
```

**多個標頭範例** 

您也可以將多個標頭傳遞到單一要求，並在解析程式映射範本中存取這些要求。例如，如果 `custom`標頭設定為兩個值：

```
curl -XPOST -H "Content-Type:application/graphql" -H "custom:bailey" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql
```

然後，您可以將這些存取為陣列，例如 `$context.request.headers.custom[1]`。

**注意**  
AWS AppSync 不會在 中公開 Cookie 標頭`$context.request.headers`。

### 存取請求自訂網域名稱
<a name="aws-access-requested-custom-domain-names"></a>

AWS AppSync 支援設定自訂網域，您可以用來存取 APIs的 GraphQL 和即時端點。使用自訂網域名稱提出請求時，您可以使用 取得網域名稱`$context.request.domainName`。

使用預設 GraphQL 端點網域名稱時，值為 `null`。

### 資訊
<a name="aws-appsync-resolver-context-reference-info"></a>

`info` 區段包含有關 GraphQL 請求的資訊。本節的格式如下：

```
{
    "fieldName": "string",
    "parentTypeName": "string",
    "variables": { ... },
    "selectionSetList": ["string"],
    "selectionSetGraphQL": "string"
}
```

每個欄位的定義如下：

** `fieldName` **  
目前正在解析的欄位名稱。

** `parentTypeName` **  
目前正在解析的欄位父類型名稱。

** `variables` **  
包含傳遞給 GraphQL 請求之所有變數的映射。

** `selectionSetList` **  
此清單表示 GraphQL 選取範圍中的欄位。別名的欄位僅由別名名稱參考，而非欄位名稱。以下範例詳細說明這一點。

** `selectionSetGraphQL` **  
此字串表示格式為 GraphQL 結構描述定義語言 (SDL) 的選取範圍。雖然片段不會合併到選取集，但會保留內嵌片段，如下列範例所示。

**注意**  
在 `$utils.toJson()`上使用 時`context.info`，預設不會序列化 `selectionSetGraphQL`和 `selectionSetList`傳回的值。

例如，如果您解析下列查詢的 `getPost` 欄位：

```
query {
  getPost(id: $postId) {
    postId
    title
    secondTitle: title
    content
    author(id: $authorId) {
      authorId
      name
    }
    secondAuthor(id: "789") {
      authorId
    }
    ... on Post {
      inlineFrag: comments: {
        id
      }
    }
    ... postFrag
  }
}

fragment postFrag on Post {
  postFrag: comments: {
    id
  }
}
```

那麼，在處理映射範本時，可用的完整 `$context.info` 變數可能是：

```
{
  "fieldName": "getPost",
  "parentTypeName": "Query",
  "variables": {
    "postId": "123",
    "authorId": "456"
  },
  "selectionSetList": [
    "postId",
    "title",
    "secondTitle"
    "content",
    "author",
    "author/authorId",
    "author/name",
    "secondAuthor",
    "secondAuthor/authorId",
    "inlineFragComments",
    "inlineFragComments/id",
    "postFragComments",
    "postFragComments/id"
  ],
  "selectionSetGraphQL": "{\n  getPost(id: $postId) {\n    postId\n    title\n    secondTitle: title\n    content\n    author(id: $authorId) {\n      authorId\n      name\n    }\n    secondAuthor(id: \"789\") {\n      authorId\n    }\n    ... on Post {\n      inlineFrag: comments {\n        id\n      }\n    }\n    ... postFrag\n  }\n}"
}
```

`selectionSetList` 只會公開屬於目前類型的欄位。如果目前類型是界面或聯集，則只會公開屬於界面的所選欄位。例如，指定下列結構描述：

```
type Query {
    node(id: ID!): Node
}

interface Node {
    id: ID
}

type Post implements Node {
    id: ID
    title: String
    author: String
}

type Blog implements Node {
    id: ID
    title: String
    category: String
}
```

以及下列查詢：

```
query {
    node(id: "post1") {
        id
        ... on Post {
            title
        }

        ... on Blog {
            title
        }
    }
}
```

`$ctx.info.selectionSetList` 以`Query.node`欄位解析度呼叫 時，只會`id`公開：

```
"selectionSetList": [
    "id"
]
```

## 處理輸入
<a name="sanitizing-inputs"></a>

應用程式必須處理不受信任的輸入，以防止任何外部方使用其預期用途之外的應用程式。由於 包含 `$context.arguments`、、`$context.info.variables`、 `$context.identity` `$context.result`和 等屬性中的`$context`使用者輸入`$context.request.headers`，因此必須小心在映射範本中淨化其值。

由於對應範本代表 JSON，輸入處理採用從表示使用者輸入的字串逸出 JSON 保留字元的形式。將敏感字串值放入對應範本時，最佳做法是使用 `$util.toJson()` 公用程式將 JSON 保留字元從敏感字串值逸出。

例如，在下列 Lambda 請求映射範本中，因為我們存取了不安全的客戶輸入字串 (`$context.arguments.id`)，因此我們使用 包裝它`$util.toJson()`，以防止未逸出的 JSON 字元破壞 JSON 範本。

```
{
    "version": "2017-02-28",
    "operation": "Invoke",
    "payload": {
        "field": "getPost",
        "postId": $util.toJson($context.arguments.id)
    }
}
```

與下面的映射範本相反，我們在其中直接插入`$context.arguments.id`而不進行淨化。這不適用於包含未逸出引號或其他 JSON 預留字元的字串，並且可能會讓您的範本處於開啟失敗狀態。

```
## DO NOT DO THIS
{
    "version": "2017-02-28",
    "operation": "Invoke",
    "payload": {
        "field": "getPost",
        "postId": "$context.arguments.id" ## Unsafe! Do not insert $context string values without escaping JSON characters.
    }
}
```

# AWS AppSync 解析程式映射範本公用程式參考
<a name="resolver-util-reference"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

AWS AppSync 定義一組公用程式，您可以在 GraphQL 解析程式中用來簡化與資料來源的互動。其中一些公用程式用於任何資料來源的一般用途，例如產生 IDs 或時間戳記。其他則是特定於一種資料來源類型。下列公用程式可供使用：
+  [ \$1util 中的公用程式協助程式 ](https://docs.aws.amazon.com/appsync/latest/devguide/utility-helpers-in-util.html) - \$1util 變數包含一般公用程式方法，可協助您處理資料。除非另行指定，否則所有公用程式皆使用 UTF-8 字元集。
+ [ AppSync 指令](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-directives.html) - AppSync 公開指令，以促進開發人員在 VTL 中寫入時的生產力。
+  [ \$1util.time 中的時間協助程式 ](https://docs.aws.amazon.com/appsync/latest/devguide/time-helpers-in-util-time.html) - \$1util.time 變數包含日期時間方法，可協助產生時間戳記、在日期時間格式之間轉換，以及剖析日期時間字串。日期時間格式的語法是以 [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) 為基礎，您可以參考以取得進一步的文件。
+ 在[ \$1util.list 中列出協助程式 ](https://docs.aws.amazon.com/appsync/latest/devguide/list-helpers-in-util-list.html) - \$1util.list 包含有助於常見清單操作的方法，例如從清單中移除或保留項目以篩選使用案例。
+  [ \$1util.map - \$1util.map 中的映射協助程式](https://docs.aws.amazon.com/appsync/latest/devguide/utility-helpers-in-map.html)包含有助於常見映射操作的方法，例如從映射中移除或保留項目以篩選使用案例。
+  [ \$1util.dynamodb - \$1util.dynamodb 中的 DynamoDB 協助程式](https://docs.aws.amazon.com/appsync/latest/devguide/dynamodb-helpers-in-util-dynamodb.html)包含協助程式方法，可讓您更輕鬆地將資料寫入和讀取至 Amazon DynamoDB，例如自動類型映射和格式化。
+  [ \$1util.rds - \$1util.rds 中的 Amazon RDS 協助程式](https://docs.aws.amazon.com/appsync/latest/devguide/rds-helpers-in-util-rds.html)包含協助程式方法，可透過消除結果輸出中的外部資料來格式化 RDS 操作。
+  [ \$1util.http 中的 HTTP 協助程式 ](https://docs.aws.amazon.com/appsync/latest/devguide/http-helpers-in-utils-http.html) - \$1util.http 公用程式提供可用於管理 HTTP 請求參數和新增回應標頭的協助程式方法。
+  [ \$1util.xml - \$1util.xml 中的 XML 協助程式](https://docs.aws.amazon.com/appsync/latest/devguide/xml-helpers-in-utils-xml.html)包含協助程式方法，可讓您更輕鬆地將 XML 回應轉譯為 JSON 或字典。
+  [ \$1util.transform 中的轉換協助程式 ](https://docs.aws.amazon.com/appsync/latest/devguide/transformation-helpers-in-utils-transform.html) - \$1util.transform 包含協助程式方法，可讓您更輕鬆地對資料來源執行複雜的操作，例如 DynamoDB 篩選操作。
+  [ \$1util.math - \$1util.math 中的數學協助程式](https://docs.aws.amazon.com/appsync/latest/devguide/math-helpers-in-util-math.html)包含有助於常見數學操作的方法。
+  [ \$1util.str 中的字串協助程式 ](https://docs.aws.amazon.com/appsync/latest/devguide/str-helpers-in-util-str.html) - \$1util.str 包含有助於常見字串操作的方法。
+  [ 延伸 ](https://docs.aws.amazon.com/appsync/latest/devguide/extensions.html)- \$1extensions 包含一組方法，可在解析程式中執行其他動作。

# \$1util 中的公用程式協助程式
<a name="utility-helpers-in-util"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

`$util` 變數包含可協助您處理資料的一般公用程式方法。除非另行指定，否則所有公用程式皆使用 UTF-8 字元集。

## JSON 剖析公用程式
<a name="utility-helpers-in-json-parsing"></a>

### JSON 剖析 utils 清單
<a name="utility-helpers-in-json-parsing-list"></a>

** **`$util.parseJson(String) : Object`** **  
採用「字串化」JSON，並傳回結果的物件呈現。

** **`$util.toJson(Object) : String`** **  
採用物件，並傳回該物件的「字串化」JSON 呈現。

## 編碼 utils
<a name="utility-helpers-in-encoding"></a>

### 編碼 utils 清單
<a name="utility-helpers-in-encoding-list"></a>

** **`$util.urlEncode(String) : String`** **  
以 `application/x-www-form-urlencoded` 編碼字串的形式傳回輸入字串。

** **`$util.urlDecode(String) : String`** **  
將 `application/x-www-form-urlencoded` 編碼的字串解碼回非編碼格式。

** **`$util.base64Encode( byte[] ) : String`** **  
將輸入編碼為 base64 編碼字串。

** **`$util.base64Decode(String) : byte[]`** **  
解碼 base64 編碼字串中的資料。

## ID 產生 utils
<a name="utility-helpers-in-id-gen"></a>

### ID 產生 utils 清單
<a name="utility-helpers-in-id-gen-list"></a>

** **`$util.autoId() : String`** **  
傳回 128 位元隨機產生的 UUID。

****`$util.autoUlid() : String`****  
傳回 128 位元隨機產生的 ULID （通用可排序序列識別符）。

****`$util.autoKsuid() : String`****  
傳回 128 位元隨機產生的 KSUID (K-Sortable Unique Identifier) base62，其編碼為長度為 27 的字串。

## 錯誤率
<a name="utility-helpers-in-error"></a>

### 錯誤使用率清單
<a name="utility-helpers-in-error-list"></a>

** `$util.error(String)` **  
擲回自訂錯誤。在請求或回應映射範本中使用此參數來偵測請求或調用結果的錯誤。

** `$util.error(String, String)` **  
擲回自訂錯誤。在請求或回應映射範本中使用此參數來偵測請求或調用結果的錯誤。您也可以指定 `errorType`。

** `$util.error(String, String, Object)` **  
擲回自訂錯誤。在請求或回應映射範本中使用此參數來偵測請求或調用結果的錯誤。您也可以指定 `errorType`和 `data` 欄位。`data` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。  
`data` 將根據查詢選取集進行篩選。

** `$util.error(String, String, Object, Object)` **  
擲回自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。此外，也可以指定 `errorType` 欄位、 `data` 欄位和 `errorInfo` 欄位。`data` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。  
`data` 將根據查詢選取集進行篩選。`errorInfo` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。  
`errorInfo` **將不會**根據查詢選取集進行篩選。

** `$util.appendError(String)` **  
附加自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。與 `$util.error(String)` 不同的是，範本評估不會受中斷，因此可以將資料傳回給發起人。

** `$util.appendError(String, String)` **  
附加自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。您同時可以指定 `errorType`。與 `$util.error(String, String)` 不同的是，範本評估不會受中斷，因此可以將資料傳回給發起人。

** `$util.appendError(String, String, Object)` **  
附加自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。您同時可以指定 `errorType` 和 `data` 欄位。與 `$util.error(String, String, Object)` 不同的是，範本評估不會受中斷，因此可以將資料傳回給發起人。`data` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。  
`data` 將根據查詢選取集進行篩選。

** `$util.appendError(String, String, Object, Object)` **  
附加自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。此外，也可以指定 `errorType` 欄位、 `data` 欄位和 `errorInfo` 欄位。與 `$util.error(String, String, Object, Object)` 不同的是，範本評估不會受中斷，因此可以將資料傳回給發起人。`data` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。  
`data` 將根據查詢選取集進行篩選。`errorInfo` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。  
`errorInfo` **將不會**根據查詢選取集進行篩選。

## 條件驗證公用程式
<a name="utility-helpers-in-condition"></a>

### 條件驗證使用率清單
<a name="utility-helpers-in-condition-list"></a>

** `$util.validate(Boolean, String) : void` **  
如果條件為假，會擲回含指定訊息的 CustomTemplateException。

** `$util.validate(Boolean, String, String) : void` **  
如果條件為假，會擲回含指定訊息和錯誤類型的 CustomTemplateException。

** `$util.validate(Boolean, String, String, Object) : void` **  
如果條件為假，會擲回含指定訊息、錯誤類型以及在回應中回傳之資料的 CustomTemplateException。

## Null 行為 utils
<a name="utility-helpers-in-null-behavior"></a>

### Null 行為利用率清單
<a name="utility-helpers-in-null-behavior-list"></a>

** `$util.isNull(Object) : Boolean` **  
如果提供物件為 null，則傳回真。

** `$util.isNullOrEmpty(String) : Boolean` **  
如果提供資料為 null 或空白字串，則傳回真。否則即傳回 false。

** `$util.isNullOrBlank(String) : Boolean` **  
如果提供資料為 null 或空白字串，則傳回真。否則即傳回 false。

** `$util.defaultIfNull(Object, Object) : Object` **  
如果不是 null，則傳回第一個物件。否則，會傳回第二個物件做為「預設物件」。

** `$util.defaultIfNullOrEmpty(String, String) : String` **  
如果不是 null 或空白，則傳回第一個字串。否則，會傳回第二個字串做為「預設字串」。

** `$util.defaultIfNullOrBlank(String, String) : String` **  
如果不是 null 或空白，則傳回第一個字串。否則，會傳回第二個字串做為「預設字串」。

## 模式比對 utils
<a name="utility-helpers-in-pattern-matching"></a>

### 類型和模式比對 utils 清單
<a name="utility-helpers-in-type-pattern-matching-list"></a>

** `$util.typeOf(Object) : String` **  
傳回描述物件類型的字串。支援的類型識別為：「Null」、「數字」、「字串」、「映射」、「清單」、「布林值」。如果無法識別類型，則傳回類型為「物件」。

** `$util.matches(String, String) : Boolean` **  
如果第一個引數中指定的模式與第二個引數中提供的資料相符，則傳回真。模式必須為規則表達式，例如 `$util.matches("a*b", "aaaaab")`。此功能是根據[模式](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html)，您可以參考以取得更詳細的文件。

** `$util.authType() : String` **  
傳回描述請求所使用之多重身分類型的字串，傳回「IAM 授權」、「使用者集區授權」、「開放 ID Connect 授權」或「API 金鑰授權」。

## 物件驗證公用程式
<a name="utility-helpers-in-object-validation"></a>

### 物件驗證公用程式清單
<a name="utility-helpers-in-object-validation-list"></a>

** `$util.isString(Object) : Boolean` **  
如果物件是字串，則傳回 true。

** `$util.isNumber(Object) : Boolean` **  
如果物件是數字，則傳回 true。

** `$util.isBoolean(Object) : Boolean` **  
如果物件是布林值，則傳回 true。

** `$util.isList(Object) : Boolean` **  
如果物件是清單，則傳回 true。

** `$util.isMap(Object) : Boolean` **  
如果物件是映射，則傳回 true。

## CloudWatch 記錄公用程式
<a name="utility-helpers-in-logging"></a>

### CloudWatch 記錄公用程式清單
<a name="utility-helpers-in-cloudwatch-logs"></a>

**`$util.log.info(Object) : Void`**  
在 API `DEBUG`上使用日誌層級 `INFO`、 或 啟用請求層級和欄位層級 CloudWatch 記錄時`ALL`，將所提供物件的字串表示法記錄到請求的日誌串流。

**`$util.log.info(String, Object...) : Void`**  
在 API `ALL`上使用日誌層級啟用請求層級和欄位層級 CloudWatch 記錄時，將所提供物件的字串表示法記錄到請求的日誌串流。此公用程式會依序將第一個輸入格式字串中「\$1\$1」指示的所有變數取代為所提供物件的字串表示法。

**`$util.log.debug(Object) : Void`**  
使用日誌層級`ALL`或在 API `DEBUG`上啟用請求層級和欄位層級 CloudWatch 記錄時，將所提供物件的字串表示法記錄到請求的日誌串流。

**`$util.log.debug(String, Object...) : Void`**  
使用 API 上的日誌層級`DEBUG`或日誌層級啟用欄位層級 CloudWatch 記錄時，將所提供物件的字串表示法記錄到請求`ALL`的日誌串流。此公用程式會依序將第一個輸入格式字串中「\$1\$1」指示的所有變數取代為所提供物件的字串表示法。

**`$util.log.error(Object) : Void`**  
在 API 上以**任何**日誌層級 (`ALL`、`DEBUG`、 等） 啟用欄位層級 CloudWatch 記錄時`INFO`，將所提供物件的字串表示記錄到請求的日誌串流。

**`$util.log.error(String, Object...) : Void`**  
使用 API 上的日誌層級`ERROR`或日誌層級啟用欄位層級 CloudWatch 記錄時，將所提供物件的字串表示法記錄到請求`ALL`的日誌串流。此公用程式會依序將第一個輸入格式字串中「\$1\$1」指示的所有變數取代為所提供物件的字串表示法。

## 傳回值行為 utils
<a name="utility-helpers-in-return-behavior"></a>

### 傳回值行為 utils 清單
<a name="utility-helpers-in-behavior-list"></a>

****`$util.qr()`** 和 `$util.quiet()` **  
執行 VTL 陳述式，同時隱藏傳回的值。這適用於執行方法而不使用臨時預留位置，例如將項目新增至地圖。例如：  

```
#set ($myMap = {})
#set($discard = $myMap.put("id", "first value"))
```
變成：  

```
#set ($myMap = {})
$util.qr($myMap.put("id", "first value"))
```  
** `$util.escapeJavaScript(String) : String` **  
以 JavaScript 逸出字串傳回輸入字串。  
** `$util.urlEncode(String) : String` **  
以 `application/x-www-form-urlencoded` 編碼字串的形式傳回輸入字串。  
** `$util.urlDecode(String) : String` **  
將 `application/x-www-form-urlencoded` 編碼的字串解碼回非編碼格式。  
** `$util.base64Encode( byte[] ) : String` **  
將輸入編碼為 base64 編碼字串。  
** `$util.base64Decode(String) : byte[]` **  
解碼 base64 編碼字串中的資料。  
** `$util.parseJson(String) : Object` **  
採用「字串化」JSON，並傳回結果的物件呈現。  
** `$util.toJson(Object) : String` **  
採用物件，並傳回該物件的「字串化」JSON 呈現。  
** `$util.autoId() : String` **  
傳回 128 位元隨機產生的 UUID。  
****`$util.autoUlid() : String`****  
傳回 128 位元隨機產生的 ULID （通用可排序序列識別符）。  
****`$util.autoKsuid() : String`****  
傳回 128 位元隨機產生的 KSUID (K-Sortable Unique Identifier) base62，其編碼為長度為 27 的字串。  
** `$util.unauthorized()` **  
擲回欲解析之欄位的 `Unauthorized`。在請求或回應映射範本中使用此選項，以決定是否允許發起人解析 欄位。  
** `$util.error(String)` **  
擲回自訂錯誤。在請求或回應映射範本中使用此參數來偵測請求或調用結果的錯誤。  
** `$util.error(String, String)` **  
擲回自訂錯誤。在請求或回應映射範本中使用此參數來偵測請求或調用結果的錯誤。您也可以指定 `errorType`。  
** `$util.error(String, String, Object)` **  
擲回自訂錯誤。在請求或回應映射範本中使用此參數來偵測請求或調用結果的錯誤。您也可以指定 `errorType`和 `data` 欄位。`data` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。**注意**：`data` 將根據查詢選取範圍集進行篩選。  
** `$util.error(String, String, Object, Object)` **  
擲回自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。您同時可以指定 `errorType` 欄位、`data` 欄位和 `errorInfo` 欄位。`data` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。**注意**：`data` 將根據查詢選取範圍集進行篩選。`errorInfo` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。**注意**：`errorInfo` 將**不會**根據查詢選取範圍集進行篩選。  
** `$util.appendError(String)` **  
附加自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。與 `$util.error(String)` 不同的是，範本評估不會受中斷，因此可以將資料傳回給發起人。  
** `$util.appendError(String, String)` **  
附加自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。您同時可以指定 `errorType`。與 `$util.error(String, String)` 不同的是，範本評估不會受中斷，因此可以將資料傳回給發起人。  
** `$util.appendError(String, String, Object)` **  
附加自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。您同時可以指定 `errorType` 和 `data` 欄位。與 `$util.error(String, String, Object)` 不同的是，範本評估不會受中斷，因此可以將資料傳回給發起人。`data` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。**注意**：`data` 將根據查詢選取範圍集進行篩選。  
** `$util.appendError(String, String, Object, Object)` **  
附加自訂錯誤。如果範本偵測到要求或呼叫結果的錯誤，您可以將此用於要求或回應映射範本。您同時可以指定 `errorType` 欄位、`data` 欄位和 `errorInfo` 欄位。與 `$util.error(String, String, Object, Object)` 不同的是，範本評估不會受中斷，因此可以將資料傳回給發起人。`data` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。**注意**：`data` 將根據查詢選取範圍集進行篩選。`errorInfo` 值將新增到 GraphQL 回應中，`error` 內對應的 `errors` 區塊。**注意**：`errorInfo` 將**不會**根據查詢選取範圍集進行篩選。  
** `$util.validate(Boolean, String) : void` **  
如果條件為假，會擲回含指定訊息的 CustomTemplateException。  
** `$util.validate(Boolean, String, String) : void` **  
如果條件為假，會擲回含指定訊息和錯誤類型的 CustomTemplateException。  
** `$util.validate(Boolean, String, String, Object) : void` **  
如果條件為假，會擲回含指定訊息、錯誤類型以及在回應中回傳之資料的 CustomTemplateException。  
** `$util.isNull(Object) : Boolean` **  
如果提供物件為 null，則傳回真。  
** `$util.isNullOrEmpty(String) : Boolean` **  
如果提供資料為 null 或空白字串，則傳回真。否則即傳回 false。  
** `$util.isNullOrBlank(String) : Boolean` **  
如果提供資料為 null 或空白字串，則傳回真。否則即傳回 false。  
** `$util.defaultIfNull(Object, Object) : Object` **  
如果不是 null，則傳回第一個物件。否則，會傳回第二個物件做為「預設物件」。  
** `$util.defaultIfNullOrEmpty(String, String) : String` **  
如果不是 null 或空白，則傳回第一個字串。否則，會傳回第二個字串做為「預設字串」。  
** `$util.defaultIfNullOrBlank(String, String) : String` **  
如果不是 null 或空白，則傳回第一個字串。否則，會傳回第二個字串做為「預設字串」。  
** `$util.isString(Object) : Boolean` **  
如果物件是字串，則傳回真。  
** `$util.isNumber(Object) : Boolean` **  
如果物件是數字，則傳回真。  
** `$util.isBoolean(Object) : Boolean` **  
如果物件是布林值，則傳回真。  
** `$util.isList(Object) : Boolean` **  
如果物件是清單，則傳回真。  
** `$util.isMap(Object) : Boolean` **  
如果物件是映射，則傳回真。  
** `$util.typeOf(Object) : String` **  
傳回描述物件類型的字串。支援的類型識別為：「Null」、「數字」、「字串」、「映射」、「清單」、「布林值」。如果無法識別類型，則傳回類型為「物件」。  
** `$util.matches(String, String) : Boolean` **  
如果第一個引數中指定的模式與第二個引數中提供的資料相符，則傳回真。模式必須為規則表達式，例如 `$util.matches("a*b", "aaaaab")`。此功能是根據[模式](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html)，您可以參考以取得更詳細的文件。  
** `$util.authType() : String` **  
傳回描述請求所使用之多重身分類型的字串，傳回「IAM 授權」、「使用者集區授權」、「開放 ID Connect 授權」或「API 金鑰授權」。  
****`$util.log.info(Object) : Void`****  
在 API `ALL`上使用日誌層級啟用請求層級和欄位層級 CloudWatch 記錄時，將所提供物件的字串表示記錄到請求的日誌串流。  
****`$util.log.info(String, Object...) : Void`****  
在 API `ALL`上使用日誌層級啟用請求層級和欄位層級 CloudWatch 記錄時，將所提供物件的字串表示法記錄到請求的日誌串流。此公用程式會依序將第一個輸入格式字串中「\$1\$1」指示的所有變數取代為所提供物件的字串表示法。  
****`$util.log.error(Object) : Void`****  
使用 API 上的日誌層級`ERROR`或日誌層級啟用欄位層級 CloudWatch 記錄時，將所提供物件的字串表示法記錄到請求`ALL`的日誌串流。  
****`$util.log.error(String, Object...) : Void`****  
使用 API 上的日誌層級`ERROR`或日誌層級啟用欄位層級 CloudWatch 記錄時，將所提供物件的字串表示法記錄到請求`ALL`的日誌串流。此公用程式會依序將第一個輸入格式字串中「\$1\$1」指示的所有變數取代為所提供物件的字串表示法。

** `$util.escapeJavaScript(String) : String` **  
以 JavaScript 逸出字串傳回輸入字串。

## 解析程式授權
<a name="utility-helpers-in-resolver-auth"></a>

### 解析程式授權清單
<a name="utility-helpers-in-resolver-auth-list"></a>

** `$util.unauthorized()` **  
擲回欲解析之欄位的 `Unauthorized`。在請求或回應映射範本中使用此選項，以決定是否允許發起人解析 欄位。

# AWS AppSync 指令
<a name="aws-appsync-directives"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

AWS AppSync 公開指令，以促進開發人員在 VTL 中寫入時的生產力。

## 指令 utils
<a name="utility-helpers-in-directives"></a>

****`#return(Object)`****  
`#return(Object)` 可讓您從任何映射範本提早傳回 。 `#return(Object)` 類似於程式設計語言的*傳回*關鍵字，因為它將從邏輯的最接近範圍區塊傳回。在解析程式映射範本`#return(Object)`內部使用 會從解析程式傳回 。此外，`#return(Object)`從函數映射範本使用 會從函數傳回，並繼續執行到管道中的下一個函數或解析程式回應映射範本。

****`#return`****  
`#return` 指令會呈現與 相同的行為`#return(Object)`，但`null`會改為傳回。

# \$1util.time 中的時間協助程式
<a name="time-helpers-in-util-time"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

`$util.time` 變數包含日期時間方法，可協助產生時間戳記、在日期時間格式之間轉換，以及剖析日期時間字串。日期時間格式的語法是根據 [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)，您可以參考以取得更詳細的文件。我們提供以下一些範例，以及可用方法和描述的清單。

## 時間 utils
<a name="utility-helpers-in-time"></a>

### 時間使用率清單
<a name="utility-helpers-in-time-list"></a>

** `$util.time.nowISO8601() : String` **  
以 [ISO8601 格式](https://en.wikipedia.org/wiki/ISO_8601)傳回 UTC 的字串表示方式。

** `$util.time.nowEpochSeconds() : long` **  
傳回從 1970-01-01T00:00:00Z 的 epoch 到現在的秒數。

** `$util.time.nowEpochMilliSeconds() : long` **  
傳回從 1970-01-01T00:00:00Z 的 epoch 到現在的毫秒數。

** `$util.time.nowFormatted(String) : String` **  
使用字串輸入類型的指定格式，傳回 UTC 中目前時間戳記的字串。

** `$util.time.nowFormatted(String, String) : String` **  
使用字串輸入類型的指定格式和時區，傳回時區目前時間戳記的字串。

** `$util.time.parseFormattedToEpochMilliSeconds(String, String) : Long` **  
剖析以字串形式傳遞的時間戳記，以及包含時區的格式，然後傳回自 epoch 以來以毫秒為單位的時間戳記。

** `$util.time.parseFormattedToEpochMilliSeconds(String, String, String) : Long` **  
剖析以字串形式傳遞的時間戳記，以及格式和時區，然後以毫秒為單位傳回自 epoch 以來的時間戳記。

** `$util.time.parseISO8601ToEpochMilliSeconds(String) : Long` **  
剖析以字串形式傳遞的 ISO8601 時間戳記，然後將時間戳記傳回為自 epoch 以來的毫秒。

** `$util.time.epochMilliSecondsToSeconds(long) : long` **  
將 epoch 毫秒時間戳記轉換為 epoch 秒時間戳記。

** `$util.time.epochMilliSecondsToISO8601(long) : String` **  
將 epoch 毫秒時間戳記轉換為 ISO8601 時間戳記。

** `$util.time.epochMilliSecondsToFormatted(long, String) : String` **  
將 epoch 毫秒時間戳記轉換為根據 UTC 格式提供的時間戳記。

** `$util.time.epochMilliSecondsToFormatted(long, String, String) : String` **  
將長傳遞的 epoch 毫秒時間戳記轉換為根據所提供時區中提供的格式格式化的時間戳記。

## 獨立函數範例
<a name="standalone-function-examples"></a>

```
$util.time.nowISO8601()                                            : 2018-02-06T19:01:35.749Z
$util.time.nowEpochSeconds()                                       : 1517943695
$util.time.nowEpochMilliSeconds()                                  : 1517943695750
$util.time.nowFormatted("yyyy-MM-dd HH:mm:ssZ")                    : 2018-02-06 19:01:35+0000
$util.time.nowFormatted("yyyy-MM-dd HH:mm:ssZ", "+08:00")          : 2018-02-07 03:01:35+0800
$util.time.nowFormatted("yyyy-MM-dd HH:mm:ssZ", "Australia/Perth") : 2018-02-07 03:01:35+0800
```

## 轉換範例
<a name="conversion-examples"></a>

```
#set( $nowEpochMillis = 1517943695758 )
$util.time.epochMilliSecondsToSeconds($nowEpochMillis)                                     : 1517943695
$util.time.epochMilliSecondsToISO8601($nowEpochMillis)                                     : 2018-02-06T19:01:35.758Z
$util.time.epochMilliSecondsToFormatted($nowEpochMillis, "yyyy-MM-dd HH:mm:ssZ")           : 2018-02-06 19:01:35+0000
$util.time.epochMilliSecondsToFormatted($nowEpochMillis, "yyyy-MM-dd HH:mm:ssZ", "+08:00") : 2018-02-07 03:01:35+0800
```

## 剖析範例
<a name="parsing-examples"></a>

```
$util.time.parseISO8601ToEpochMilliSeconds("2018-02-01T17:21:05.180+08:00")                          : 1517476865180
$util.time.parseFormattedToEpochMilliSeconds("2018-02-02 01:19:22+0800", "yyyy-MM-dd HH:mm:ssZ")     : 1517505562000
$util.time.parseFormattedToEpochMilliSeconds("2018-02-02 01:19:22", "yyyy-MM-dd HH:mm:ss", "+08:00") : 1517505562000
```

## 使用已 AWS AppSync 定義的純量
<a name="usage-with-aws-scalars"></a>

以下格式與 `AWSDate`、`AWSDateTime` 和 `AWSTime` 相容。

```
$util.time.nowFormatted("yyyy-MM-dd[XXX]", "-07:00:30")               : 2018-07-11-07:00
$util.time.nowFormatted("yyyy-MM-dd'T'HH:mm:ss[XXXXX]", "-07:00:30")  : 2018-07-11T15:14:15-07:00:30
```

# 在 \$1util.list 中列出協助程式
<a name="list-helpers-in-util-list"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

`$util.list` 包含有助於常見清單操作的方法，例如從清單中移除或保留項目以篩選使用案例。

## 列出 utils
<a name="utility-helpers-in-list-utils"></a>

** `$util.list.copyAndRetainAll(List, List) : List` **  
製作第一個引數中所提供清單的淺層副本，如果項目存在，則僅保留第二個引數中指定的項目。所有其他項目將從副本中刪除。

** `$util.list.copyAndRemoveAll(List, List) : List` **  
製作第一個引數中所提供清單的淺層副本，同時移除在第二個引數中指定項目的任何項目，如果有的話。所有其他項目將保留在副本中。

** `$util.list.sortList(List, Boolean, String) : List` **  
排序在第一個引數中提供的物件清單。如果第二個引數為 true，清單會以遞減方式排序；如果第二個引數為 false，清單會以遞增方式排序。第三個引數是用來排序自訂物件清單的 屬性字串名稱。如果只是字串、整數、浮點數或雙數的清單，則第三個引數可以是任何隨機字串。如果所有物件不是來自相同類別，則會傳回原始清單。僅支援最多包含 1000 個物件的清單。以下是此公用程式使用的範例：  

```
 INPUT:      $util.list.sortList([{"description":"youngest", "age":5},{"description":"middle", "age":45}, {"description":"oldest", "age":85}], false, "description")
 OUTPUT:     [{"description":"middle", "age":45}, {"description":"oldest", "age":85}, {"description":"youngest", "age":5}]
```

# 在 \$1util.map 中映射協助程式
<a name="utility-helpers-in-map"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

 `$util.map` 包含有助於常見 Map 操作的方法，例如從 Map 中移除或保留項目，以篩選使用案例。

## 映射 utils
<a name="utility-helpers-in-map-list"></a>

** `$util.map.copyAndRetainAllKeys(Map, List) : Map` **  
製作第一個映射的淺層副本，同時只保留清單中指定的索引鍵，如果它們存在的話。所有其他金鑰將從副本中刪除。

** `$util.map.copyAndRemoveAllKeys(Map, List) : Map` **  
在移除清單中指定金鑰的任何項目時，製作第一個映射的淺層副本，如果有的話。所有其他金鑰將保留在副本中。

# \$1util.dynamodb 中的 DynamoDB 協助程式
<a name="dynamodb-helpers-in-util-dynamodb"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

`$util.dynamodb` 包含協助程式方法，可讓您更輕鬆地將資料寫入和讀取至 Amazon DynamoDB，例如自動類型映射和格式化。這些方法旨在將基本類型和清單自動映射至適當的 DynamoDB 輸入格式，這是 格式`Map`的 `{ "TYPE" : VALUE }`。

例如，先前在 DynamoDB 中建立新項目的請求映射範本可能如下所示：

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "id" : { "S" : "$util.autoId()" }
    },
    "attributeValues" : {
         "title" : { "S" : $util.toJson($ctx.args.title) },
         "author" : { "S" : $util.toJson($ctx.args.author) },
         "version" : { "N", $util.toJson($ctx.args.version) }
    }
}
```

如果我們想要將欄位新增到物件，必須在結構描述中更新 GraphQL 查詢和要求映射範本。不過，我們現在可以重組請求映射範本，讓它自動挑選在我們的結構描述中新增的新欄位，並將它們新增至具有正確類型的 DynamoDB：

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "id" : $util.dynamodb.toDynamoDBJson($util.autoId())
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}
```

在先前的範例中，我們使用`$util.dynamodb.toDynamoDBJson(...)`協助程式自動取得產生的 ID，並將其轉換為字串屬性的 DynamoDB 表示法。然後，我們採用所有引數並將其轉換為其 DynamoDB 表示法，並將其輸出至範本中的 `attributeValues` 欄位。

每個協助程式有兩個版本：傳回物件的版本 (例如，`$util.dynamodb.toString(...)`)，以及傳回物件做為 JSON 字串的版本 (例如，`$util.dynamodb.toStringJson(...)`)。在前述範例中，我們使用傳回資料做為 JSON 字串的版本。如果您想要在範本使用物件之前，對物件進行操作，可以選擇傳回物件，如下所示：

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "id" : $util.dynamodb.toDynamoDBJson($util.autoId())
    },

    #set( $myFoo = $util.dynamodb.toMapValues($ctx.args) )
    #set( $myFoo.version = $util.dynamodb.toNumber(1) )
    #set( $myFoo.timestamp = $util.dynamodb.toString($util.time.nowISO8601()))

    "attributeValues" : $util.toJson($myFoo)
}
```

在前述範例中，我們傳回轉換引數做為映射而非 JSON 字串，然後在使用 `version` 將其輸出到範本的 `timestamp` 欄位之前，新增 `attributeValues` 和 `$util.toJson(...)` 欄位。

每個 JSON 版本的協助程式等同於以 `$util.toJson(...)` 包裝非 JSON 版本。例如，下列陳述式完全相同：

```
$util.toStringJson("Hello, World!")
$util.toJson($util.toString("Hello, World!"))
```

## toDynamoDB
<a name="utility-helpers-in-toDynamoDB"></a>

### toDynamoDB 公用程式清單
<a name="utility-helpers-in-toDynamoDB-list"></a>

** `$util.dynamodb.toDynamoDB(Object) : Map` **  
DynamoDB 的一般物件轉換工具，可將輸入物件轉換為適當的 DynamoDB 表示法。它在代表一些類型的方式上是固定的：例如，它會使用清單 (「L」) 而不是集合 (「SS」、「NS」、「BS」)。這會傳回描述 DynamoDB 屬性值的物件。  
**字串範例**  

```
Input:      $util.dynamodb.toDynamoDB("foo")
Output:     { "S" : "foo" }
```
**數字範例**  

```
Input:      $util.dynamodb.toDynamoDB(12345)
Output:     { "N" : 12345 }
```
**布林值範例**  

```
Input:      $util.dynamodb.toDynamoDB(true)
Output:     { "BOOL" : true }
```
**清單範例**  

```
Input:      $util.dynamodb.toDynamoDB([ "foo", 123, { "bar" : "baz" } ])
Output:     {
               "L" : [
                   { "S" : "foo" },
                   { "N" : 123 },
                   {
                       "M" : {
                           "bar" : { "S" : "baz" }
                       }
                   }
               ]
           }
```
**地圖範例**  

```
Input:      $util.dynamodb.toDynamoDB({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "M" : {
                   "foo"  : { "S" : "bar" },
                   "baz"  : { "N" : 1234 },
                   "beep" : {
                       "L" : [
                           { "S" : "boop" }
                       ]
                   }
               }
           }
```

****`$util.dynamodb.toDynamoDBJson(Object) : String`** **  
與 相同`$util.dynamodb.toDynamoDB(Object) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

## toString utils
<a name="utility-helpers-in-toString"></a>

### toString utils 清單
<a name="utility-helpers-in-toString-list"></a>

****`$util.dynamodb.toString(String) : String`** **  
將輸入字串轉換為 DynamoDB 字串格式。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toString("foo")
Output:     { "S" : "foo" }
```

** `$util.dynamodb.toStringJson(String) : Map` **  
與 相同`$util.dynamodb.toString(String) : String`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

** `$util.dynamodb.toStringSet(List<String>) : Map` **  
將具有字串的清單轉換為 DynamoDB 字串集格式。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toStringSet([ "foo", "bar", "baz" ])
Output:     { "SS" : [ "foo", "bar", "baz" ] }
```

** `$util.dynamodb.toStringSetJson(List<String>) : String` **  
與 相同`$util.dynamodb.toStringSet(List<String>) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

## toNumber utils
<a name="utility-helpers-in-toNumber"></a>

### toNumber utils 清單
<a name="utility-helpers-in-toNumber-list"></a>

** `$util.dynamodb.toNumber(Number) : Map` **  
將數字轉換為 DynamoDB 數字格式。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toNumber(12345)
Output:     { "N" : 12345 }
```

** `$util.dynamodb.toNumberJson(Number) : String` **  
與 相同`$util.dynamodb.toNumber(Number) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

** `$util.dynamodb.toNumberSet(List<Number>) : Map` **  
將數字清單轉換為 DynamoDB 數字集格式。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toNumberSet([ 1, 23, 4.56 ])
Output:     { "NS" : [ 1, 23, 4.56 ] }
```

** `$util.dynamodb.toNumberSetJson(List<Number>) : String` **  
與 相同`$util.dynamodb.toNumberSet(List<Number>) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

## toBinary utils
<a name="utility-helpers-in-toBinary"></a>

### toBinary utils 清單
<a name="utility-helpers-in-toBinary-list"></a>

** `$util.dynamodb.toBinary(String) : Map` **  
將編碼為 base64 字串的二進位資料轉換為 DynamoDB 二進位格式。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toBinary("foo")
Output:     { "B" : "foo" }
```

** `$util.dynamodb.toBinaryJson(String) : String` **  
與 相同`$util.dynamodb.toBinary(String) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

** `$util.dynamodb.toBinarySet(List<String>) : Map` **  
將編碼為 base64 字串的二進位資料清單轉換為 DynamoDB 二進位集格式。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toBinarySet([ "foo", "bar", "baz" ])
Output:     { "BS" : [ "foo", "bar", "baz" ] }
```

** `$util.dynamodb.toBinarySetJson(List<String>) : String` **  
與 相同`$util.dynamodb.toBinarySet(List<String>) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

## toBoolean utils
<a name="utility-helpers-in-toBoolean"></a>

### toBoolean utils 清單
<a name="utility-helpers-in-toBoolean-list"></a>

** `$util.dynamodb.toBoolean(Boolean) : Map` **  
將布林值轉換為適當的 DynamoDB 布林值格式。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toBoolean(true)
Output:     { "BOOL" : true }
```

** `$util.dynamodb.toBooleanJson(Boolean) : String` **  
與 相同`$util.dynamodb.toBoolean(Boolean) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

## toNull utils
<a name="utility-helpers-in-toNull"></a>

### toNull utils 清單
<a name="utility-helpers-in-toNull-list"></a>

** `$util.dynamodb.toNull() : Map` **  
以 DynamoDB null 格式傳回 null。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toNull()
Output:     { "NULL" : null }
```

** `$util.dynamodb.toNullJson() : String` **  
與 相同`$util.dynamodb.toNull() : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

## toList utils
<a name="utility-helpers-in-toList"></a>

### toList 公用程式清單
<a name="utility-helpers-in-toList-list"></a>

****`$util.dynamodb.toList(List) : Map`** **  
將物件清單轉換為 DynamoDB 清單格式。清單中的每個項目也會轉換為適當的 DynamoDB 格式。它在代表一些巢狀物件的方式上是固定的：例如，它會使用清單 (「L」) 而不是集合 (「SS」、「NS」、「BS」)。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toList([ "foo", 123, { "bar" : "baz" } ])
Output:     {
               "L" : [
                   { "S" : "foo" },
                   { "N" : 123 },
                   {
                       "M" : {
                           "bar" : { "S" : "baz" }
                       }
                   }
               ]
           }
```

** `$util.dynamodb.toListJson(List) : String` **  
與 相同`$util.dynamodb.toList(List) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

## toMap 公用程式
<a name="utility-helpers-in-toMap"></a>

### toMap utils 清單
<a name="utility-helpers-in-toMap-list"></a>

** `$util.dynamodb.toMap(Map) : Map` **  
將映射轉換為 DynamoDB 映射格式。映射中的每個值也會轉換為其適當的 DynamoDB 格式。它在代表一些巢狀物件的方式上是固定的：例如，它會使用清單 (「L」) 而不是集合 (「SS」、「NS」、「BS」)。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toMap({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "M" : {
                   "foo"  : { "S" : "bar" },
                   "baz"  : { "N" : 1234 },
                   "beep" : {
                       "L" : [
                           { "S" : "boop" }
                       ]
                   }
               }
           }
```

** `$util.dynamodb.toMapJson(Map) : String` **  
與 相同`$util.dynamodb.toMap(Map) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

** `$util.dynamodb.toMapValues(Map) : Map` **  
建立映射的副本，其中每個值都已轉換為其適當的 DynamoDB 格式。它在代表一些巢狀物件的方式上是固定的：例如，它會使用清單 (「L」) 而不是集合 (「SS」、「NS」、「BS」)。  

```
Input:      $util.dynamodb.toMapValues({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "foo"  : { "S" : "bar" },
               "baz"  : { "N" : 1234 },
               "beep" : {
                   "L" : [
                       { "S" : "boop" }
                   ]
               }
           }
```
這與 略有不同，`$util.dynamodb.toMap(Map) : Map`因為它只會傳回 DynamoDB 屬性值的內容，但不會傳回整個屬性值本身。例如，下列陳述式完全相同：  

```
$util.dynamodb.toMapValues($map)
$util.dynamodb.toMap($map).get("M")
```

** `$util.dynamodb.toMapValuesJson(Map) : String` **  
與 相同`$util.dynamodb.toMapValues(Map) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

## S3Object 公用程式
<a name="utility-helpers-in-S3Object"></a>

### S3Object 公用程式清單
<a name="utility-helpers-in-S3Object-list"></a>

** `$util.dynamodb.toS3Object(String key, String bucket, String region) : Map` **  
將金鑰、儲存貯體和區域轉換為 DynamoDB S3 物件表示法。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toS3Object("foo", "bar", region = "baz")
Output:     { "S" : "{ \"s3\" : { \"key\" : \"foo", \"bucket\" : \"bar", \"region\" : \"baz" } }" }
```

** `$util.dynamodb.toS3ObjectJson(String key, String bucket, String region) : String` **  
與 相同`$util.dynamodb.toS3Object(String key, String bucket, String region) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

** `$util.dynamodb.toS3Object(String key, String bucket, String region, String version) : Map` **  
將金鑰、儲存貯體、區域和選用版本轉換為 DynamoDB S3 物件表示法。這會傳回描述 DynamoDB 屬性值的物件。  

```
Input:      $util.dynamodb.toS3Object("foo", "bar", "baz", "beep")
Output:     { "S" : "{ \"s3\" : { \"key\" : \"foo\", \"bucket\" : \"bar\", \"region\" : \"baz\", \"version\" = \"beep\" } }" }
```

** `$util.dynamodb.toS3ObjectJson(String key, String bucket, String region, String version) : String` **  
與 相同`$util.dynamodb.toS3Object(String key, String bucket, String region, String version) : Map`，但 會以 JSON 編碼字串的形式傳回 DynamoDB 屬性值。

** `$util.dynamodb.fromS3ObjectJson(String) : Map` **  
接受 DynamoDB S3 物件的字串值，並傳回包含金鑰、儲存貯體、區域和選用版本的映射。  

```
Input:      $util.dynamodb.fromS3ObjectJson({ "S" : "{ \"s3\" : { \"key\" : \"foo\", \"bucket\" : \"bar\", \"region\" : \"baz\", \"version\" = \"beep\" } }" })
Output:     { "key" : "foo", "bucket" : "bar", "region" : "baz", "version" : "beep" }
```

# \$1util.rds 中的 Amazon RDS 協助程式
<a name="rds-helpers-in-util-rds"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

`$util.rds` 包含協助程式方法，透過消除結果輸出中的外部資料來格式化 Amazon RDS 操作。

## \$1util.rds utils 清單
<a name="rds-helpers-in-util-rds-list"></a>

****`$util.rds.toJsonString(String serializedSQLResult): String`****  
透過將字串化原始 Amazon Relational Database Service (Amazon RDS) Data API 操作結果格式`String`轉換為更簡潔的字串，傳回 。傳回的字串是結果集的 SQL 記錄序列化清單。每筆記錄都會顯示為鍵值對集合。索引鍵是對應的欄位名稱。  
如果輸入中的對應陳述式是造成變動的 SQL 查詢 （例如 INSERT、UPDATE、DELETE)，則會傳回空清單。例如，查詢`select * from Books limit 2`提供來自 Amazon RDS Data 操作的原始結果：  

```
{
    "sqlStatementResults": [
        {
            "numberOfRecordsUpdated": 0,
            "records": [
                [
                    {
                        "stringValue": "Mark Twain"
                    },
                    {
                        "stringValue": "Adventures of Huckleberry Finn"
                    },
                    {
                        "stringValue": "978-1948132817"
                    }
                ],
                [
                    {
                        "stringValue": "Jack London"
                    },
                    {
                        "stringValue": "The Call of the Wild"
                    },
                    {
                        "stringValue": "978-1948132275"
                    }
                  ]
            ],
            "columnMetadata": [
                {
                    "isSigned": false,
                    "isCurrency": false,
                    "label": "author",
                    "precision": 200,
                    "typeName": "VARCHAR",
                    "scale": 0,
                    "isAutoIncrement": false,
                    "isCaseSensitive": false,
                    "schemaName": "",
                    "tableName": "Books",
                    "type": 12,
                    "nullable": 0,
                    "arrayBaseColumnType": 0,
                    "name": "author"
                },
                {
                    "isSigned": false,
                    "isCurrency": false,
                    "label": "title",
                    "precision": 200,
                    "typeName": "VARCHAR",
                    "scale": 0,
                    "isAutoIncrement": false,
                    "isCaseSensitive": false,
                    "schemaName": "",
                    "tableName": "Books",
                    "type": 12,
                    "nullable": 0,
                    "arrayBaseColumnType": 0,
                    "name": "title"
                },
                {
                    "isSigned": false,
                    "isCurrency": false,
                    "label": "ISBN-13",
                    "precision": 15,
                    "typeName": "VARCHAR",
                    "scale": 0,
                    "isAutoIncrement": false,
                    "isCaseSensitive": false,
                    "schemaName": "",
                    "tableName": "Books",
                    "type": 12,
                    "nullable": 0,
                    "arrayBaseColumnType": 0,
                    "name": "ISBN-13"
                }
            ]
        }
    ]
}
```
`util.rds.toJsonString` 是：  

```
[
  {
    "author": "Mark Twain",
    "title": "Adventures of Huckleberry Finn",
    "ISBN-13": "978-1948132817"
  },
  {
    "author": "Jack London",
    "title": "The Call of the Wild",
    "ISBN-13": "978-1948132275"
  },
]
```

****`$util.rds.toJsonObject(String serializedSQLResult): Object`****  
這與 相同`util.rds.toJsonString`，但結果為 JSON `Object`。

# \$1util.http 中的 HTTP 協助程式
<a name="http-helpers-in-utils-http"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

`$util.http` 公用程式提供協助程式方法，您可以用來管理 HTTP 請求參數和新增回應標頭。

## \$1util.http utils 清單
<a name="http-helpers-in-utils-http-list"></a>

** `$util.http.copyHeaders(Map) : Map` **  
從映射複製標頭，不包括下列受限 HTTP 標頭：  
+ transfer-encoding
+ connection
+ host
+ expect
+ keep-alive
+ upgrade
+ proxy-authenticate
+ proxy-authorization
+ te
+ content-length
您可以使用此公用程式將請求標頭轉送至下游 HTTP 端點。  

```
{
    ...
    "params": {
        ...
        "headers": $util.http.copyHeaders($ctx.request.headers),
        ...
    },
    ...
}
```

**\$1util.http.addResponseHeader（字串、物件）**  
新增具有回應名稱 (`String`) 和值 (`Object`) 的單一自訂標頭。有下列限制：  
+ 除了 的限制標頭清單之外`copyHeaders(Map)`，標頭名稱也不符合下列任何項目：
  + Access-Control-Allow-Credentials
  + Access-Control-Allow-Origin
  + Access-Control-Expose-Headers
  + Access-Control-Max-Age
  + Access-Control-Allow-Methods
  + Access-Control-Allow-Headers
  + Vary
  + Content-Type
+ 標頭名稱不能以限制字首`x-amzn-`或 開頭`x-amz-`。
+ 自訂回應標頭的大小不能超過 4 KB。這包括標頭名稱和值。
+ 您應該為每個 GraphQL 操作定義每個回應標頭一次。不過，如果您多次定義同名的自訂標頭，最近的定義會出現在回應中。無論命名為何，所有標頭都會計入標頭大小限制。
+ 具有空白或限制名稱`(String)`或 null 值的標頭`(Object)`將被忽略，並產生新增到操作`errors`輸出的`ResponseHeaderError`錯誤。

```
export function request(ctx) {
  util.http.addResponseHeader('itemsCount', 7)
  util.http.addResponseHeader('render', ctx.args.render)
  return {}
}
```

****`$util.http.addResponseHeaders(Map)`****  
從指定的名稱`(String)`和值映射將多個回應標頭新增至回應`(Object)`。為 `addResponseHeader(String, Object)`方法列出的相同限制也適用於此方法。  

```
export function request(ctx) {
  const headers = {
    headerInt: 12,
    headerString: 'stringValue',
    headerObject: {
      field1: 7,
      field2: 'string'
    }
  }
  util.http.addResponseHeaders(headers)
  return {}
}
```

# \$1util.xml 中的 XML 協助程式
<a name="xml-helpers-in-utils-xml"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

`$util.xml` 包含協助程式方法，可讓您更輕鬆地將 XML 回應轉譯為 JSON 或字典。

## \$1util.xml utils 清單
<a name="xml-helpers-in-utils-xml-list"></a>

****`$util.xml.toMap(String) : Map`****  
將 XML 字串轉換為字典。  

```
Input:

<?xml version="1.0" encoding="UTF-8"?>
<posts>
<post>
  <id>1</id>
  <title>Getting started with GraphQL</title>
</post>
</posts>

Output (JSON representation):

{
  "posts":{
    "post":{
      "id":1,
      "title":"Getting started with GraphQL"
    }
  }
}


Input:

<?xml version="1.0" encoding="UTF-8"?>
<posts>
<post>
  <id>1</id>
  <title>Getting started with GraphQL</title>
</post>
<post>
  <id>2</id>
  <title>Getting started with AWS AppSync</title>
</post>
</posts>

Output (JSON representation):

{
  "posts":{
    "post":[
        {
          "id":1,
          "title":"Getting started with GraphQL"
        },
        {
          "id":2,
          "title":"Getting started with AWS AppSync"
        }
    ]
  }
}
```

****`$util.xml.toJsonString(String) : String`****  
將 XML 字串轉換為 JSON 字串。這類似於 *toMap*，但輸出是字串。如果要將來自 HTTP 物件的 XML 回應直接轉換並傳回給 JSON，這非常實用。

****`$util.xml.toJsonString(String, Boolean) : String`****  
將 XML 字串轉換為具有選用布林值參數的 JSON 字串，以判斷您是否要對 JSON 進行字串編碼。

# \$1util.transform 中的轉換協助程式
<a name="transformation-helpers-in-utils-transform"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

`$util.transform` 包含協助程式方法，可讓您更輕鬆地對資料來源執行複雜的操作，例如 Amazon DynamoDB 篩選操作。

## 轉換協助程式
<a name="transformation-helpers-conversions"></a>

### 轉換協助程式使用清單
<a name="transformation-helpers-in-utils-transform-list"></a>

****`$util.transform.toDynamoDBFilterExpression(Map) : Map`****  
將輸入字串轉換為篩選條件表達式，以搭配 DynamoDB 使用。  

```
Input:

$util.transform.toDynamoDBFilterExpression({
    "title":{
      "contains":"Hello World"
    }
  })

Output:

{
    "expression" : "contains(#title, :title_contains)"
    "expressionNames" : {
        "#title" : "title",
    },
    "expressionValues" : {
        ":title_contains" : { "S" : "Hello World" }
    },
}
```

****`$util.transform.toElasticsearchQueryDSL(Map) : Map`****  
將指定的輸入轉換為其同等的 OpenSearch Query DSL 表達式，將其傳回為 JSON 字串。  

```
Input:

$util.transform.toElasticsearchQueryDSL({
    "upvotes":{
        "ne":15,
        "range":[
            10,
            20
        ]
    },
    "title":{
        "eq":"hihihi",
        "wildcard":"h*i"
    }
  })

Output:
{
    "bool":{
      "must":[
          {
            "bool":{
              "must":[
                  {
                    "bool":{
                      "must_not":{
                        "term":{
                          "upvotes":15
                        }
                      }
                    }
                  },
                  {
                    "range":{
                      "upvotes":{
                        "gte":10,
                        "lte":20
                      }
                    }
                  }
              ]
            }
          },
          {
            "bool":{
              "must":[
                  {
                    "term":{
                      "title":"hihihi"
                    }
                  },
                  {
                  "wildcard":{
                      "title":"h*i"
                    }
                  }
              ]
            }
          }
      ]
    }
}
```
預設運算子假設為 AND。

## 轉換協助程式訂閱篩選條件
<a name="transformation-helpers-conversions-subscription-filters"></a>

### 轉換協助程式訂閱篩選條件使用清單
<a name="transformation-helpers-in-utils-transform-list"></a>

****`$util.transform.toSubscriptionFilter(Map) : Map`****  
將`Map`輸入物件轉換為`SubscriptionFilter`表達式物件。`$util.transform.toSubscriptionFilter` 方法用作`$extensions.setSubscriptionFilter()`延伸模組的輸入。如需詳細資訊，請參閱[延伸模組](https://docs.aws.amazon.com/appsync/latest/devguide/extensions)。

****`$util.transform.toSubscriptionFilter(Map, List) : Map`****  
將`Map`輸入物件轉換為`SubscriptionFilter`表達式物件。`$util.transform.toSubscriptionFilter` 方法用作`$extensions.setSubscriptionFilter()`延伸模組的輸入。如需詳細資訊，請參閱[延伸模組](https://docs.aws.amazon.com/appsync/latest/devguide/extensions)。  
第一個引數是轉換為`SubscriptionFilter`表達式物件的`Map`輸入物件。第二個引數是在建構`SubscriptionFilter`表達式物件時在第一個`Map`輸入物件中忽略`List`的欄位名稱。

****`$util.transform.toSubscriptionFilter(Map, List, Map) : Map`****  
將`Map`輸入物件轉換為`SubscriptionFilter`表達式物件。`$util.transform.toSubscriptionFilter` 方法用作`$extensions.setSubscriptionFilter()`延伸模組的輸入。如需詳細資訊，請參閱 [延伸模組](https://docs.aws.amazon.com/appsync/latest/devguide/extensions)。  
第一個引數是轉換為`SubscriptionFilter`表達式物件的`Map`輸入物件，第二個引數是在第一個`Map`輸入物件中忽略`List`的欄位名稱，第三個引數是建構`SubscriptionFilter`表達式物件時包含的嚴格規則的`Map`輸入物件。這些嚴格的規則包含在`SubscriptionFilter`表達式物件中，方式是至少滿足其中一個規則以傳遞訂閱篩選條件。

## 訂閱篩選條件引數
<a name="subscription-filter-arguments"></a>

下表說明如何定義下列公用程式的引數：
+ `$util.transform.toSubscriptionFilter(Map) : Map`
+ `$util.transform.toSubscriptionFilter(Map, List) : Map`
+ `$util.transform.toSubscriptionFilter(Map, List, Map) : Map`

------
#### [ Argument 1: Map ]

引數 1 是具有下列索引鍵值的`Map`物件：
+ 欄位名稱
+ 「和」
+ 「或」

對於做為索引鍵的欄位名稱，這些欄位項目的條件格式為 `"operator" : "value"`。

下列範例顯示如何將項目新增至 `Map`：

```
"field_name" : {
                    "operator1" : value             
               }

## We can have multiple conditions for the same field_name: 

"field_name" : {
                    "operator1" : value             
                    "operator2" : value
                    .
                    .
                    .                  
               }
```

當欄位上有兩個或多個條件時，所有這些條件都會被視為使用 OR 操作。

輸入`Map`也可以將「和」和「或」做為索引鍵，表示這些輸入中的所有項目都應該使用 AND 或 OR 邏輯聯結，視索引鍵而定。鍵值「和」和「或」預期有一系列條件。

```
"and" : [
            
            {
                "field_name1" : {
                    "operator1" : value             
                }
             },
             
             {
                "field_name2" : {
                    "operator1" : value             
                }
             },
             .
             .
        ].
```

請注意，您可以巢狀化「和」和「或」。也就是說，您可以在另一個「和」/」或」區塊中巢狀「和」/」或「或」。不過，這不適用於簡單的欄位。

```
"and" : [
            
            {
                "field_name1" : {
                    "operator" : value             
                }
             },
             
             {
                "or" : [
                            {
                                "field_name2" : {
                                    "operator" : value             
                                }
                            },
                            
                            {
                                "field_name3" : {
                                    "operator" : value             
                                }
                            }
              
                        ].
```

下列範例顯示使用 *輸入引數 1*`$util.transform.toSubscriptionFilter(Map) : Map`。

**Input(s)**

引數 1：映射：

```
{
  "percentageUp": {
    "lte": 50,
    "gte": 20
  },
  "and": [
    {
      "title": {
        "ne": "Book1"
      }
    },
    {
      "downvotes": {
        "gt": 2000
      }
    }
  ],
  "or": [
    {
      "author": {
        "eq": "Admin"
      }
    },
    {
      "isPublished": {
        "eq": false
      }
    }
  ]
}
```

**輸出**

結果是`Map`物件：

```
{
  "filterGroup": [
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "lte",
          "value": 50
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "author",
          "operator": "eq",
          "value": "Admin"
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "lte",
          "value": 50
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "gte",
          "value": 20
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "author",
          "operator": "eq",
          "value": "Admin"
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "gte",
          "value": 20
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        }
      ]
    }
  ]
}
```

------
#### [ Argument 2: List ]

引數 2 包含建構`SubscriptionFilter`表達式物件時不應在輸入中考慮`List`的一組欄位名稱 `Map`（引數 1)。`List` 也可以是空的。

下列範例顯示使用 輸入引數 1 和引數 2`$util.transform.toSubscriptionFilter(Map, List) : Map`。

**Input(s)**

引數 1：映射：

```
{

  "percentageUp": {
    "lte": 50,
    "gte": 20
  },
  "and": [
    {
      "title": {
        "ne": "Book1"
      }
    },
    {
      "downvotes": {
        "gt": 20
      }
    }
  ],
  "or": [
    {
      "author": {
        "eq": "Admin"
      }
    },
    {
      "isPublished": {
        "eq": false
      }
    }
  ]
}
```

引數 2：列出：

```
["percentageUp", "author"]
```

**輸出**

結果是`Map`物件：

```
{
  "filterGroup": [
    {
      "filters": [
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 20
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        }
      ]
    }
  ]
}
```

------
#### [ Argument 3: Map ]

引數 3 是具有欄位名稱作為索引鍵值的`Map`物件 （不能具有「和」或「或」)。對於做為索引鍵的欄位名稱，這些欄位的條件是 形式的項目`"operator" : "value"`。與引數 1 不同，引數 3 不能在同一個索引鍵中有多個條件。此外，引數 3 沒有「和」或「或」子句，因此也沒有涉及巢狀。

引數 3 代表新增至`SubscriptionFilter`表達式物件的嚴格規則清單，因此**至少符合其中一個**條件以傳遞篩選條件。

```
{
  "fieldname1": {
    "operator": value
  },
  "fieldname2": {
    "operator": value
  }
}
.
.
.
```

下列範例顯示使用 的*引數 1*、*引數 2* 和*引數 3* 的輸入`$util.transform.toSubscriptionFilter(Map, List, Map) : Map`。

**Input(s)**

引數 1：映射：

```
{
  "percentageUp": {
    "lte": 50,
    "gte": 20
  },
  "and": [
    {
      "title": {
        "ne": "Book1"
      }
    },
    {
      "downvotes": {
        "lt": 20
      }
    }
  ],
  "or": [
    {
      "author": {
        "eq": "Admin"
      }
    },
    {
      "isPublished": {
        "eq": false
      }
    }
  ]
}
```

引數 2：列出：

```
["percentageUp", "author"]
```

引數 3：映射：

```
{
  "upvotes": {
    "gte": 250
  },
  "author": {
    "eq": "Person1"
  }
}
```

**輸出**

結果是`Map`物件：

```
{
  "filterGroup": [
    {
      "filters": [
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 20
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        },
        {
          "fieldName": "upvotes",
          "operator": "gte",
          "value": 250
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 20
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        },
        {
          "fieldName": "author",
          "operator": "eq",
          "value": "Person1"
        }
      ]
    }
  ]
}
```

------

# \$1util.math 中的數學協助程式
<a name="math-helpers-in-util-math"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

 `$util.math` 包含可協助處理常見數學操作的方法。

## \$1util.math utils 清單
<a name="math-helpers-in-util-math-list"></a>

** `$util.math.roundNum(Double) : Integer` **  
採取雙數並四捨五入到最接近的整數。

** `$util.math.minVal(Double, Double) : Double` **  
需要兩個倍數，並傳回兩個倍數之間的最小值。

** `$util.math.maxVal(Double, Double) : Double` **  
需要兩個倍數，並傳回兩個倍數之間的最大值。

** `$util.math.randomDouble() : Double` **  
傳回介於 0 和 1 之間的隨機倍數。  
此函數不應用於需要高熵隨機性 （例如密碼編譯） 的任何內容。

** `$util.math.randomWithinRange(Integer, Integer) : Integer` **  
傳回指定範圍內的隨機整數值，第一個引數指定範圍的較低值，第二個引數指定範圍的上限值。  
此函數不應用於需要高熵隨機性 （例如密碼編譯） 的任何內容。

# \$1util.str 中的字串協助程式
<a name="str-helpers-in-util-str"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

 `$util.str` 包含有助於常見字串操作的方法。

## \$1util.str utils 清單
<a name="str-helpers-in-util-str-list"></a>

** `$util.str.toUpper(String) : String` **  
採用字串並將其轉換為完全大寫。

** `$util.str.toLower(String) : String` **  
採用字串並將其轉換為完全小寫。

** `$util.str.toReplace(String, String, String) : String` **  
將字串中的子字串取代為另一個字串。第一個引數指定要在其中執行取代操作的字串。第二個引數指定要取代的子字串。第三個引數指定要取代第二個引數的字串。以下是此公用程式使用的範例：  

```
 INPUT:      $util.str.toReplace("hello world", "hello", "mellow")
 OUTPUT:     "mellow world"
```

** `$util.str.normalize(String, String) : String` **  
使用四種 Unicode 標準化形式之一來標準化字串：NFC、NFD、NFKC 或 NFKD。第一個引數是要標準化的字串。第二個引數是 "nfc"、"nfd"、"nfkc" 或 "nfkd"，指定用於標準化程序的標準化類型。

# 延伸模組
<a name="extensions"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

`$extensions` 包含一組方法，可在解析程式中執行其他動作。

## 快取擴充功能
<a name="caching-extensions-list"></a>

**`$extensions.evictFromApiCache(String, String, Object) : Object`**  
從 AWS AppSync 伺服器端快取中移出項目。第一個引數是類型名稱。第二個引數是欄位名稱。第三個引數是包含金鑰值對項目的物件，可指定快取金鑰值。您必須以與快取解析程式 中的快取金鑰相同的順序，將項目放在物件中`cachingKey`。  
此公用程式僅適用於變動，不適用於查詢。

## 訂閱擴充功能
<a name="subscription-extensions-list"></a>

**`$extensions.setSubscriptionFilter(filterJsonObject)`**  
定義增強型訂閱篩選條件。每個訂閱通知事件都會根據提供的訂閱篩選條件進行評估，並在所有篩選條件評估為 時傳送通知給用戶端`true`。引數`filterJsonObject`如下節所述。  
您只能在訂閱解析程式的回應映射範本中使用此延伸方法。

**`$extensions.setSubscriptionInvalidationFilter(filterJsonObject)`**  
定義訂閱失效篩選條件。系統會針對失效承載評估訂閱篩選條件，如果篩選條件評估為 ，則會使指定的訂閱失效`true`。引數`filterJsonObject`如下節所述。  
您只能在訂閱解析程式的回應映射範本中使用此延伸方法。

**`$extensions.invalidateSubscriptions(invalidationJsonObject)`**  
用來從變動啟動訂閱失效。引數`invalidationJsonObject`如下節所述。  
此延伸模組只能用於變動解析程式的回應映射範本。  
在任何單一請求中，您最多只能使用五個唯一的`$extensions.invalidateSubscriptions()`方法呼叫。如果您超過此限制，您將會收到 GraphQL 錯誤。

## 引數：filterJsonObject
<a name="extensions-setSubscriptionInvalidationFilter"></a>

JSON 物件會定義訂閱或失效篩選條件。這是 中的一系列篩選條件`filterGroup`。每個篩選條件都是個別篩選條件的集合。

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                }
           ]
           
        },
        {
           "filters" : [
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

每個篩選條件都有三個屬性：
+ `fieldName` – GraphQL 結構描述欄位。
+ `operator` – 運算子類型。
+ `value` – 要與訂閱通知值比較`fieldName`的值。

以下是這些屬性的範例指派：

```
{
 "fieldName" : "severity",
 "operator" : "le",
 "value" : $context.result.severity
}
```

### 欄位：fieldName
<a name="extensions-fieldName"></a>

字串類型`fieldName`是指在 GraphQL 結構描述中定義的欄位，符合訂閱通知承載`fieldName`中的 。找到相符項目時，GraphQL 結構描述欄位`value`的 會與訂閱通知篩選條件`value`的 進行比較。在下列範例中，`fieldName`篩選條件符合指定 GraphQL 類型中定義的`service`欄位。如果通知承載包含等於 `value` `service`的欄位`AWS AppSync`，則篩選條件會評估為 `true`：

```
{
 "fieldName" : "service",
 "operator" : "eq",
 "value" : "AWS AppSync"
}
```

### 欄位：值
<a name="extensions-value"></a>

根據運算子，值可以是不同的類型：
+ 單一數字或布林值
  + 字串範例：`"test"`、 `"service"`
  + 數字範例：`1`、`2`、 `45.75`
  + 布林值範例：`true`、 `false`
+ 一組數字或字串
  + 字串對範例：`["test1","test2"]`、 `["start","end"]`
  + 數字對範例：`[1,4]`、`[67,89]`、 `[12.45, 95.45]`
+ 數字或字串陣列
  + 字串陣列範例： `["test1","test2","test3","test4","test5"]`
  + 數字陣列範例：`[1,2,3,4,5]`、 `[12.11,46.13,45.09,12.54,13.89]`

### 欄位：運算子
<a name="extensions-operator"></a>

具有下列可能值的區分大小寫字串：


| 
| 
| 運算子 | Description | 可能的值類型 | 
| --- |--- |--- |
| eq | Equal | integer, float, string, Boolean | 
| ne | Not equal | integer, float, string, Boolean | 
| le | Less than or equal | integer, float, string | 
| lt | Less than | integer, float, string | 
| ge | Greater than or equal | integer, float, string | 
| gt | Greater than | integer, float, string | 
| contains | Checks for a subsequence or value in the set. | integer, float, string | 
| notContains | Checks for the absence of a subsequence or absence of a value in the set. | integer, float, string | 
| beginsWith | Checks for a prefix. | string | 
| in | Checks for matching elements that are in the list. | Array of integer, float, or string | 
| notIn | Checks for matching elements that aren't in the list. | Array of integer, float, or string | 
| between | Between two values | integer, float, string | 
| containsAny | Contains common elements | integer, float, string | 

下表說明訂閱通知中每個運算子的使用方式。

------
#### [ eq (equal) ]

如果`true`訂閱通知欄位值相符且嚴格等於篩選條件的值，則`eq`運算子會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有值等於 `service`的欄位`AWS AppSync`。

**可能的值類型：**整數、浮點數、字串、布林值

```
{
 "fieldName" : "service",
 "operator" : "eq",
 "value" : "AWS AppSync"
}
```

------
#### [ ne (not equal) ]

如果`true`訂閱通知欄位值與篩選條件的值不同，運算`ne`子會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有值與 不同的`service`欄位`AWS AppSync`。

**可能的值類型：**整數、浮點數、字串、布林值

```
{
 "fieldName" : "service",
 "operator" : "ne",
 "value" : "AWS AppSync"
}
```

------
#### [ le (less or equal) ]

如果`true`訂閱通知欄位值小於或等於篩選條件的值，`le`運算子會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有值小於或等於 `size`的欄位`5`。

**可能的值類型：**整數、浮點數、字串

```
{
 "fieldName" : "size",
 "operator" : "le",
 "value" : 5
}
```

------
#### [ lt (less than) ]

如果`true`訂閱通知欄位值低於篩選條件的值，運算`lt`子會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有值低於 `size`的欄位`5`。

**可能的值類型：**整數、浮點數、字串

```
{
 "fieldName" : "size",
 "operator" : "lt",
 "value" : 5
}
```

------
#### [ ge (greater or equal) ]

如果`true`訂閱通知欄位值大於或等於篩選條件的值，運算`ge`子會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有值大於或等於 `size`的欄位`5`。

**可能的值類型：**整數、浮點數、字串

```
{
 "fieldName" : "size",
 "operator" : "ge",
 "value" : 5
}
```

------
#### [ gt (greater than) ]

如果`true`訂閱通知欄位值大於篩選條件的值，運算`gt`子會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有值大於 `size`的欄位`5`。

**可能的值類型：**整數、浮點數、字串

```
{
 "fieldName" : "size",
 "operator" : "gt",
 "value" : 5
}
```

------
#### [ contains ]

`contains` 運算子會檢查集合或單一項目中的子字串、子序列或值。如果訂閱通知欄位值包含篩選條件值，則具有 `contains` 運算子的篩選條件會評估`true`為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有`seats`欄位的陣列值包含值 `10`。

**可能的值類型：**整數、浮點數、字串

```
{
 "fieldName" : "seats",
 "operator" : "contains",
 "value" : 10
}
```

在另一個範例中，篩選條件會評估訂閱通知`true`是否具有 `launch`做為子字串`event`的欄位。

```
{
 "fieldName" : "event",
 "operator" : "contains",
 "value" : "launch"
}
```

------
#### [ notContains ]

`notContains` 運算子會檢查集合或單一項目中是否存在子字串、子序列或值。如果訂閱通知欄位值不包含篩選條件值`true`，則具有 `notContains` 運算子的篩選條件會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否具有陣列值不包含值 `seats`的欄位`10`。

**可能的值類型：**整數、浮點數、字串

```
{
 "fieldName" : "seats",
 "operator" : "notContains",
 "value" : 10
}
```

在另一個範例中，篩選條件會評估訂閱通知`true`是否具有 `launch`作為其子序列的 `event` 欄位值。

```
{
 "fieldName" : "event",
 "operator" : "notContains",
 "value" : "launch"
}
```

------
#### [ beginsWith ]

`beginsWith` 運算子會檢查字串中的字首。如果訂閱通知欄位值以篩選條件的值開頭`true`，則包含`beginsWith`運算子的篩選條件會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有值開頭為 `service`的欄位`AWS`。

**可能的值類型：**字串

```
{
 "fieldName" : "service",
 "operator" : "beginsWith",
 "value" : "AWS"
}
```

------
#### [ in ]

`in` 運算子會檢查陣列中的相符元素。如果訂閱通知欄位值存在於陣列中`true`，包含 `in` 運算子的篩選條件會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有`severity`欄位具有陣列中存在的其中一個值：`[1,2,3]`。

**可能的值類型：**整數陣列、浮點數或字串

```
{
 "fieldName" : "severity",
 "operator" : "in",
 "value" : [1,2,3]
}
```

------
#### [ notIn ]

`notIn` 運算子會檢查陣列中是否有遺失的元素。如果訂閱通知欄位值不存在於陣列中`true`，則包含`notIn`運算子的篩選條件會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否有`severity`欄位，其中包含陣列中不存在的其中一個值：`[1,2,3]`。

**可能的值類型：**整數陣列、浮點數或字串

```
{
 "fieldName" : "severity",
 "operator" : "notIn",
 "value" : [1,2,3]
}
```

------
#### [ between ]

`between` 運算子會檢查兩個數字或字串之間的值。如果訂閱通知欄位值介於篩選條件的值對之間`true`，則包含`between`運算子的篩選條件會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否具有值為 `2`、`3`、 `severity`的欄位`4`。

**可能的值類型：**整數、浮點數或字串的配對

```
{
 "fieldName" : "severity",
 "operator" : "between",
 "value" : [1,5]
}
```

------
#### [ containsAny ]

`containsAny` 運算子會檢查陣列中的常見元素。如果訂閱通知欄位集值和篩選條件集值的交集不是空的`true`，則具有 `containsAny` 運算子的篩選條件會評估為 。在下列範例中，篩選條件會評估訂閱通知`true`是否具有陣列值包含 `10`或 `seats`的欄位`15`。這表示`true`如果訂閱通知`seats`的欄位值為 `[10,11]`或 ，篩選條件會評估為 `[15,20,30]`。

**可能的值類型：**整數、浮點數或字串

```
{
 "fieldName" : "seats",
 "operator" : "containsAny",
 "value" : [10, 15]
}
```

------

### AND 邏輯
<a name="extensions-AND-logic"></a>

您可以使用 AND 邏輯結合多個篩選條件，方法是在`filterGroup`陣列中的 `filters` 物件中定義多個項目。在下列範例中，篩選條件會評估訂閱通知`true`是否有 欄位`userId`的值等於 `1` AND `group` 欄位值 `Admin`或 `Developer`。

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                },
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

### OR 邏輯
<a name="extensions-OR-logic"></a>

您可以在`filterGroup`陣列中定義多個篩選條件物件，以使用 OR 邏輯結合多個篩選條件。在下列範例中，篩選條件會評估訂閱通知`true`是否有欄位`userId`的值等於 `1` OR `group` 欄位值 `Admin`或 `Developer`。

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                }
           ]
           
        },
        {
           "filters" : [
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

### 例外狀況
<a name="extensions-exceptions"></a>

請注意，使用篩選條件有幾項限制：
+ 在 `filters` 物件中，每個篩選條件最多可以有五個唯一`fieldName`項目。這表示您最多可以使用 AND 邏輯結合五個個別`fieldName`物件。
+ 運算`containsAny`子最多可有 20 個值。
+ `in` 和 `notIn`運算子最多可有五個值。
+ 每個字串最多可有 256 個字元。
+ 每個字串比較都區分大小寫。
+ 巢狀物件篩選最多允許五個巢狀層級的篩選。
+ 每個 `filterGroup` 最多可有 10 個 `filters`。這表示您可以使用 `filters` OR 邏輯結合最多 10 個。
  + `in` 運算子是 OR 邏輯的特殊案例。在下列範例中，有兩個 `filters`：

    ```
    {
        "filterGroup": [
            {
               "filters" : [
                     {
                        "fieldName" : "userId",
                        "operator" : "eq",
                        "value" : 1
                    },
                    {
                        "fieldName" : "group",
                        "operator" : "in",
                        "value" : ["Admin", "Developer"]
                    }
               ]  
            }
        ]
    }
    ```

    上述篩選條件群組的評估如下所示，並計入最大篩選條件限制：

    ```
    {
        "filterGroup": [
            {
               "filters" : [
                     {
                        "fieldName" : "userId",
                        "operator" : "eq",
                        "value" : 1
                    },
                    {
                        "fieldName" : "group",
                        "operator" : "eq",
                        "value" : "Admin"
                    }
               ]  
            },
            {
               "filters" : [
                     {
                        "fieldName" : "userId",
                        "operator" : "eq",
                        "value" : 1
                    },
                    {
                        "fieldName" : "group",
                        "operator" : "eq",
                        "value" : "Developer"
                    }
               ]  
            }
        ]
    }
    ```

## 引數： invalidationJsonObject
<a name="extensions-invalidationJsonObject"></a>

`invalidationJsonObject` 定義下列項目：
+ `subscriptionField` – 要失效的 GraphQL 結構描述訂閱。定義為 中字串的單一訂閱`subscriptionField`會被視為失效。
+ `payload` – 金鑰/值對清單，當失效篩選條件`true`根據其值評估為 時，此清單會做為使訂閱失效的輸入。

  當訂閱解析程式中定義的失效篩選條件`true`針對 `payload`值評估為 時，下列範例會使用`onUserDelete`訂閱使已訂閱和已連線的用戶端失效。

  ```
  $extensions.invalidateSubscriptions({
          "subscriptionField": "onUserDelete",
          "payload": {
                  "group": "Developer"
                  "type" : "Full-Time"
        }
      })
  ```

# DynamoDB 的 AWS AppSync 解析程式映射範本參考
<a name="resolver-mapping-template-reference-dynamodb"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

The AWS AppSync DynamoDB 函數可讓您使用 [GraphQL](https://graphql.org)，將傳入的 GraphQL 請求映射至 DynamoDB DynamoDB 呼叫，然後將 DynamoDB 回應映射回 GraphQL，以在帳戶中現有的 Amazon DynamoDB 資料表中存放和擷取資料。本節說明受支援 DynamoDB 操作的請求和回應處理常式：
+  [GetItem](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-getitem.html) - GetItem 請求可讓您指示 DynamoDB 函數向 DynamoDB 提出 GetItem 請求，並可讓您在 DynamoDB 中指定項目的索引鍵，以及是否使用一致的讀取。
+  [ PutItem ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-putitem.html) - PutItem 請求映射文件可讓您指示 DynamoDB 函數向 DynamoDB 提出 PutItem 請求，並可讓您在 DynamoDB 中指定項目的金鑰、項目的完整內容 （由金鑰和attributeValues組成），以及操作成功的條件。
+  [ UpdateItem ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem.html) - UpdateItem 請求可讓您指示 DynamoDB 函數向 DynamoDB 提出 UpdateItem 請求，並允許您在 DynamoDB 中指定項目的索引鍵、描述如何在 DynamoDB 中更新項目的更新表達式，以及操作成功的條件。
+  [ DeleteItem ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-deleteitem.html) - DeleteItem 請求可讓您指示 DynamoDB 函數向 DynamoDB 提出 DeleteItem 請求，並可讓您在 DynamoDB 中指定項目的索引鍵，以及操作成功的條件。
+  [ 查詢 ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-query.html) - 查詢請求物件可讓您指示 DynamoDB 解析程式向 DynamoDB 提出查詢請求，並可讓您指定金鑰表達式、要使用的索引、額外的篩選條件、要傳回的項目數、是否使用一致的讀取、查詢方向 （向前或向後） 和分頁字符。
+  [ 掃描 ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-scan.html) - 掃描請求可讓您指示 DynamoDB 函數向 DynamoDB 發出掃描請求，並可讓您指定篩選條件以排除結果、要使用的索引、要傳回的項目數、是否使用一致的讀取、分頁字符和平行掃描。
+  [ Sync ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-sync.html) - Sync 請求物件可讓您從 DynamoDB 資料表擷取所有結果，然後只接收自上次查詢後更改的資料 （差異更新）。同步請求只能對版本控制的 DynamoDB 資料來源提出。您可以指定篩選條件來排除結果、要傳回的項目數、分頁權杖，以及上次同步操作啟動的時間。
+  [ BatchGetItem ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-batch-get-item.html) - BatchGetItem 請求物件可讓您指示 DynamoDB 函數向 DynamoDB 提出 BatchGetItem 請求，以擷取可能跨多個資料表的多個項目。對於此請求物件，您必須指定要從中擷取項目的資料表名稱，以及要從每個資料表中擷取之項目的索引鍵。
+  [ BatchDeleteItem ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-batch-delete-item.html) - BatchDeleteItem 請求物件可讓您指示 DynamoDB 函數向 DynamoDB 提出 BatchWriteItem 請求，以刪除可能跨多個資料表的多個項目。對於此請求物件，您必須指定要從中刪除項目的資料表名稱，以及要從每個資料表中刪除之項目的索引鍵。
+  [ BatchPutItem ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-batch-put-item.html) - BatchPutItem 請求物件可讓您指示 DynamoDB 函數向 DynamoDB 提出 BatchWriteItem 請求，以放置多個項目，可能跨越多個資料表。對於此請求物件，您必須指定要放入項目的資料表名稱，以及要放入每個資料表的完整項目。
+  [ TransactGetItems ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-transact-get-items.html) - TransactGetItems 請求物件可讓您指示 DynamoDB 函數向 DynamoDB 提出 TransactGetItems 請求，以擷取可能跨多個資料表的多個項目。對於此請求物件，您必須指定每個請求項目的資料表名稱，以便從中擷取項目，以及每個請求項目的索引鍵，以便從每個資料表中擷取。
+  [ TransactWriteItems ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transact-write-items.html) - TransactWriteItems 請求物件可讓您指示 DynamoDB 函數向 DynamoDB 提出 TransactWriteItems 請求，以寫入多個項目，可能寫入多個資料表。對於此請求物件，您必須指定每個請求項目的目的地資料表名稱、要執行的每個請求項目的操作，以及要寫入的每個請求項目的索引鍵。
+  [ 類型系統 （請求映射） ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.html) - 進一步了解 DynamoDB 類型如何整合到 AWS AppSync 請求中。
+  [ 類型系統 （回應映射） ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses.html) - 進一步了解 DynamoDB 類型如何在回應承載中自動轉換為 GraphQL 或 JSON。
+  [篩選條件](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-filter.html) - 進一步了解查詢和掃描操作的篩選條件。
+  [ 條件表達式 ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-condition-expressions.html) - 進一步了解 PutItem、UpdateItem 和 DeleteItem 操作的條件表達式。
+  [ 交易條件表達式 ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-transaction-condition-expressions.html) - 進一步了解 TransactWriteItems 操作的條件表達式。
+  [ 投影 ](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-resolver-mapping-template-reference-dynamodb-projections.html) - 進一步了解如何在讀取操作中指定屬性。

# GetItem
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-getitem"></a>

`GetItem` 請求映射文件可讓您指示 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`GetItem`請求，並可讓您指定：
+ DynamoDB 中項目的索引鍵
+ 是否使用一致性讀取

`GetItem` 映射文件結構如下：

```
{
    "version" : "2017-02-28",
    "operation" : "GetItem",
    "key" : {
        "foo" : ... typed value,
        "bar" : ... typed value
    },
    "consistentRead" : true,
    "projection" : {
        ...
    }
}
```

欄位定義如下：

## GetItem 欄位
<a name="getitem-list"></a>

### GetItem 欄位清單
<a name="getitem-list-col"></a>

 **`version`**   
範本定義版本。目前支援 `2017-02-28` 和 `2018-05-29`。此值為必填。

 **`operation`**   
要執行的 DynamoDB 操作。若要執行 `GetItem` DynamoDB 操作，這必須設為 `GetItem`。此值為必填。

 **`key`**   
DynamoDB 中項目的索引鍵。DynamoDB 項目可能有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此值為必填。

 **`consistentRead`**   
是否使用 DynamoDB 執行強式一致讀取。此為選用，預設值為 `false`。

**`projection`**  
用於指定要從 DynamoDB 操作傳回之屬性的投影。如需投影的詳細資訊，請參閱[投影](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-projections)。此欄位為選用欄位。

從 DynamoDB 傳回的項目會自動轉換為 GraphQL 和 JSON 基本類型，並可在映射內容中使用 (`$context.result`)。

如需 DynamoDB 類型轉換的詳細資訊，請參閱[類型系統 （回應映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses.md)。

如需回應映射範本的詳細資訊，請參閱[解析程式映射範本概觀](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview)。

## 範例
<a name="example"></a>

下列範例是 GraphQL 查詢 的映射範本`getThing(foo: String!, bar: String!)`：

```
{
    "version" : "2017-02-28",
    "operation" : "GetItem",
    "key" : {
        "foo" : $util.dynamodb.toDynamoDBJson($ctx.args.foo),
        "bar" : $util.dynamodb.toDynamoDBJson($ctx.args.bar)
    },
    "consistentRead" : true
}
```

如需 DynamoDB `GetItem` API 的詳細資訊，請參閱 [DynamoDB API 文件](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)。

# PutItem
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-putitem"></a>

`PutItem` 請求映射文件可讓您指示 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`PutItem`請求，並可讓您指定下列項目：
+ DynamoDB 中項目的索引鍵
+ 項目 (由 `key` 和 `attributeValues` 組成) 的完整內容
+ 操作成功的條件

`PutItem` 映射文件結構如下：

```
{
    "version" : "2018-05-29",
    "operation" : "PutItem",
    "customPartitionKey" : "foo",
    "populateIndexFields" : boolean value,
    "key": {
        "foo" : ... typed value,
        "bar" : ... typed value
    },
    "attributeValues" : {
        "baz" : ... typed value
    },
    "condition" : {
       ...
    },
    "_version" : 1
}
```

欄位定義如下：

## PutItem 欄位
<a name="putitem-list"></a>

### PutItem 欄位清單
<a name="putitem-list-col"></a>

 **`version`**   
範本定義版本。目前支援 `2017-02-28` 和 `2018-05-29`。此值為必填。

 **`operation`**   
要執行的 DynamoDB 操作。若要執行 `PutItem` DynamoDB 操作，這必須設為 `PutItem`。此值為必填。

 **`key`**   
DynamoDB 中項目的索引鍵。DynamoDB 項目可能有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此值為必填。

 **`attributeValues`**   
將放入 DynamoDB 的項目其餘屬性。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此欄位為選用欄位。

 **`condition`**   
決定要求是否成功的條件，可根據已存在於 DynamoDB 的物件狀態。如果沒有指定條件，`PutItem` 要求會覆寫該項目的任何現有資料項目。如需條件的詳細資訊，請參閱[條件表達式](aws-appsync-resolver-mapping-template-reference-dynamodb-condition-expressions.md)。此值是選用的。

 **`_version`**   
代表項目之最新已知版本的數值。此值是選用的。此欄位用於*衝突偵測*，而且僅支援已建立版本的資料來源。

**`customPartitionKey`**  
啟用時，此字串值會修改啟用版本控制時差異同步資料表所使用的 `ds_sk`和 `ds_pk` 記錄格式 （如需詳細資訊，請參閱 *AWS AppSync 開發人員指南*中的[衝突偵測和同步](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html))。啟用時，也會啟用`populateIndexFields`項目的處理。此欄位為選用欄位。

**`populateIndexFields`**  
布林值，當 **與 啟用`customPartitionKey`**時，會為差異同步資料表中的每個記錄建立新的項目，特別是在 `gsi_ds_pk`和 `gsi_ds_sk`欄中。如需詳細資訊，請參閱 *AWS AppSync 開發人員指南*中的[衝突偵測和同步](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html)。此欄位為選用欄位。

寫入 DynamoDB 的項目會自動轉換為 GraphQL 和 JSON 基本類型，並可在映射內容中使用 (`$context.result`)。

如需 DynamoDB 類型轉換的詳細資訊，請參閱[類型系統 （回應映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses.md)。

如需回應映射範本的詳細資訊，請參閱[解析程式映射範本概觀](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview)。

## 範例 1
<a name="example-1"></a>

下列範例是 GraphQL 變動 的映射範本`updateThing(foo: String!, bar: String!, name: String!, version: Int!)`。

若無指定索引鍵的項目，則會建立該項目。若已有指定索引鍵的項目，則會覆寫該項目。

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "foo" : $util.dynamodb.toDynamoDBJson($ctx.args.foo),
        "bar" : $util.dynamodb.toDynamoDBJson($ctx.args.bar)
    },
    "attributeValues" : {
        "name"    : $util.dynamodb.toDynamoDBJson($ctx.args.name),
        "version" : $util.dynamodb.toDynamoDBJson($ctx.args.version)
    }
}
```

## 範例 2
<a name="example-2"></a>

下列範例是 GraphQL 變動 的映射範本`updateThing(foo: String!, bar: String!, name: String!, expectedVersion: Int!)`。

此範例會檢查以確定目前在 DynamoDB 中的項目已將 `version` 欄位設定為 `expectedVersion`。

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "foo" : $util.dynamodb.toDynamoDBJson($ctx.args.foo),
        "bar" : $util.dynamodb.toDynamoDBJson($ctx.args.bar)
    },
    "attributeValues" : {
        "name"    : $util.dynamodb.toDynamoDBJson($ctx.args.name),
        #set( $newVersion = $context.arguments.expectedVersion + 1 )
        "version" : $util.dynamodb.toDynamoDBJson($newVersion)
    },
    "condition" : {
        "expression" : "version = :expectedVersion",
        "expressionValues" : {
            ":expectedVersion" : $util.dynamodb.toDynamoDBJson($expectedVersion)
        }
    }
}
```

如需 DynamoDB `PutItem` API 的詳細資訊，請參閱 [DynamoDB API 文件](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)。

# UpdateItem
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem"></a>

`UpdateItem` 請求映射文件可讓您指示 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`UpdateItem`請求，並可讓您指定下列項目：
+ DynamoDB 中項目的索引鍵
+ 描述如何在 DynamoDB 中更新項目的更新表達式
+ 操作成功的條件

`UpdateItem` 映射文件結構如下：

```
{
    "version" : "2018-05-29",
    "operation" : "UpdateItem",
    "customPartitionKey" : "foo",
    "populateIndexFields" : boolean value,
    "key": {
        "foo" : ... typed value,
        "bar" : ... typed value
    },
    "update" : {
        "expression" : "someExpression",
        "expressionNames" : {
           "#foo" : "foo"
       },
       "expressionValues" : {
           ":bar" : ... typed value
       }
    },
    "condition" : {
        ...
    },
    "_version" : 1
}
```

欄位定義如下：

## UpdateItem 欄位
<a name="updateitem-list"></a>

### UpdateItem 欄位清單
<a name="updateitem-list-col"></a>

 **`version`**   
範本定義版本。目前支援 `2017-02-28` 和 `2018-05-29`。此值為必填。

 **`operation`**   
要執行的 DynamoDB 操作。若要執行 `UpdateItem` DynamoDB 操作，這必須設為 `UpdateItem`。此值為必填。

 **`key`**   
DynamoDB 中項目的索引鍵。DynamoDB 項目可能有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此值為必填。

 **`update`**   
`update` 本節可讓您指定更新表達式，說明如何在 DynamoDB 中更新項目。如需有關如何撰寫更新表達式的詳細資訊，請參閱 [DynamoDB UpdateExpressions 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html)。此區段是必須的。  
`update` 區段有三個元件：    
** `expression` **  
更新表達式。此值為必填。  
** `expressionNames` **  
表達式屬性 *name* 預留位置的替代，形式為鍵值組。金鑰對應至 中使用的名稱預留位置`expression`，且值必須是對應於 DynamoDB 中項目屬性名稱的字串。此欄位為選用的，應只能填入用於 `expression` 中表達式屬性名稱預留位置的替代。  
** `expressionValues` **  
表達式屬性 *value* 預留位置的替代，形式為鍵值組。鍵對應用於 `expression` 的值預留位置，值必須是類型值。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此必須指定。此欄位為選用的，應只能填入用於 `expression` 中表達式屬性值預留位置的替代。

 **`condition`**   
決定要求是否成功的條件，可根據已存在於 DynamoDB 的物件狀態。如果沒有指定條件，`UpdateItem` 要求會更新現有的資料項目，無論項目的目前狀態為何。如需條件的詳細資訊，請參閱[條件表達式](aws-appsync-resolver-mapping-template-reference-dynamodb-condition-expressions.md)。此值是選用的。

 **`_version`**   
代表項目之最新已知版本的數值。此值是選用的。此欄位用於*衝突偵測*，而且僅支援已建立版本的資料來源。

**`customPartitionKey`**  
啟用時，此字串值會修改啟用版本控制時差異同步資料表所使用的 `ds_sk`和 `ds_pk` 記錄格式 （如需詳細資訊，請參閱 *AWS AppSync 開發人員指南*中的[衝突偵測和同步](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html))。啟用時，也會啟用`populateIndexFields`項目的處理。此欄位為選用欄位。

**`populateIndexFields`**  
布林值，當 **與 啟用`customPartitionKey`**時，會為差異同步資料表中的每個記錄建立新的項目，特別是在 `gsi_ds_pk`和 `gsi_ds_sk`欄中。如需詳細資訊，請參閱 *AWS AppSync 開發人員指南*中的[衝突偵測和同步](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html)。此欄位為選用欄位。

DynamoDB 中更新的項目會自動轉換為 GraphQL 和 JSON 基本類型，並可在映射內容中使用 (`$context.result`)。

如需 DynamoDB 類型轉換的詳細資訊，請參閱[類型系統 （回應映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses.md)。

如需回應映射範本的詳細資訊，請參閱[解析程式映射範本概觀](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview)。

## 範例 1
<a name="id3"></a>

下列範例是 GraphQL 變動 的映射範本`upvote(id: ID!)`。

在此範例中，DynamoDB 中的項目的 `upvotes`和 `version` 欄位增量為 1。

```
{
    "version" : "2017-02-28",
    "operation" : "UpdateItem",
    "key" : {
        "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
    },
    "update" : {
        "expression" : "ADD #votefield :plusOne, version :plusOne",
        "expressionNames" : {
            "#votefield" : "upvotes"
        },
        "expressionValues" : {
            ":plusOne" : { "N" : 1 }
        }
    }
}
```

## 範例 2
<a name="id4"></a>

下列範例是 GraphQL 變動 的映射範本`updateItem(id: ID!, title: String, author: String, expectedVersion: Int!)`。

這個複雜的範例會檢查引數，並持續產生更新表達式，其只包含由用戶端提供的引數。例如，如果 `title` 和 `author` 遭到省略，則不會更新。如果指定 引數，但其值為 `null`，則該欄位會從 DynamoDB 中的物件中刪除。最後， 操作有一個條件，可驗證目前在 DynamoDB 中的項目是否將 `version` 欄位設定為 `expectedVersion`：

```
{
    "version" : "2017-02-28",

    "operation" : "UpdateItem",

    "key" : {
        "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
    },

    ## Set up some space to keep track of things we're updating **
    #set( $expNames  = {} )
    #set( $expValues = {} )
    #set( $expSet = {} )
    #set( $expAdd = {} )
    #set( $expRemove = [] )

    ## Increment "version" by 1 **
    $!{expAdd.put("version", ":newVersion")}
    $!{expValues.put(":newVersion", { "N" : 1 })}

    ## Iterate through each argument, skipping "id" and "expectedVersion" **
    #foreach( $entry in $context.arguments.entrySet() )
        #if( $entry.key != "id" && $entry.key != "expectedVersion" )
            #if( (!$entry.value) && ("$!{entry.value}" == "") )
                ## If the argument is set to "null", then remove that attribute from the item in DynamoDB **

                #set( $discard = ${expRemove.add("#${entry.key}")} )
                $!{expNames.put("#${entry.key}", "$entry.key")}
            #else
                ## Otherwise set (or update) the attribute on the item in DynamoDB **

                $!{expSet.put("#${entry.key}", ":${entry.key}")}
                $!{expNames.put("#${entry.key}", "$entry.key")}

                #if( $entry.key == "ups" || $entry.key == "downs" )
                    $!{expValues.put(":${entry.key}", { "N" : $entry.value })}
                #else
                    $!{expValues.put(":${entry.key}", { "S" : "${entry.value}" })}
                #end
            #end
        #end
    #end

    ## Start building the update expression, starting with attributes we're going to SET **
    #set( $expression = "" )
    #if( !${expSet.isEmpty()} )
        #set( $expression = "SET" )
        #foreach( $entry in $expSet.entrySet() )
            #set( $expression = "${expression} ${entry.key} = ${entry.value}" )
            #if ( $foreach.hasNext )
                #set( $expression = "${expression}," )
            #end
        #end
    #end

    ## Continue building the update expression, adding attributes we're going to ADD **
    #if( !${expAdd.isEmpty()} )
        #set( $expression = "${expression} ADD" )
        #foreach( $entry in $expAdd.entrySet() )
            #set( $expression = "${expression} ${entry.key} ${entry.value}" )
            #if ( $foreach.hasNext )
                #set( $expression = "${expression}," )
            #end
        #end
    #end

    ## Continue building the update expression, adding attributes we're going to REMOVE **
    #if( !${expRemove.isEmpty()} )
        #set( $expression = "${expression} REMOVE" )

        #foreach( $entry in $expRemove )
            #set( $expression = "${expression} ${entry}" )
            #if ( $foreach.hasNext )
                #set( $expression = "${expression}," )
            #end
        #end
    #end

    ## Finally, write the update expression into the document, along with any expressionNames and expressionValues **
    "update" : {
        "expression" : "${expression}"
        #if( !${expNames.isEmpty()} )
            ,"expressionNames" : $utils.toJson($expNames)
        #end
        #if( !${expValues.isEmpty()} )
            ,"expressionValues" : $utils.toJson($expValues)
        #end
    },

    "condition" : {
        "expression"       : "version = :expectedVersion",
        "expressionValues" : {
            ":expectedVersion" : $util.dynamodb.toDynamoDBJson($ctx.args.expectedVersion)
        }
    }
}
```

如需 DynamoDB `UpdateItem` API 的詳細資訊，請參閱 [DynamoDB API 文件](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)。

# DeleteItem
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-deleteitem"></a>

`DeleteItem` 請求映射文件可讓您指示 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`DeleteItem`請求，並可讓您指定下列項目：
+ DynamoDB 中項目的索引鍵
+ 操作成功的條件

`DeleteItem` 映射文件結構如下：

```
{
    "version" : "2018-05-29",
    "operation" : "DeleteItem",
    "customPartitionKey" : "foo",
    "populateIndexFields" : boolean value,
    "key": {
        "foo" : ... typed value,
        "bar" : ... typed value
    },
    "condition" : {
        ...
    },
    "_version" : 1
}
```

欄位定義如下：

## DeleteItem 欄位
<a name="deleteitem-list"></a>

### DeleteItem 欄位清單
<a name="deleteitem-list-col"></a>

** `version` **  
範本定義版本。目前支援 `2017-02-28` 和 `2018-05-29`。此值為必填。

** `operation` **  
要執行的 DynamoDB 操作。若要執行 `DeleteItem` DynamoDB 操作，這必須設為 `DeleteItem`。此值為必填。

** `key` **  
DynamoDB 中項目的索引鍵。DynamoDB 項目可能有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此值為必填。

** `condition` **  
決定要求是否成功的條件，可根據已存在於 DynamoDB 的物件狀態。如果沒有指定條件，`DeleteItem` 要求會刪除項目，無論該項目的目前狀態為何。如需條件的詳細資訊，請參閱[條件表達式](aws-appsync-resolver-mapping-template-reference-dynamodb-condition-expressions.md)。此值是選用的。

** `_version` **  
代表項目之最新已知版本的數值。此值是選用的。此欄位用於*衝突偵測*，而且僅支援已建立版本的資料來源。

**`customPartitionKey`**  
啟用時，此字串值會修改啟用版本控制時差異同步資料表所使用的 `ds_sk`和 `ds_pk` 記錄格式 （如需詳細資訊，請參閱 *AWS AppSync 開發人員指南*中的[衝突偵測和同步](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html))。啟用時，也會啟用`populateIndexFields`項目的處理。此欄位為選用欄位。

**`populateIndexFields`**  
布林值，當 **與 啟用`customPartitionKey`**時，會為差異同步資料表中的每個記錄建立新的項目，特別是在 `gsi_ds_pk`和 `gsi_ds_sk`欄中。如需詳細資訊，請參閱 *AWS AppSync 開發人員指南*中的[衝突偵測和同步](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html)。此欄位為選用欄位。

從 DynamoDB 刪除的項目會自動轉換為 GraphQL 和 JSON 基本類型，並可在映射內容中使用 (`$context.result`)。

如需 DynamoDB 類型轉換的詳細資訊，請參閱[類型系統 （回應映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses.md)。

如需回應映射範本的詳細資訊，請參閱[解析程式映射範本概觀](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview)。

## 範例 1
<a name="id6"></a>

下列範例是 GraphQL 變動 的映射範本`deleteItem(id: ID!)`。如果已存在此 ID 的項目，則該項目將會遭到刪除。

```
{
    "version" : "2017-02-28",
    "operation" : "DeleteItem",
    "key" : {
        "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
    }
}
```

## 範例 2
<a name="id7"></a>

下列範例是 GraphQL 變動 的映射範本`deleteItem(id: ID!, expectedVersion: Int!)`。如果已存在此 ID 的項目，則該項目將會遭到刪除，但其 `version` 欄位必須已設為 `expectedVersion`：

```
{
    "version" : "2017-02-28",
    "operation" : "DeleteItem",
    "key" : {
        "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
    },
    "condition" : {
        "expression"       : "attribute_not_exists(id) OR version = :expectedVersion",
        "expressionValues" : {
            ":expectedVersion" : $util.dynamodb.toDynamoDBJson($expectedVersion)
        }
    }
}
```

如需 DynamoDB `DeleteItem` API 的詳細資訊，請參閱 [DynamoDB API 文件](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html)。

# Query
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-query"></a>

`Query` 請求映射文件可讓您指示 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`Query`請求，並可讓您指定下列項目：
+ 索引鍵表達式
+ 要使用哪些索引
+ 任何額外篩選條件
+ 要傳回多少項目
+ 是否使用一致性讀取
+ 查詢方向 (向前或向後)
+ 分頁字符

`Query` 映射文件結構如下：

```
{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        "expression" : "some expression",
        "expressionNames" : {
            "#foo" : "foo"
        },
        "expressionValues" : {
            ":bar" : ... typed value
        }
    },
    "index" : "fooIndex",
    "nextToken" : "a pagination token",
    "limit" : 10,
    "scanIndexForward" : true,
    "consistentRead" : false,
    "select" : "ALL_ATTRIBUTES" | "ALL_PROJECTED_ATTRIBUTES" | "SPECIFIC_ATTRIBUTES",
    "filter" : {
        ...
    },
    "projection" : {
        ...
    }
}
```

欄位定義如下：

## 查詢欄位
<a name="query-list"></a>

### 查詢欄位清單
<a name="query-list-col"></a>

** `version` **  
範本定義版本。目前支援 `2017-02-28` 和 `2018-05-29`。此值為必填。

** `operation` **  
要執行的 DynamoDB 操作。若要執行 `Query` DynamoDB 操作，這必須設為 `Query`。此值為必填。

** `query` **  
`query` 本節可讓您指定金鑰條件表達式，描述要從 DynamoDB 擷取哪些項目。如需如何編寫索引鍵條件表達式的詳細資訊，請參閱 [DynamoDB KeyConditions 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html)。必須指定此區段。    
** `expression` **  
查詢表達式。必須指定此欄位。  
** `expressionNames` **  
表達式屬性 *name* 預留位置的替代，形式為鍵值組。金鑰對應至 中使用的名稱預留位置`expression`，且值必須是對應於 DynamoDB 中項目屬性名稱的字串。此欄位為選用的，應只能填入用於 `expression` 中表達式屬性名稱預留位置的替代。  
** `expressionValues` **  
表達式屬性 *value* 預留位置的替代，形式為鍵值組。鍵對應用於 `expression` 的值預留位置，值必須是類型值。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此值為必填。此欄位為選用的，應只能填入用於 `expression` 中表達式屬性值預留位置的替代。

** `filter` **  
額外的篩選條件可用來在傳回 DynamoDB 的結果之前先篩選結果。如需篩選條件的詳細資訊，請參閱[篩選條件](aws-appsync-resolver-mapping-template-reference-dynamodb-filter.md)。此欄位為選用欄位。

** `index` **  
要查詢的索引名稱。除了雜湊索引鍵的主索引鍵之外，DynamoDB 查詢操作還可讓您掃描本機次要索引和全域次要索引。如果指定，這會通知 DynamoDB 查詢指定的索引。若省略，則會查詢主索引鍵索引。

** `nextToken` **  
分頁字符將繼續先前的查詢。這會是從先前查詢所取得的。此欄位為選用欄位。

** `limit` **  
要評估的項目數上限 (不一定是相符的項目數)。此欄位為選用欄位。

** `scanIndexForward` **  
指出是否向前或向後查詢的布林值。此欄位為選用，預設值為 `true`。

** `consistentRead` **  
布林值，指出在查詢 DynamoDB 時是否使用一致讀取。此欄位為選用，預設值為 `false`。

** `select` **  
根據預設， AWS AppSync DynamoDB 解析程式只會傳回投影到索引中的屬性。如果需要更多屬性，請設定這個欄位。此欄位為選用欄位。支援的值是：    
** `ALL_ATTRIBUTES` **  
傳回所有指定資料表或索引的項目屬性。如果您查詢本機次要索引，DynamoDB 會從索引中每個相符項目的父資料表擷取整個項目。如果索引設定為投射所有項目屬性，所有資料都可從本機次要索引取得，不需進行任何擷取。  
** `ALL_PROJECTED_ATTRIBUTES` **  
只在查詢索引時才允許。擷取所有已投射到索引的屬性。如果索引設定為投射所有屬性，此傳回值相當於指定 `ALL_ATTRIBUTES`。  
**`SPECIFIC_ATTRIBUTES`**  
僅傳回 中列出的屬性`projection``expression`。此傳回值等同於指定 `projection`的 ，`expression`而不指定 的任何值`Select`。

**`projection`**  
用於指定要從 DynamoDB 操作傳回之屬性的投影。如需投影的詳細資訊，請參閱[投影](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-projections)。此欄位為選用欄位。

DynamoDB 的結果會自動轉換為 GraphQL 和 JSON 基本類型，並可在映射內容中使用 (`$context.result`)。

如需 DynamoDB 類型轉換的詳細資訊，請參閱[類型系統 （回應映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses.md)。

如需回應映射範本的詳細資訊，請參閱[解析程式映射範本概觀](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview)。

結果的結構如下：

```
{
    items = [ ... ],
    nextToken = "a pagination token",
    scannedCount = 10
}
```

欄位定義如下：

** `items` **  
包含 DynamoDB 查詢傳回項目的清單。

** `nextToken` **  
如果可能有一個以上的結果，`nextToken` 會包含可用於另一個要求的分頁字符。請注意， AWS AppSync 會加密和混淆從 DynamoDB 傳回的分頁字符。這樣可確保資料表的資料不會不慎洩漏給發起人。另請注意，這些分頁字符在不同解析程式之間無法使用。

** `scannedCount` **  
套用篩選條件表達式 (若有的話) 以前符合查詢條件表達式的項目數。

## 範例
<a name="id9"></a>

下列範例是 GraphQL 查詢 的映射範本`getPosts(owner: ID!)`。

在此範例中，資料表上的全域次要索引受到查詢，以傳回指定 ID 擁有的所有文章。

```
{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        "expression" : "ownerId = :ownerId",
        "expressionValues" : {
            ":ownerId" : $util.dynamodb.toDynamoDBJson($context.arguments.owner)
        }
    },
    "index" : "owner-index"
}
```

如需 DynamoDB `Query` API 的詳細資訊，請參閱 [DynamoDB API 文件](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)。

# Scan
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-scan"></a>

`Scan` 請求映射文件可讓您指示 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`Scan`請求，並可讓您指定下列項目：
+ 排除結果的篩選結果
+ 要使用哪些索引
+ 要傳回多少項目
+ 是否使用一致性讀取
+ 分頁字符
+ 平行掃描

`Scan` 映射文件結構如下：

```
{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "index" : "fooIndex",
    "limit" : 10,
    "consistentRead" : false,
    "nextToken" : "aPaginationToken",
    "totalSegments" : 10,
    "segment" : 1,
    "filter" : {
        ...
    },
    "projection" : {
        ...
    }
}
```

欄位定義如下：

## 掃描欄位
<a name="scan-list"></a>

### 掃描欄位清單
<a name="scan-list-col"></a>

** `version` **  
範本定義版本。目前支援 `2017-02-28` 和 `2018-05-29`。此值為必填。

** `operation` **  
要執行的 DynamoDB 操作。若要執行 `Scan` DynamoDB 操作，這必須設為 `Scan`。此值為必填。

** `filter` **  
在傳回 DynamoDB 的結果之前，可用來篩選結果的篩選條件。如需篩選條件的詳細資訊，請參閱[篩選條件](aws-appsync-resolver-mapping-template-reference-dynamodb-filter.md)。此欄位為選用欄位。

** `index` **  
要查詢的索引名稱。除了雜湊索引鍵的主索引鍵之外，DynamoDB 查詢操作還可讓您掃描本機次要索引和全域次要索引。如果指定，這會通知 DynamoDB 查詢指定的索引。若省略，則會查詢主索引鍵索引。

** `limit` **  
單次可評估的項目數量上限。此欄位為選用欄位。

** `consistentRead` **  
布林值，指出在查詢 DynamoDB 時是否使用一致讀取。此欄位為選用，預設值為 `false`。

** `nextToken` **  
分頁字符將繼續先前的查詢。這會是從先前查詢所取得的。此欄位為選用欄位。

** `select` **  
根據預設， AWS AppSync DynamoDB 解析程式只會傳回投影到索引中的任何屬性。如果需要更多屬性，則此欄位可以設定。此欄位為選用欄位。支援的值是：    
** `ALL_ATTRIBUTES` **  
傳回所有指定資料表或索引的項目屬性。如果您查詢本機次要索引，DynamoDB 會從索引中每個相符項目的父資料表擷取整個項目。如果索引設定為投射所有項目屬性，所有資料都可從本機次要索引取得，不需進行任何擷取。  
** `ALL_PROJECTED_ATTRIBUTES` **  
只在查詢索引時才允許。擷取所有已投射到索引的屬性。如果索引設定為投射所有屬性，此傳回值相當於指定 `ALL_ATTRIBUTES`。  
**`SPECIFIC_ATTRIBUTES`**  
僅傳回 中列出的屬性`projection``expression`。此傳回值等同於指定 `projection`的 ，`expression`而不指定 的任何值`Select`。

** `totalSegments` **  
執行平行掃描時分割資料表的區段數。此欄位為選用的，但若指定 `segment`，則此欄位必須指定。

** `segment` **  
此操作中執行平行掃描時的資料表區段。此欄位為選用的，但若指定 `totalSegments`，則此欄位必須指定。

**`projection`**  
用於指定要從 DynamoDB 操作傳回之屬性的投影。如需投影的詳細資訊，請參閱[投影](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-projections)。此欄位為選用欄位。

DynamoDB 掃描傳回的結果會自動轉換為 GraphQL 和 JSON 基本類型，並可在映射內容中使用 (`$context.result`)。

如需 DynamoDB 類型轉換的詳細資訊，請參閱[類型系統 （回應映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses.md)。

如需回應映射範本的詳細資訊，請參閱[解析程式映射範本概觀](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview)。

結果的結構如下：

```
{
    items = [ ... ],
    nextToken = "a pagination token",
    scannedCount = 10
}
```

欄位定義如下：

** `items` **  
包含 DynamoDB 掃描傳回項目的清單。

** `nextToken` **  
如果結果可能更多， `nextToken` 包含一個分頁字符，您可以在另一個請求中使用。 AWS AppSync 會加密和混淆從 DynamoDB 傳回的分頁字符。這樣可確保資料表的資料不會不慎洩漏給發起人。此外，這些分頁字符在不同解析程式之間無法使用。

** `scannedCount` **  
在套用篩選條件表達式 （如果有） 之前，DynamoDB 擷取的項目數量。

## 範例 1
<a name="id11"></a>

下列範例是 GraphQL 查詢的映射範本：`allPosts`。

在此範例中，資料表中的所有項目都會傳回。

```
{
    "version" : "2017-02-28",
    "operation" : "Scan"
}
```

## 範例 2
<a name="id12"></a>

下列範例是 GraphQL 查詢的映射範本：`postsMatching(title: String!)`。

在此範例中，資料表中開頭為 `title` 引數的所有項目都會傳回。

```
{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "filter" : {
        "expression" : "begins_with(title, :title)",
        "expressionValues" : {
            ":title" : $util.dynamodb.toDynamoDBJson($context.arguments.title)
        },
    }
}
```

如需 DynamoDB `Scan` API 的詳細資訊，請參閱 [DynamoDB API 文件](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)。

# Sync
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-sync"></a>

`Sync` 請求映射文件可讓您從 DynamoDB 資料表擷取所有結果，然後只接收自上次查詢後變更的資料 （差異更新）。 `Sync` 請求只能對版本控制的 DynamoDB 資料來源提出。您可以指定下列項目：
+ 排除結果的篩選結果
+ 要傳回多少項目
+ 分頁字符
+ 上次起始 `Sync` 操作時

`Sync` 映射文件結構如下：

```
{
    "version" : "2018-05-29",
    "operation" : "Sync",
    "basePartitionKey": "Base Tables PartitionKey",
    "deltaIndexName": "delta-index-name",
    "limit" : 10,
    "nextToken" : "aPaginationToken",
    "lastSync" :  1550000000000,
    "filter" : {
        ...
    }
}
```

欄位定義如下：

## 同步欄位
<a name="sync-list"></a>

### 同步欄位清單
<a name="sync-list-col"></a>

** `version` **  
範本定義的版本。目前僅支援 `2018-05-29`。此值為必填。

** `operation` **  
要執行的 DynamoDB 操作。若要執行 `Sync` 操作，這必須設定為 `Sync`。此值為必填。

** `filter` **  
在傳回 DynamoDB 的結果之前，可用來篩選結果的篩選條件。如需篩選條件的詳細資訊，請參閱[篩選條件](aws-appsync-resolver-mapping-template-reference-dynamodb-filter.md)。此欄位為選用欄位。

** `limit` **  
單次可評估的項目數量上限。此欄位為選用欄位。如果省略此值，預設限制將設為 `100` 個項目。此欄位的最大值為 `1000` 個項目。

** `nextToken` **  
分頁字符將繼續先前的查詢。這會是從先前查詢所取得的。此欄位為選用欄位。

** `lastSync` **  
上次成功啟動 `Sync` 操作的時間 (以毫秒為單位)。如果指定此值，只會傳回 `lastSync` 之後變更的項目。這個欄位是選用的，而且只有在初始 `Sync` 操作擷取所有頁面之後才能填入。如果省略此值，將傳回 *Base* 資料表的結果，否則會傳回 *Delta* 資料表的結果。

**`basePartitionKey`**  
執行`Sync`操作時使用之 *Base* 資料表的分割區索引鍵。此欄位允許在資料表使用自訂分割區索引鍵時執行`Sync`操作。此為選用欄位。

**`deltaIndexName`**  
用於 `Sync`操作的索引。當資料表使用自訂分割區索引鍵時，需要此索引才能在整個差異存放區資料表上啟用`Sync`操作。`Sync` 操作將在 GSI 上執行 （在 `gsi_ds_pk`和 上建立`gsi_ds_sk`)。此欄位為選用欄位。

DynamoDB 同步傳回的結果會自動轉換為 GraphQL 和 JSON 基本類型，並可在映射內容中使用 (`$context.result`)。

如需 DynamoDB 類型轉換的詳細資訊，請參閱[類型系統 （回應映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses.md)。

如需回應映射範本的詳細資訊，請參閱[解析程式映射範本概觀](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview)。

結果的結構如下：

```
{
    items = [ ... ],
    nextToken = "a pagination token",
    scannedCount = 10,
    startedAt = 1550000000000
}
```

欄位定義如下：

** `items` **  
包含同步傳回項目的清單。

** `nextToken` **  
如果結果可能更多， `nextToken` 包含一個分頁字符，您可以在另一個請求中使用。 AWS AppSync 會加密和混淆從 DynamoDB 傳回的分頁字符。這樣可確保資料表的資料不會不慎洩漏給發起人。此外，這些分頁字符在不同解析程式之間無法使用。

** `scannedCount` **  
在套用篩選條件表達式 （如果有） 之前，DynamoDB 擷取的項目數量。

** `startedAt` **  
開始同步操作時，可以在本機存放並在另一個請求中做為 `lastSync` 引數的時間 (以 epoch 毫秒為單位)。如果請求中包含分頁字符，則該值將與請求針對第一頁結果傳回的值相同。

## 範例
<a name="id14"></a>

下列範例是 GraphQL 查詢的映射範本：`syncPosts(nextToken: String, lastSync: AWSTimestamp)`。

在此範例中，如果省略 `lastSync`，則會傳回 Base 資料表中的所有項目。如果提供 `lastSync`，只會傳回自 `lastSync` 變更之 Delta Sync 資料表中的項目。

```
{
    "version" : "2018-05-29",
    "operation" : "Sync",
    "limit": 100,
    "nextToken": $util.toJson($util.defaultIfNull($ctx.args.nextToken, null)),
    "lastSync": $util.toJson($util.defaultIfNull($ctx.args.lastSync, null))
}
```

# BatchGetItem
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-batch-get-item"></a>

`BatchGetItem` 請求映射文件可讓您告知 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`BatchGetItem`請求，以擷取可能跨多個資料表的多個項目。使用此要求範本時，您必須指定下列項目：
+ 將從其中擷取項目的資料表名稱
+ 將從個別資料表擷取項目的索引鍵

此時會套用 DynamoDB `BatchGetItem` 限制，且可能不會提供**任何條件表達式**。

`BatchGetItem` 映射文件結構如下：

```
{
    "version" : "2018-05-29",
    "operation" : "BatchGetItem",
    "tables" : {
        "table1": {
           "keys": [
              ## Item to retrieve Key
              {
                   "foo" : ... typed value,
                   "bar" : ... typed value
              },
              ## Item2 to retrieve Key
              {
                   "foo" : ... typed value,
                   "bar" : ... typed value
              }
            ],
            "consistentRead": true|false,            
            "projection" : {
                 ...
            }
        },
        "table2": {
           "keys": [
              ## Item3 to retrieve Key
              {
                   "foo" : ... typed value,
                   "bar" : ... typed value
              },
              ## Item4 to retrieve Key
              {
                   "foo" : ... typed value,
                   "bar" : ... typed value
              }
            ],
            "consistentRead": true|false,
            "projection" : {
                 ...
            }
        }
    }
}
```

欄位定義如下：

## BatchGetItem 欄位
<a name="BatchGetItem-list"></a>

### BatchGetItem 欄位清單
<a name="BatchGetItem-list-col"></a>

** `version` **  
範本定義的版本。僅支援 `2018-05-29`。此值為必填。

** `operation` **  
要執行的 DynamoDB 操作。若要執行 `BatchGetItem` DynamoDB 操作，這必須設為 `BatchGetItem`。此值為必填。

** `tables` **  
要從中擷取項目的 DynamoDB 資料表。此值是其中將資料表名稱指定為該映射索引鍵的映射。至少必須提供一個資料表。`tables` 值為必填。    
** `keys` **  
代表要擷取之項目主索引鍵的 DynamoDB 索引鍵清單。DynamoDB 項目可能具有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。  
** `consistentRead` **  
執行 *GetItem* 操作時是否使用一致性讀取。此值為選用值，且預設值為 *false*。  
**`projection`**  
用於指定要從 DynamoDB 操作傳回之屬性的投影。如需投影的詳細資訊，請參閱[投影](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-projections)。此欄位為選用欄位。

注意事項：
+ 如果未從資料表中擷取任何項目，該資料表的 data 區塊中會顯示 *null* 元素。
+ 調用結果會根據在請求映射範本中提供的順序，依資料表排序。
+ 中的每個`Get`命令`BatchGetItem`都是原子的，但批次可以部分處理。如果因錯誤而部分批次處理，則未處理的索引鍵會透過 *unprocessedKeys* 區塊傳回為部分的呼叫結果。
+  `BatchGetItem` 限制為 100 個索引鍵。

使用下列範例要求映射範本時：

```
{
  "version": "2018-05-29",
  "operation": "BatchGetItem",
  "tables": {
    "authors": [
        {
          "author_id": {
            "S": "a1"
          }
        },
    ],
    "posts": [
        {
          "author_id": {
            "S": "a1"
          },
          "post_id": {
            "S": "p2"
          }
        }
    ],
  }
}
```

可透過 `$ctx.result` 提供的呼叫結果如下所示：

```
{
   "data": {
     "authors": [null],
     "posts": [
        # Was retrieved
        {
          "author_id": "a1",
          "post_id": "p2",
          "post_title": "title",
          "post_description": "description",
        }
     ]
   },
   "unprocessedKeys": {
     "authors": [
        # This item was not processed due to an error
        {
          "author_id": "a1"
        }
      ],
     "posts": []
   }
}
```

`$ctx.error` 包含錯誤的詳細資訊。在要求映射範本中所提供的索引鍵 **data**、**unprocessedKeys** 及個別資料表索引鍵，都確定會出現在呼叫結果中。已刪除的項目會出現在 **data** 區塊中。尚未處理的項目在該 data 區塊中會標示為 *null*，並置於 **unprocessedKeys** 區塊。

如需更完整的範例，請遵循此處 AppSync 的 DynamoDB 批次教學[課程教學課程：DynamoDB 批次解析程式](tutorial-dynamodb-batch.md#aws-appsync-tutorial-dynamodb-batch)。

# BatchDeleteItem
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-batch-delete-item"></a>

`BatchDeleteItem` 請求映射文件可讓您告知 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出刪除多個項目的`BatchWriteItem`請求，可能跨越多個資料表。使用此要求範本時，您必須指定下列項目：
+ 將從其中刪除項目的資料表名稱
+ 將從個別資料表刪除項目的索引鍵

此時會套用 DynamoDB `BatchWriteItem` 限制，且可能不會提供**任何條件表達式**。

`BatchDeleteItem` 映射文件結構如下：

```
{
    "version" : "2018-05-29",
    "operation" : "BatchDeleteItem",
    "tables" : {
        "table1": [
        ## Item to delete Key
        {
             "foo" : ... typed value,
             "bar" : ... typed value
        },
        ## Item2 to delete Key
        {
             "foo" : ... typed value,
             "bar" : ... typed value
        }],
        "table2": [
        ## Item3 to delete Key
        {
             "foo" : ... typed value,
             "bar" : ... typed value
        },
        ## Item4 to delete Key
        {
             "foo" : ... typed value,
             "bar" : ... typed value
        }],
    }
}
```

欄位定義如下：

## BatchDeleteItem 欄位
<a name="BatchDeleteItem-list"></a>

### BatchDeleteItem 欄位清單
<a name="BatchDeleteItem-list-col"></a>

** `version` **  
範本定義的版本。僅支援 `2018-05-29`。此值為必填。

** `operation` **  
要執行的 DynamoDB 操作。若要執行 `BatchDeleteItem` DynamoDB 操作，這必須設為 `BatchDeleteItem`。此值為必填。

** `tables` **  
要從中刪除項目的 DynamoDB 資料表。每個資料表都是代表要刪除項目之主索引鍵的 DynamoDB 索引鍵清單。DynamoDB 項目可能具有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。至少必須提供一個資料表。`tables` 值為必要。

注意事項：
+ 不同於 `DeleteItem` 操作，回應中未傳回完整刪除的項目。只會傳回已傳遞的索引鍵。
+ 如果資料表中未刪除任何項目，該資料表的 data 區塊中就會顯示 *null* 元素。
+ 調用結果會根據在請求映射範本中提供的順序，依資料表排序。
+ 中的每個`Delete`命令`BatchDeleteItem`都是原子的。但是，批次可以部分處理。如果因錯誤而部分批次處理，則未處理的索引鍵會透過 *unprocessedKeys* 區塊傳回為部分的呼叫結果。
+  `BatchDeleteItem` 限制為 25 個索引鍵。
+ 與衝突偵測搭配使用時，**不支援**此操作。同時使用兩者可能會導致錯誤。

使用下列範例要求映射範本時：

```
{
  "version": "2018-05-29",
  "operation": "BatchDeleteItem",
  "tables": {
    "authors": [
        {
          "author_id": {
            "S": "a1"
          }
        },
    ],
    "posts": [
        {
          "author_id": {
            "S": "a1"
          },
          "post_id": {
            "S": "p2"
          }
        }
    ],
  }
}
```

可透過 `$ctx.result` 提供的呼叫結果如下所示：

```
{
   "data": {
     "authors": [null],
     "posts": [
        # Was deleted
        {
          "author_id": "a1",
          "post_id": "p2"
        }
     ]
   },
   "unprocessedKeys": {
     "authors": [
        # This key was not processed due to an error
        {
          "author_id": "a1"
        }
      ],
     "posts": []
   }
}
```

`$ctx.error` 包含錯誤的詳細資訊。在要求映射範本中所提供的索引鍵 **data**、**unprocessedKeys** 及個別資料表索引鍵，都確定會出現在呼叫結果中。已刪除的項目會出現在 **data** 區塊中。尚未處理的項目在該 data 區塊中會標示為 *null*，並置於 **unprocessedKeys** 區塊。

如需更完整的範例，請遵循此處 AppSync 的 DynamoDB 批次教學[課程教學課程：DynamoDB 批次解析程式](tutorial-dynamodb-batch.md#aws-appsync-tutorial-dynamodb-batch)。

# BatchPutItem
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-batch-put-item"></a>

`BatchPutItem` 請求映射文件可讓您指示 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`BatchWriteItem`請求，以放置多個項目，可能跨越多個資料表。使用此要求範本時，您必須指定下列項目：
+ 項目將放入其中的資料表名稱
+ 將放入每個資料表的所有項目

此時會套用 DynamoDB `BatchWriteItem` 限制，且可能不會提供**任何條件表達式**。

`BatchPutItem` 映射文件結構如下：

```
{
    "version" : "2018-05-29",
    "operation" : "BatchPutItem",
    "tables" : {
        "table1": [
        ## Item to put
        {
             "foo" : ... typed value,
             "bar" : ... typed value
        },
        ## Item2 to put
        {
             "foo" : ... typed value,
             "bar" : ... typed value
        }],
        "table2": [
        ## Item3 to put
        {
             "foo" : ... typed value,
             "bar" : ... typed value
        },
        ## Item4 to put
        {
             "foo" : ... typed value,
             "bar" : ... typed value
        }],
    }
}
```

欄位定義如下：

## BatchPutItem 欄位
<a name="BatchPutItem-list"></a>

### BatchPutItem 欄位清單
<a name="BatchPutItem-list-col"></a>

** `version` **  
範本定義的版本。僅支援 `2018-05-29`。此值為必填。

** `operation` **  
要執行的 DynamoDB 操作。若要執行 `BatchPutItem` DynamoDB 操作，這必須設為 `BatchPutItem`。此值為必填。

** `tables` **  
要放入項目的 DynamoDB 資料表。每個資料表項目代表要為此特定資料表插入的 DynamoDB 項目清單。至少必須提供一個資料表。此值為必填。

注意事項：
+ 若插入成功，回應會傳回完全插入的項目。
+ 如果資料表中並未插入任何項目，該資料表的 data 區塊中就會顯示 *null* 元素。
+ 插入的項目會根據在請求映射範本中提供的順序，依資料表排序。
+ 不過， 內的每個`Put`命令`BatchPutItem`都是原子的，但可以部分處理批次。如果因錯誤而部分批次處理，則未處理的索引鍵會透過 *unprocessedKeys* 區塊傳回為部分的呼叫結果。
+  `BatchPutItem` 限制為 25 個項目。
+ 與衝突偵測搭配使用時，**不支援**此操作。同時使用兩者可能會導致錯誤。

使用下列範例要求映射範本時：

```
{
  "version": "2018-05-29",
  "operation": "BatchPutItem",
  "tables": {
    "authors": [
        {
          "author_id": {
            "S": "a1"
          },
          "author_name": {
            "S": "a1_name"
          }
        },
    ],
    "posts": [
        {
          "author_id": {
            "S": "a1"
          },
          "post_id": {
            "S": "p2"
          },
          "post_title": {
            "S": "title"
          }
        }
    ],
  }
}
```

可透過 `$ctx.result` 提供的呼叫結果如下所示：

```
{
   "data": {
     "authors": [
         null
     ],
     "posts": [
        # Was inserted
        {
          "author_id": "a1",
          "post_id": "p2",
          "post_title": "title"
        }
     ]
   },
   "unprocessedItems": {
     "authors": [
        # This item was not processed due to an error
        {
          "author_id": "a1",
          "author_name": "a1_name"
        }
      ],
     "posts": []
   }
}
```

`$ctx.error` 包含錯誤的詳細資訊。在要求映射範本中所提供的索引鍵 **data**、**unprocessedItems** 及個別資料表索引鍵，都確定會出現在呼叫結果中。已插入的項目會出現在 **data** 區塊中。尚未處理的項目在該 data 區塊中會標示為 *null*，並置於 **unprocessedItems** 區塊。

如需更完整的範例，請依照 DynamoDB Batch 教學搭配 AppSync here [Tutorial： DynamoDB 批次解析程式](tutorial-dynamodb-batch.md#aws-appsync-tutorial-dynamodb-batch)。

# TransactGetItems
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-transact-get-items"></a>

`TransactGetItems` 請求映射文件可讓您指示 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`TransactGetItems`請求，以擷取可能跨多個資料表的多個項目。使用此要求範本時，您必須指定下列項目：
+ 從中擷取項目之每個請求項目的資料表名稱
+ 從每個資料表擷取之每個請求項目的索引鍵

此時會套用 DynamoDB `TransactGetItems` 限制，且可能不會提供**任何條件表達式**。

`TransactGetItems` 映射文件結構如下：

```
{
    "version": "2018-05-29",
    "operation": "TransactGetItems",
    "transactItems": [
       ## First request item
       {
           "table": "table1",
           "key": {
               "foo": ... typed value,
               "bar": ... typed value
           },
           "projection" : {
                ...
           }
       },
       ## Second request item
       {
           "table": "table2",
           "key": {
               "foo": ... typed value,
               "bar": ... typed value
           },
           "projection" : {
                ...
           }
       }
    ]
}
```

欄位定義如下：

## TransactGetItems 欄位
<a name="TransactGetItems-list"></a>

### TransactGetItems 欄位清單
<a name="TransactGetItems-list-col"></a>

** `version` **  
範本定義的版本。僅支援 `2018-05-29`。此值為必填。

** `operation` **  
要執行的 DynamoDB 操作。若要執行 `TransactGetItems` DynamoDB 操作，這必須設為 `TransactGetItems`。此值為必填。

** `transactItems` **  
要包含的請求項目。此值是請求項目的陣列。必須提供至少一個請求項目。`transactItems` 值為必填。    
** `table` **  
要從中擷取項目的 DynamoDB 資料表。此值是資料表名稱的字串。`table` 值為必填。  
** `key` **  
代表要擷取之項目主索引鍵的 DynamoDB 索引鍵。DynamoDB 項目可能具有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。  
**`projection`**  
用於指定要從 DynamoDB 操作傳回之屬性的投影。如需投影的詳細資訊，請參閱[投影](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-projections)。此欄位為選用欄位。

注意事項：
+ 如果交易成功，`items` 區塊中擷取項目的順序會與請求項目的順序相同。
+ 以全有或全無的方式執行交易。如果任何請求項目造成錯誤，將不執行整個交易，而且將傳回錯誤詳細資料。
+ 無法擷取的請求項目不是錯誤。相反地，*null* 元素會出現在對應位置的*項目*區塊。
+ 如果交易錯誤是 *TransactionCanceledException*，則會填入 `cancellationReasons` 區塊。`cancellationReasons` 區塊中取消原因的順序將與請求項目的順序相同。
+  `TransactGetItems` 限制為 100 個請求項目。

使用下列範例要求映射範本時：

```
{
    "version": "2018-05-29",
    "operation": "TransactGetItems",
    "transactItems": [
       ## First request item
       {
           "table": "posts",
           "key": {
               "post_id": {
                 "S": "p1"
               }
           }
       },
       ## Second request item
       {
           "table": "authors",
           "key": {
               "author_id": {
                 "S": a1
               }
           }
       }
    ]
}
```

如果交易成功，而且僅擷取第一個請求項目，則 `$ctx.result` 中的可用叫用結果如下所示：

```
{
    "items": [
       {
           // Attributes of the first requested item
           "post_id": "p1",
           "post_title": "title",
           "post_description": "description"
       },
       // Could not retrieve the second requested item
       null,
    ],
    "cancellationReasons": null
}
```

如果因為第一個請求項目造成的 *TransactionCanceledException* 造成交易失敗，則 `$ctx.result` 中的可用叫用結果如下所示：

```
{
    "items": null,
    "cancellationReasons": [
       {
           "type":"Sample error type",
           "message":"Sample error message"
       },
       {
           "type":"None",
           "message":"None"
       }
    ]
}
```

`$ctx.error` 包含錯誤的詳細資訊。索引鍵 **items** 和 **cancellationReasons** 保證出現在 `$ctx.result` 中。

如需更完整的範例，請依照 DynamoDB 交易教學搭配 AppSync here [Tutorial： DynamoDB 交易解析程式](tutorial-dynamodb-transact.md#aws-appsync-tutorial-dynamodb-transact)。

# TransactWriteItems
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-transact-write-items"></a>

`TransactWriteItems` 請求映射文件可讓您指示 AWS AppSync DynamoDB 解析程式向 DynamoDB 提出`TransactWriteItems`請求，以寫入多個項目，可能寫入多個資料表。使用此要求範本時，您必須指定下列項目：
+ 每個請求項目的目標資料表名稱
+ 每個請求項目要執行的操作。有四種支援的操作類型：*PutItem*、*UpdateItem*、*DeleteItem* 以及 *ConditionCheck* 
+ 每個要寫入之請求項目的索引鍵

套用 DynamoDB `TransactWriteItems` 限制。

`TransactWriteItems` 映射文件結構如下：

```
{
    "version": "2018-05-29",
    "operation": "TransactWriteItems",
    "transactItems": [
       {
           "table": "table1",
           "operation": "PutItem",
           "key": {
               "foo": ... typed value,
               "bar": ... typed value
           },
           "attributeValues": {
               "baz": ... typed value
           },
           "condition": {
               "expression": "someExpression",
               "expressionNames": {
                   "#foo": "foo"
               },
               "expressionValues": {
                   ":bar": ... typed value
               },
               "returnValuesOnConditionCheckFailure": true|false
           }
       },
       {
           "table":"table2",
           "operation": "UpdateItem",
           "key": {
               "foo": ... typed value,
               "bar": ... typed value
           },
           "update": {
               "expression": "someExpression",
               "expressionNames": {
                   "#foo": "foo"
               },
               "expressionValues": {
                   ":bar": ... typed value
               }
           },
           "condition": {
               "expression": "someExpression",
               "expressionNames": {
                   "#foo":"foo"
               },
               "expressionValues": {
                   ":bar": ... typed value
               },
               "returnValuesOnConditionCheckFailure": true|false
           }
       },
       {
           "table": "table3",
           "operation": "DeleteItem",
           "key":{
               "foo": ... typed value,
               "bar": ... typed value
           },
           "condition":{
               "expression": "someExpression",
               "expressionNames": {
                   "#foo": "foo"
               },
               "expressionValues": {
                   ":bar": ... typed value
               },
               "returnValuesOnConditionCheckFailure": true|false
           }
       },
       {
           "table": "table4",
           "operation": "ConditionCheck",
           "key":{
               "foo": ... typed value,
               "bar": ... typed value
           },
           "condition":{
               "expression": "someExpression",
               "expressionNames": {
                   "#foo": "foo"
               },
               "expressionValues": {
                   ":bar": ... typed value
               },
               "returnValuesOnConditionCheckFailure": true|false
           }
       }
    ]
}
```

## TransactWriteItems 欄位
<a name="TransactWriteItems-list"></a>

### TransactWriteItems 欄位清單
<a name="TransactWriteItems-list-col"></a>

**欄位定義如下：**    
** `version` **  
範本定義的版本。僅支援 `2018-05-29`。此值為必填。  
** `operation` **  
要執行的 DynamoDB 操作。若要執行 `TransactWriteItems` DynamoDB 操作，這必須設為 `TransactWriteItems`。此值為必填。  
** `transactItems` **  
要包含的請求項目。此值是請求項目的陣列。必須提供至少一個請求項目。`transactItems` 值為必填。  
對於 `PutItem`，欄位定義如下：    
** `table` **  
目的地 DynamoDB 資料表。此值是資料表名稱的字串。`table` 值為必填。  
** `operation` **  
要執行的 DynamoDB 操作。若要執行 `PutItem` DynamoDB 操作，這必須設為 `PutItem`。此值為必填。  
** `key` **  
代表要放置之項目主索引鍵的 DynamoDB 索引鍵。DynamoDB 項目可能具有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此值為必填。  
** `attributeValues` **  
將放入 DynamoDB 的項目其餘屬性。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此欄位為選用欄位。  
** `condition` **  
決定要求是否成功的條件，可根據已存在於 DynamoDB 的物件狀態。如果沒有指定條件，`PutItem` 要求會覆寫該項目的任何現有資料項目。您可以指定在條件檢查失敗時是否擷取現有項目。如需交易條件的詳細資訊，請參閱[交易條件表達式](aws-appsync-resolver-mapping-template-reference-dynamodb-transaction-condition-expressions.md)。此值是選用的。
對於 `UpdateItem`，欄位定義如下：    
** `table` **  
要更新的 DynamoDB 資料表。此值是資料表名稱的字串。`table` 值為必填。  
** `operation` **  
要執行的 DynamoDB 操作。若要執行 `UpdateItem` DynamoDB 操作，這必須設為 `UpdateItem`。此值為必填。  
** `key` **  
代表要更新之項目主索引鍵的 DynamoDB 索引鍵。DynamoDB 項目可能具有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此值為必填。  
** `update` **  
`update` 本節可讓您指定更新表達式，描述如何在 DynamoDB 中更新項目。如需有關如何撰寫更新表達式的詳細資訊，請參閱 [DynamoDB UpdateExpressions 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html)。此區段是必須的。  
** `condition` **  
決定要求是否成功的條件，可根據已存在於 DynamoDB 的物件狀態。如果沒有指定條件，`UpdateItem` 要求會更新現有的資料項目，無論項目的目前狀態為何。您可以指定在條件檢查失敗時是否擷取現有項目。如需交易條件的詳細資訊，請參閱[交易條件表達式](aws-appsync-resolver-mapping-template-reference-dynamodb-transaction-condition-expressions.md)。此值是選用的。
對於 `DeleteItem`，欄位定義如下：    
** `table` **  
要在其中刪除項目的 DynamoDB 資料表。此值是資料表名稱的字串。`table` 值為必填。  
** `operation` **  
要執行的 DynamoDB 操作。若要執行 `DeleteItem` DynamoDB 操作，這必須設為 `DeleteItem`。此值為必填。  
** `key` **  
代表要刪除之項目主索引鍵的 DynamoDB 索引鍵。DynamoDB 項目可能具有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此值為必填。  
** `condition` **  
決定要求是否成功的條件，可根據已存在於 DynamoDB 的物件狀態。如果沒有指定條件，`DeleteItem` 要求會刪除項目，無論該項目的目前狀態為何。您可以指定在條件檢查失敗時是否擷取現有項目。如需交易條件的詳細資訊，請參閱[交易條件表達式](aws-appsync-resolver-mapping-template-reference-dynamodb-transaction-condition-expressions.md)。此值是選用的。
對於 `ConditionCheck`，欄位定義如下：    
** `table` **  
要檢查條件的 DynamoDB 資料表。此值是資料表名稱的字串。`table` 值為必填。  
** `operation` **  
要執行的 DynamoDB 操作。若要執行 `ConditionCheck` DynamoDB 操作，這必須設為 `ConditionCheck`。此值為必填。  
** `key` **  
代表要條件檢查之項目主索引鍵的 DynamoDB 索引鍵。DynamoDB 項目可能具有單一雜湊索引鍵，或雜湊索引鍵和排序索引鍵，視資料表結構而定。如需如何指定「輸入值」的詳細資訊，請參閱[類型系統 （請求映射）](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此值為必填。  
** `condition` **  
決定要求是否成功的條件，可根據已存在於 DynamoDB 的物件狀態。您可以指定在條件檢查失敗時是否擷取現有項目。如需交易條件的詳細資訊，請參閱[交易條件表達式](aws-appsync-resolver-mapping-template-reference-dynamodb-transaction-condition-expressions.md)。此值為必填。

注意事項：
+ 如果成功，只會在回應中傳回請求項目的索引鍵。索引鍵的順序將與請求項目的順序相同。
+ 以全有或全無的方式執行交易。如果任何請求項目造成錯誤，將不執行整個交易，而且將傳回錯誤詳細資料。
+ 沒有兩個請求項目可以定位到相同項目。否則，它們將造成 *TransactionCanceledException* 錯誤。
+ 如果交易錯誤是 *TransactionCanceledException*，則會填入 `cancellationReasons` 區塊。如果請求項目的條件檢查失敗，**而且**您未將 `returnValuesOnConditionCheckFailure` 指定為 `false`，將擷取資料表中存在的項目，並存放在 `cancellationReasons` 區塊之對應位置的 `item` 中。
+  `TransactWriteItems` 限制為 100 個請求項目。
+ 與衝突偵測搭配使用時，**不支援**此操作。同時使用兩者可能會導致錯誤。

使用下列範例要求映射範本時：

```
{
    "version": "2018-05-29",
    "operation": "TransactWriteItems",
    "transactItems": [
       {
           "table": "posts",
           "operation": "PutItem",
           "key": {
               "post_id": {
                   "S": "p1"
               }
           },
           "attributeValues": {
               "post_title": {
                   "S": "New title"
               },
               "post_description": {
                   "S": "New description"
               }
           },
           "condition": {
               "expression": "post_title = :post_title",
               "expressionValues": {
                   ":post_title": {
                       "S": "Expected old title"
                   }
               }
           }
       },
       {
           "table":"authors",
           "operation": "UpdateItem",
           "key": {
               "author_id": {
                   "S": "a1"
               },
           },
           "update": {
               "expression": "SET author_name = :author_name",
               "expressionValues": {
                   ":author_name": {
                       "S": "New name"
                   }
               }
           },
       }
    ]
}
```

如果交易成功，`$ctx.result` 中可用的叫用結果如下所示：

```
{
    "keys": [
       // Key of the PutItem request
       {
           "post_id": "p1",
       },
       // Key of the UpdateItem request
       {
           "author_id": "a1"
       }
    ],
    "cancellationReasons": null
}
```

如果交易因為`PutItem`請求的條件檢查失敗而失敗， 中可用的調用結果`$ctx.result`如下：

```
{
    "keys": null,
    "cancellationReasons": [
       {
           "item": {
               "post_id": "p1",
               "post_title": "Actual old title",
               "post_description": "Old description"
           },
           "type": "ConditionCheckFailed",
           "message": "The condition check failed."
       },
       {
           "type": "None",
           "message": "None"
       }
    ]
}
```

`$ctx.error` 包含錯誤的詳細資訊。索引鍵 **keys** 和 **cancellationReasons** 保證出現在 `$ctx.result` 中。

如需更完整的範例，請依照 DynamoDB 交易教學搭配 AppSync here [Tutorial： DynamoDB 交易解析程式](tutorial-dynamodb-transact.md#aws-appsync-tutorial-dynamodb-transact)。

# 類型系統 （請求映射）
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request"></a>

使用 AWS AppSync DynamoDB 解析程式呼叫 DynamoDB 資料表時， AWS AppSync 需要知道要在該呼叫中使用的每個值類型。這是因為 DynamoDB 支援比 GraphQL 或 JSON 更多的類型基本概念 （例如集合和二進位資料）。 AWS AppSync 需要一些提示，否則您必須對資料表中的資料結構做出一些假設。 GraphQL DynamoDB

如需 DynamoDB 資料類型的詳細資訊，請參閱 DynamoDB [資料類型描述項](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html#Programming.LowLevelAPI.DataTypeDescriptors)和[資料類型](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes)文件。

DynamoDB 值由包含單一鍵值對的 JSON 物件表示。金鑰會指定 DynamoDB 類型，而值會指定值本身。在下列範例中，`S` 鍵代表值是字串，`identifier` 值則是字串值本身。

```
{ "S" : "identifier" }
```

請注意，JSON 物件不能有一個以上的索引值對。如果指定一個以上的索引值對，要求映射文件就不會進行剖析。

DynamoDB 值會在您需要指定值的請求映射文件中的任何位置使用。您需要執行這項操作的一些地方包括：`key` 和 `attributeValue` 區段，以及表達式區段的 `expressionValues` 區段。在下列範例中，DynamoDB 字串值`identifier`會指派給`key`區段中的 `id` 欄位 （可能在`GetItem`請求映射文件中）。

```
"key" : {
   "id" : { "S" : "identifier" }
}
```

 **支援的類型** 

AWS AppSync 支援下列 DynamoDB 純量、文件和設定類型：

**字串類型 `S` **  
單一字串值。DynamoDB 字串值以下列表示：  

```
{ "S" : "some string" }
```
使用範例：  

```
"key" : {
   "id" : { "S" : "some string" }
}
```

**字串集類型 `SS` **  
字串值的集合。DynamoDB 字串集值以下列表示：  

```
{ "SS" : [ "first value", "second value", ... ] }
```
使用範例：  

```
"attributeValues" : {
   "phoneNumbers" : { "SS" : [ "+1 555 123 4567", "+1 555 234 5678" ] }
}
```

**數字類型 `N` **  
單一數值。DynamoDB 數字值以下列表示：  

```
{ "N" : 1234 }
```
使用範例：  

```
"expressionValues" : {
   ":expectedVersion" : { "N" : 1 }
}
```

**數字集類型 `NS` **  
數值的集合。DynamoDB 數字集值以下列表示：  

```
{ "NS" : [ 1, 2.3, 4 ... ] }
```
使用範例：  

```
"attributeValues" : {
   "sensorReadings" : { "NS" : [ 67.8, 12.2, 70 ] }
}
```

**二進位類型 `B` **  
二進位值。DynamoDB 二進位值以下列表示：  

```
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
```
請注意，該值實際上是字串，其中字串是二進位資料的 base64 編碼表示法。 AWS AppSync 會將此字串解碼回其二進位值，再將其傳送至 DynamoDB。 AWS AppSync 使用 RFC 2045 定義的 base64 解碼機制：忽略不在 base64 字母中的任何字元。  
使用範例：  

```
"attributeValues" : {
   "binaryMessage" : { "B" : "SGVsbG8sIFdvcmxkIQo=" }
}
```

**二進位集類型 `BS` **  
二進位值的集合。DynamoDB 二進位集值以下列表示：  

```
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
```
請注意，該值實際上是字串，其中字串是二進位資料的 base64 編碼表示法。 AWS AppSync 會將此字串解碼回其二進位值，再將其傳送至 DynamoDB。 AWS AppSync 使用 RFC 2045 定義的 base64 解碼機制：忽略不在 base64 字母中的任何字元。  
使用範例：  

```
"attributeValues" : {
   "binaryMessages" : { "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ] }
}
```

**布林類型 `BOOL` **  
布林值。DynamoDB 布林值以下列表示：  

```
{ "BOOL" : true }
```
請注意，只有 `true` 和 `false` 為有效值。  
使用範例：  

```
"attributeValues" : {
   "orderComplete" : { "BOOL" : false }
}
```

**清單類型 `L` **  
任何其他支援的 DynamoDB 值清單。DynamoDB 清單值以下列表示：  

```
{ "L" : [ ... ] }
```
請注意，該值是複合值，其中清單可包含任何支援的 DynamoDB 值的零或多個 （包括其他清單）。清單也可包含混合的不同類型。  
使用範例：  

```
{ "L" : [
      { "S"  : "A string value" },
      { "N"  : 1 },
      { "SS" : [ "Another string value", "Even more string values!" ] }
   ]
}
```

**映射類型 `M` **  
代表其他支援 DynamoDB 值的金鑰值對的未排序集合。DynamoDB Map 值以下列表示：  

```
{ "M" : { ... } }
```
請注意，映射可包含零或多個索引值對。金鑰必須是字串，且值可以是任何支援的 DynamoDB 值 （包括其他映射）。映射也可包含混合的不同類型。  
使用範例：  

```
{ "M" : {
      "someString" : { "S"  : "A string value" },
      "someNumber" : { "N"  : 1 },
      "stringSet"  : { "SS" : [ "Another string value", "Even more string values!" ] }
   }
}
```

**Null 類型 `NULL` **  
null 值。DynamoDB Null 值以下列表示：  

```
{ "NULL" : null }
```
使用範例：  

```
"attributeValues" : {
   "phoneNumbers" : { "NULL" : null }
}
```

如需每種類型的詳細資訊，請參閱 [DynamoDB 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html)。

# 類型系統 （回應映射）
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses"></a>

從 DynamoDB 接收回應時， AWS AppSync 會自動將其轉換為 GraphQL 和 JSON 基本類型。DynamoDB 中的每個屬性都會解碼，並在回應映射內容中傳回。

例如，如果 DynamoDB 傳回下列項目：

```
{
    "id" : { "S" : "1234" },
    "name" : { "S" : "Nadia" },
    "age" : { "N" : 25 }
}
```

然後， AWS AppSync DynamoDB 解析程式會將其轉換為 GraphQL 和 JSON 類型，如下所示：

```
{
    "id" : "1234",
    "name" : "Nadia",
    "age" : 25
}
```

本節說明 AWS AppSync 如何轉換下列 DynamoDB 純量、文件和設定類型：

**字串類型 `S` **  
單一字串值。DynamoDB 字串值會以字串傳回。  
例如，如果 DynamoDB 傳回下列 DynamoDB 字串值：  

```
{ "S" : "some string" }
```
AWS AppSync 將其轉換為字串：  

```
"some string"
```

**字串集類型 `SS` **  
字串值的集合。DynamoDB 字串集值會傳回為字串清單。  
例如，如果 DynamoDB 傳回下列 DynamoDB 字串集值：  

```
{ "SS" : [ "first value", "second value", ... ] }
```
AWS AppSync 將其轉換為字串清單：  

```
[ "+1 555 123 4567", "+1 555 234 5678" ]
```

**數字類型 `N` **  
單一數值。DynamoDB 數值會以數字傳回。  
例如，如果 DynamoDB 傳回下列 DynamoDB 數字值：  

```
{ "N" : 1234 }
```
AWS AppSync 將其轉換為數字：  

```
1234
```

**數字集類型 `NS` **  
數值的集合。DynamoDB 數字集值會以數字清單傳回。  
例如，如果 DynamoDB 傳回下列 DynamoDB 數字集值：  

```
{ "NS" : [ 67.8, 12.2, 70 ] }
```
AWS AppSync 將其轉換為數字清單：  

```
[ 67.8, 12.2, 70 ]
```

**二進位類型 `B` **  
二進位值。DynamoDB 二進位值會以字串傳回，其中包含該值的 base64 表示法。  
例如，如果 DynamoDB 傳回下列 DynamoDB 二進位值：  

```
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
```
AWS AppSync 將其轉換為包含 base64 表示值的字串：  

```
"SGVsbG8sIFdvcmxkIQo="
```
請注意，二進位資料以 base64 編碼配置編碼，如 [RFC 4648](https://tools.ietf.org/html/rfc4648) 和 [RFC 2045](https://tools.ietf.org/html/rfc2045) 中所定義。

**二進位集類型 `BS` **  
二進位值的集合。DynamoDB 二進位集值會以包含 base64 表示值的字串清單傳回。  
例如，如果 DynamoDB 傳回下列 DynamoDB 二進位集值：  

```
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
```
AWS AppSync 將其轉換為包含 base64 表示值的字串清單：  

```
[ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ]
```
請注意，二進位資料以 base64 編碼配置編碼，如 [RFC 4648](https://tools.ietf.org/html/rfc4648) 和 [RFC 2045](https://tools.ietf.org/html/rfc2045) 中所定義。

**布林類型 `BOOL` **  
布林值。DynamoDB 布林值會以布林值傳回。  
例如，如果 DynamoDB 傳回下列 DynamoDB 布林值：  

```
{ "BOOL" : true }
```
AWS AppSync 將其轉換為布林值：  

```
true
```

**清單類型 `L` **  
任何其他支援的 DynamoDB 值清單。DynamoDB 清單值會傳回為值清單，其中每個內部值也會轉換。  
例如，如果 DynamoDB 傳回下列 DynamoDB 清單值：  

```
{ "L" : [
      { "S"  : "A string value" },
      { "N"  : 1 },
      { "SS" : [ "Another string value", "Even more string values!" ] }
   ]
}
```
AWS AppSync 將其轉換為轉換值的清單：  

```
[ "A string value", 1, [ "Another string value", "Even more string values!" ] ]
```

**映射類型 `M` **  
任何其他支援的 DynamoDB 值的金鑰/值集合。DynamoDB Map 值會以 JSON 物件傳回，其中每個索引鍵/值也會轉換。  
例如，如果 DynamoDB 傳回下列 DynamoDB Map 值：  

```
{ "M" : {
      "someString" : { "S"  : "A string value" },
      "someNumber" : { "N"  : 1 },
      "stringSet"  : { "SS" : [ "Another string value", "Even more string values!" ] }
   }
}
```
AWS AppSync 將其轉換為 JSON 物件：  

```
{
   "someString" : "A string value",
   "someNumber" : 1,
   "stringSet"  : [ "Another string value", "Even more string values!" ]
}
```

**Null 類型 `NULL` **  
null 值。  
例如，如果 DynamoDB 傳回下列 DynamoDB Null 值：  

```
{ "NULL" : null }
```
AWS AppSync 將其轉換為 null：  

```
null
```

# 篩選條件
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-filter"></a>

使用 `Query`和 `Scan`操作查詢 DynamoDB 中的物件時，您可以選擇指定`filter`評估結果並僅傳回所需值的 。

`Query` 或 `Scan` 映射文件的篩選條件映射區段之結構如下：

```
"filter" : {
    "expression" : "filter expression"
    "expressionNames" : {
        "#name" : "name",
    },
    "expressionValues" : {
        ":value" : ... typed value
    },
}
```

欄位定義如下：

** `expression` **  
查詢表達式。如需如何編寫篩選條件表達式的詳細資訊，請參閱 [DynamoDB QueryFilter](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html) 和 [DynamoDB ScanFilter](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ScanFilter.html) 文件。必須指定此欄位。

** `expressionNames` **  
表達式屬性 *name* 預留位置的替代，形式為鍵值組。索引鍵對應至用於 `expression` 的名稱預留位置。值必須是對應於 DynamoDB 中項目屬性名稱的字串。此欄位為選用的，應只能填入用於 `expression` 中表達式屬性名稱預留位置的替代。

** `expressionValues` **  
表達式屬性 *value* 預留位置的替代，形式為鍵值組。鍵對應用於 `expression` 的值預留位置，值必須是類型值。如需如何指定「類型值」的詳細資訊，請參閱[類型系統 (請求映射)](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此必須指定。此欄位為選用的，應只能填入用於 `expression` 中表達式屬性值預留位置的替代。

## 範例
<a name="id18"></a>

下列範例是映射範本的篩選條件區段，只有在標題開頭為 `title`引數時，才會傳回從 DynamoDB 擷取的項目。

```
"filter" : {
    "expression" : "begins_with(#title, :title)",
    "expressionNames" : {
        "#title" : "title"
    },
    "expressionValues" : {
        ":title" : $util.dynamodb.toDynamoDBJson($context.arguments.title)
    }
}
```

# 條件表達式
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-condition-expressions"></a>

當您使用 `PutItem`、 `UpdateItem`和 DynamoDB 操作來變更 `DeleteItem` DynamoDB 中的物件時，您可以選擇指定條件表達式，以根據在執行操作之前已在 DynamoDB 中的物件狀態來控制請求是否成功。

The AWS AppSync DynamoDB 解析程式允許在 `PutItem`、 `UpdateItem`和 `DeleteItem`請求映射文件中指定條件表達式，以及如果條件失敗且未更新物件時要遵循的策略。

## 範例 1
<a name="id19"></a>

以下 `PutItem` 映射文件沒有條件表達式。因此，即使具有相同索引鍵的項目已存在，也會將項目放入 DynamoDB，藉此覆寫現有項目。

```
{
   "version" : "2017-02-28",
   "operation" : "PutItem",
   "key" : {
      "id" : { "S" : "1" }
   }
}
```

## 範例 2
<a name="id20"></a>

下列`PutItem`映射文件確實具有條件表達式，只有在 DynamoDB 中*不存在*具有相同索引鍵的項目時，才允許操作成功。

```
{
   "version" : "2017-02-28",
   "operation" : "PutItem",
   "key" : {
      "id" : { "S" : "1" }
   },
   "condition" : {
      "expression" : "attribute_not_exists(id)"
   }
}
```

根據預設，如果條件檢查失敗， AWS AppSync DynamoDB 解析程式會傳回變動的錯誤。不過， AWS AppSync DynamoDB 解析程式提供一些額外的功能，以協助開發人員處理一些常見的邊緣案例：
+ If AWS AppSync DynamoDB 解析程式可以判斷 DynamoDB 中的目前值是否符合所需的結果，仍會將操作視為成功。
+ 您可以設定解析程式叫用自訂 Lambda 函數，以決定 AWS AppSync DynamoDB 解析程式應如何處理失敗，而不是傳回錯誤。

[處理條件檢查失敗](#aws-appsync-resolver-mapping-template-reference-dynamodb-condition-handling)一節將更詳細地說明這些內容。

如需 DynamoDB 條件表達式的詳細資訊，請參閱 [DynamoDB ConditionExpressions 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)。

## 指定條件
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-condition-specification"></a>

`PutItem`、`UpdateItem` 和 `DeleteItem` 要求映射文件都允許可指定選用的 `condition` 區段。若省略，則不會有條件檢查。若指定，條件必須為 true，操作才會成功。

`condition` 區段的結構如下：

```
"condition" : {
    "expression" : "someExpression"
    "expressionNames" : {
        "#foo" : "foo"
    },
    "expressionValues" : {
        ":bar" : ... typed value
    },
    "equalsIgnore" : [ "version" ],
    "consistentRead" : true,
    "conditionalCheckFailedHandler" : {
        "strategy" : "Custom",
        "lambdaArn" : "arn:..."
    }
}
```

下列欄位指定條件：

** `expression` **  
更新表達式本身。如需如何編寫條件表達式的詳細資訊，請參閱 [DynamoDB ConditionExpressions 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)。必須指定此欄位。

** `expressionNames` **  
表達式屬性名稱預留位置的替代，形式為索引鍵值對。索引鍵對應至*表達*式中使用的名稱預留位置，且值必須是對應於 DynamoDB 中項目屬性名稱的字串。此欄位為選用的，應只能填入於*表達式*中所用表達式屬性名稱預留位置的替代。

** `expressionValues` **  
表達式屬性值預留位置的替代，形式為索引值對。鍵對應用於表達式的值預留位置，值必須是類型值。如需如何指定「類型值」的詳細資訊，請參閱[類型系統 (請求映射)](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md)。此必須指定。此欄位為選用的，應只能填入用於表達式中表達式屬性值預留位置的替代。

其餘欄位會告知 AWS AppSync DynamoDB 解析程式如何處理條件檢查失敗：

** `equalsIgnore` **  
當條件檢查在使用 `PutItem`操作時失敗時， AWS AppSync DynamoDB 解析程式會將目前在 DynamoDB 中的項目與嘗試寫入的項目進行比較。如果兩者相同，則操作視為成功。您可以使用 `equalsIgnore` 欄位來指定執行該比較時 AWS AppSync 應忽略的屬性清單。例如，如果唯一的差異是`version`屬性，它會將操作視為成功。此欄位為選用欄位。

** `consistentRead` **  
當條件檢查失敗時， AWS AppSync 會使用強式一致讀取，從 DynamoDB 取得項目的目前值。您可以使用此欄位，指示 AWS AppSync DynamoDB 解析程式改用最終一致讀取。此欄位為選用，預設值為 `true`。

** `conditionalCheckFailedHandler` **  
本節可讓您指定 AWS AppSync DynamoDB 解析程式在將 DynamoDB 中的目前值與預期結果進行比較後，如何處理條件檢查失敗。此區段為選用。若省略，則會預設為 `Reject` 策略。    
** `strategy` **  
在將 DynamoDB 中的目前值與預期結果進行比較後， AWS AppSync DynamoDB 解析程式採取的策略。此欄位為必填，且採用下列可能值：    
** `Reject` **  
變動會失敗，並會將錯誤新增至 GraphQL 回應。  
** `Custom` **  
The AWS AppSync DynamoDB 解析程式會叫用自訂 Lambda 函數，以決定如何處理條件檢查失敗。當 `strategy` 設定為 `Custom`，`lambdaArn` 欄位必須包含要叫用 Lambda 函數的 ARN。  
** `lambdaArn` **  
要叫用的 Lambda 函數 ARN，決定 AWS AppSync DynamoDB 解析程式應如何處理條件檢查失敗。只有在 `strategy` 設定為 `Custom` 時，此欄位才必須指定。如需如何使用此功能的詳細資訊，請參閱[處理條件檢查失敗](#aws-appsync-resolver-mapping-template-reference-dynamodb-condition-handling)。

## 處理條件檢查失敗
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-condition-handling"></a>

根據預設，當條件檢查失敗時， AWS AppSync DynamoDB 解析程式會傳回變動的錯誤，以及 DynamoDB 中物件的目前值。不過， AWS AppSync DynamoDB 解析程式提供一些額外的功能，以協助開發人員處理一些常見的邊緣案例：
+ If AWS AppSync DynamoDB 解析程式可以判斷 DynamoDB 中的目前值是否符合所需的結果，仍會將操作視為成功。
+ 您可以設定解析程式叫用自訂 Lambda 函數，以決定 AWS AppSync DynamoDB 解析程式應如何處理失敗，而不是傳回錯誤。

此程序的流程圖為：

![\[Flowchart showing process for transforming requests with mutation attempts and value checks.\]](http://docs.aws.amazon.com/zh_tw/appsync/latest/devguide/images/DynamoDB-condition-check-failure-handling.png)


### 檢查所需結果
<a name="checking-for-the-desired-result"></a>

當條件檢查失敗時， AWS AppSync DynamoDB 解析程式會執行 `GetItem` DynamoDB 請求，從 DynamoDB 取得項目的目前值。在預設情況下，它會使用強式一致性讀取，但這可使用 `condition` 區塊中的 `consistentRead` 欄位來設定，並和預期結果進行比較：
+ 對於 `PutItem`操作， AWS AppSync DynamoDB 解析程式會將目前的值與其嘗試寫入的值進行比較，但不包括`equalsIgnore`比較中列出的任何屬性。如果項目相同，它會將操作視為成功，並傳回從 DynamoDB 擷取的項目。否則，其將按照設定的策略。

  例如，如果 `PutItem` 要求映射文件外觀如下：

  ```
  {
     "version" : "2017-02-28",
     "operation" : "PutItem",
     "key" : {
        "id" : { "S" : "1" }
     },
     "attributeValues" : {
        "name" : { "S" : "Steve" },
        "version" : { "N" : 2 }
     },
     "condition" : {
        "expression" : "version = :expectedVersion",
        "expressionValues" : {
            ":expectedVersion" : { "N" : 1 }
        },
        "equalsIgnore": [ "version" ]
     }
  }
  ```

  而目前在 DynamoDB 中的項目外觀如下：

  ```
  {
     "id" : { "S" : "1" },
     "name" : { "S" : "Steve" },
     "version" : { "N" : 8 }
  }
  ```

  The AWS AppSync DynamoDB 解析程式會將嘗試寫入的項目與目前值進行比較，查看唯一的差異是 `version` 欄位，但因為它設定為忽略 `version` 欄位，它會將操作視為成功，並傳回從 DynamoDB 擷取的項目。
+ 對於 `DeleteItem`操作， AWS AppSync DynamoDB 解析程式會檢查以確認項目已從 DynamoDB 傳回。如果沒有項目傳回，則操作視為成功。否則，其將按照設定的策略。
+ 對於 `UpdateItem`操作， AWS AppSync DynamoDB 解析程式沒有足夠的資訊來判斷目前在 DynamoDB 中的項目是否符合預期結果，因此遵循設定的策略。

如果 DynamoDB 中物件的目前狀態與預期結果不同， AWS AppSync DynamoDB 解析程式會遵循設定的策略，以拒絕變動或叫用 Lambda 函數來決定接下來要做什麼。

### 遵循「拒絕」策略
<a name="following-the-reject-strategy"></a>

遵循 `Reject`策略時， AWS AppSync DynamoDB 解析程式會傳回變動的錯誤。

例如，假設變動要求如下：

```
mutation {
    updatePerson(id: 1, name: "Steve", expectedVersion: 1) {
        Name
        theVersion
    }
}
```

如果從 DynamoDB 傳回的項目如下所示：

```
{
   "id" : { "S" : "1" },
   "name" : { "S" : "Steve" },
   "version" : { "N" : 8 }
}
```

而回應映射範本如下所示：

```
{
   "id" : $util.toJson($context.result.id),
   "Name" : $util.toJson($context.result.name),
   "theVersion" : $util.toJson($context.result.version)
}
```

GraphQL 回應的外觀如下所示：

```
{
  "data": null,
  "errors": [
    {
      "message": "The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ)"
      "errorType": "DynamoDB:ConditionalCheckFailedException",
      ...
    }
  ]
}
```

此外，如果傳回物件中的任何欄位皆由其他解析程式填入，且變動成功，則在 `error` 區段中傳回物件時，不會解析這些物件。

### 遵循「自訂」策略
<a name="following-the-custom-strategy"></a>

遵循`Custom`策略時， AWS AppSync DynamoDB 解析程式會叫用 Lambda 函數來決定接下來要做什麼。Lambda 函數會選擇下列其中一個選項：
+  `reject` 變動。這可讓 AWS AppSync DynamoDB 解析程式的行為如同設定的策略為 `Reject`，傳回 DynamoDB 中物件的變動錯誤和目前值，如上一節所述。
+  `discard` 變動。這可讓 AWS AppSync DynamoDB 解析程式無提示地忽略條件檢查失敗，並在 DynamoDB 中傳回 值。
+  `retry` 變動。這會通知 AWS AppSync DynamoDB 解析程式使用新的請求映射文件重試變動。

 **Lambda 叫用要求** 

The AWS AppSync DynamoDB 解析程式會叫用 中指定的 Lambda 函數`lambdaArn`。它會使用資料來源上所設定的相同 `service-role-arn`。叫用承載的結構如下：

```
{
    "arguments": { ... },
    "requestMapping": {... },
    "currentValue": { ... },
    "resolver": { ... },
    "identity": { ... }
}
```

欄位定義如下：

** `arguments` **  
來自 GraphQL 變動的引數。這與可在 `$context.arguments` 中要求映射文件取得的引數相同。

** `requestMapping` **  
此操作的要求映射文件。

** `currentValue` **  
DynamoDB 中物件的目前值。

** `resolver` **  
有關 AWS AppSync 解析程式的資訊。

** `identity` **  
發起人的相關資訊。這與可在 `$context.identity` 中要求映射文件取得的身分資訊相同。

承載的完整範例：

```
{
    "arguments": {
        "id": "1",
        "name": "Steve",
        "expectedVersion": 1
    },
    "requestMapping": {
        "version" : "2017-02-28",
        "operation" : "PutItem",
        "key" : {
           "id" : { "S" : "1" }
        },
        "attributeValues" : {
           "name" : { "S" : "Steve" },
           "version" : { "N" : 2 }
        },
        "condition" : {
           "expression" : "version = :expectedVersion",
           "expressionValues" : {
               ":expectedVersion" : { "N" : 1 }
           },
           "equalsIgnore": [ "version" ]
        }
    },
    "currentValue": {
        "id" : { "S" : "1" },
        "name" : { "S" : "Steve" },
        "version" : { "N" : 8 }
    },
    "resolver": {
        "tableName": "People",
        "awsRegion": "us-west-2",
        "parentType": "Mutation",
        "field": "updatePerson",
        "outputType": "Person"
    },
    "identity": {
        "accountId": "123456789012",
        "sourceIp": "x.x.x.x",
        "user": "AIDAAAAAAAAAAAAAAAAAA",
        "userArn": "arn:aws:iam::123456789012:user/appsync"
    }
}
```

 **Lambda 叫用回應** 

Lambda 函數可以檢查調用承載並套用任何商業邏輯，以決定 AWS AppSync DynamoDB 解析程式應如何處理失敗。處理條件檢查失敗有三個選項：
+  `reject` 變動。此選項的回應承載必須具有此架構：

  ```
  {
      "action": "reject"
  }
  ```

  這可讓 AWS AppSync DynamoDB 解析程式的行為如同設定的策略為 `Reject`，傳回 DynamoDB 中物件的變動錯誤和目前值，如上節所述。
+  `discard` 變動。此選項的回應承載必須具有此架構：

  ```
  {
      "action": "discard"
  }
  ```

  這會通知 AWS AppSync DynamoDB 解析程式以無提示方式忽略條件檢查失敗，並在 DynamoDB 中傳回 值。
+  `retry` 變動。此選項的回應承載必須具有此架構：

  ```
  {
      "action": "retry",
      "retryMapping": { ... }
  }
  ```

  這會通知 AWS AppSync DynamoDB 解析程式使用新的請求映射文件重試變動。`retryMapping` 區段的結構取決於 DynamoDB 操作，並且是該操作完整請求映射文件的子集。

  若是 `PutItem`，`retryMapping` 區段的結構如下。如需 `attributeValues` 欄位的描述，請參閱 [PutItem](aws-appsync-resolver-mapping-template-reference-dynamodb-putitem.md)。

  ```
  {
      "attributeValues": { ... },
      "condition": {
          "equalsIgnore" = [ ... ],
          "consistentRead" = true
      }
  }
  ```

  若是 `UpdateItem`，`retryMapping` 區段的結構如下。如需 `update` 區段的描述，請參閱 [UpdateItem](aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem.md)。

  ```
  {
      "update" : {
          "expression" : "someExpression"
          "expressionNames" : {
              "#foo" : "foo"
          },
          "expressionValues" : {
              ":bar" : ... typed value
          }
      },
      "condition": {
          "consistentRead" = true
      }
  }
  ```

  若是 `DeleteItem`，`retryMapping` 區段的結構如下。

  ```
  {
      "condition": {
          "consistentRead" = true
      }
  }
  ```

  無法指定使用不同的操作或索引鍵。The AWS AppSync DynamoDB 解析程式僅允許對相同物件重試相同的操作。此外，`condition` 區段不允許指定 `conditionalCheckFailedHandler`。如果重試失敗， AWS AppSync DynamoDB 解析程式會遵循 `Reject`策略。

此為 Lambda 函數處理失敗 `PutItem` 要求的範例。商業邏輯的重點是發起人為何。如果是由 提出`jeffTheAdmin`，它會重試請求，`expectedVersion`從目前在 DynamoDB 中的項目更新 `version`和 。否則，它會拒絕變動。

```
exports.handler = (event, context, callback) => {
    console.log("Event: "+ JSON.stringify(event));

    // Business logic goes here.

    var response;
    if ( event.identity.user == "jeffTheAdmin" ) {
        response = {
            "action" : "retry",
            "retryMapping" : {
                "attributeValues" : event.requestMapping.attributeValues,
                "condition" : {
                    "expression" : event.requestMapping.condition.expression,
                    "expressionValues" : event.requestMapping.condition.expressionValues
                }
            }
        }
        response.retryMapping.attributeValues.version = { "N" : event.currentValue.version.N + 1 }
        response.retryMapping.condition.expressionValues[':expectedVersion'] = event.currentValue.version

    } else {
        response = { "action" : "reject" }
    }

    console.log("Response: "+ JSON.stringify(response))
    callback(null, response)
};
```

# 交易條件表達式
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-transaction-condition-expressions"></a>

交易條件表達式可在 `TransactWriteItems` 中四種類型操作的請求映射範本中使用，即 `PutItem`、`DeleteItem`、`UpdateItem` 以及 `ConditionCheck`。

對於 `PutItem`、 `DeleteItem`和 `UpdateItem`，交易條件表達式是選用的。對於 `ConditionCheck`，需要交易條件表達式。

## 範例 1
<a name="id22"></a>

以下交易 `DeleteItem` 映射文件沒有條件表達式。因此，它會刪除 DynamoDB 中的項目。

```
{
   "version": "2018-05-29",
   "operation": "TransactWriteItems",
   "transactItems": [
      {
         "table": "posts",
         "operation": "DeleteItem",
         "key": {
            "id": { "S" : "1" }
         }
      }
   ]
}
```

## 範例 2
<a name="id23"></a>

下列交易`DeleteItem`映射文件確實具有交易條件表達式，只有在該文章的作者等於特定名稱時，才會允許操作成功。

```
{
   "version": "2018-05-29",
   "operation": "TransactWriteItems",
   "transactItems": [
      {
         "table": "posts",
         "operation": "DeleteItem",
         "key": {
            "id": { "S" : "1" }
         }
         "condition": {
            "expression": "author = :author",
            "expressionValues": {
               ":author": { "S" : "Chunyan" }
            }
         }
      }
   ]
}
```

如果條件檢查失敗，會導致 `TransactionCanceledException`，並且會在 `$ctx.result.cancellationReasons` 中傳回錯誤詳細資料。請注意，根據預設，DynamoDB 中導致條件檢查失敗的舊項目會在 中傳回`$ctx.result.cancellationReasons`。

## 指定條件
<a name="id24"></a>

`PutItem`、`UpdateItem` 和 `DeleteItem` 要求映射文件都允許可指定選用的 `condition` 區段。若省略，則不會有條件檢查。若指定，條件必須為 true，操作才會成功。`ConditionCheck` 必須有待指定的 `condition` 區段。條件必須為 true，整個交易才會成功。

`condition` 區段的結構如下：

```
"condition": {
    "expression": "someExpression",
    "expressionNames": {
        "#foo": "foo"
    },
    "expressionValues": {
        ":bar": ... typed value
    },
    "returnValuesOnConditionCheckFailure": false
}
```

下列欄位指定條件：

** `expression` **  
更新表達式本身。如需如何編寫條件表達式的詳細資訊，請參閱 [DynamoDB ConditionExpressions 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)。必須指定此欄位。

** `expressionNames` **  
表達式屬性名稱預留位置的替代，形式為索引鍵值對。索引鍵對應於*表達*式中使用的名稱預留位置，且值必須是對應於 DynamoDB 中項目屬性名稱的字串。此欄位為選用的，應只能填入於*表達式*中所用表達式屬性名稱預留位置的替代。

** `expressionValues` **  
表達式屬性值預留位置的替代，形式為索引值對。鍵對應用於表達式的值預留位置，值必須是類型值。如需如何指定「類型值」的詳細資訊，請參閱〈類型系統 (請求映射)〉。此必須指定。此欄位為選用的，應只能填入用於表達式中表達式屬性值預留位置的替代。

** `returnValuesOnConditionCheckFailure` **  
指定是否在條件檢查失敗時擷取 DynamoDB 中的項目。擷取的項目將位於 `$ctx.result.cancellationReasons[$index].item` 中，其中 `$index` 是條件檢查失敗之請求項目的索引。此值預設為 true。

# 投影
<a name="aws-appsync-resolver-mapping-template-reference-dynamodb-projections"></a>

使用 `GetItem`、`BatchGetItem`、、 `Scan` `Query`和 `TransactGetItems`操作讀取 DynamoDB 中的物件時，您可以選擇指定投影，以識別您想要的屬性。投影具有下列結構，類似於篩選條件：

```
"projection" : {
    "expression" : "projection expression"
    "expressionNames" : {
        "#name" : "name",
    }
}
```

欄位定義如下：

**`expression`**   
投影表達式，這是字串。若要擷取單一屬性，請指定其名稱。對於多個屬性，名稱必須是逗號分隔值。如需撰寫投影表達式的詳細資訊，請參閱 [DynamoDB 投影表達](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ProjectionExpressions.html)式文件。此欄位為必填。

 **`expressionNames`**   
以鍵/值對形式取代表達式屬性*名稱*預留位置。索引鍵對應至用於 `expression` 的名稱預留位置。值必須是對應於 DynamoDB 中項目屬性名稱的字串。此欄位是選用的，應僅填入 中使用的表達式屬性名稱預留位置的替換`expression`。如需 的詳細資訊`expressionNames`，請參閱 [DynamoDB 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html)。

## 範例 1
<a name="id25"></a>

下列範例是 VTL 映射範本的投影區段，其中只有屬性 `id` `author`和 會從 DynamoDB 傳回：

```
"projection" : {
    "expression" : "#author, id",
    "expressionNames" : {
        "#author" : "author"
    }
}
```

**提示**  
您可以使用 [\$1context.info.selectionSetList](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html#aws-appsync-resolver-context-reference-info) 存取 GraphQL 請求選取集。此欄位可讓您根據您的需求動態架構投影表達式。

**注意**  
搭配 `Query`和 `Scan`操作使用投影表達式時， 的值`select`必須是 `SPECIFIC_ATTRIBUTES`。如需詳細資訊，請參閱 [DynamoDB 文件](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-request-Select)。

# RDS 的 AWS AppSync 解析程式映射範本參考
<a name="resolver-mapping-template-reference-rds"></a>

 AWS AppSync RDS 解析程式映射範本可讓開發人員將 SQL 查詢傳送至 Amazon Aurora Serverless 的資料 API，並取回這些查詢的結果。

## 請求映射範本
<a name="request-mapping-template"></a>

RDS 要求映射範本非常簡單：

```
{
    "version": "2018-05-29",
    "statements": [],
    "variableMap": {},
    "variableTypeHintMap": {}
}
```

以下是 RDS 請求映射範本在解析後呈現的 JSON 結構描述。

```
{
    "definitions": {},
    "$schema": "https://json-schema.org/draft-07/schema#",
    "$id": "https://example.com/root.json",
    "type": "object",
    "title": "The Root Schema",
    "required": [
        "version",
        "statements",
        "variableMap"
    ],
    "properties": {
        "version": {
            "$id": "#/properties/version",
            "type": "string",
            "title": "The Version Schema",
            "default": "",
            "examples": [
                "2018-05-29"
            ],
            "enum": [
                "2018-05-29"
            ],
            "pattern": "^(.*)$"
        },
        "statements": {
            "$id": "#/properties/statements",
            "type": "array",
            "title": "The Statements Schema",
            "items": {
                "$id": "#/properties/statements/items",
                "type": "string",
                "title": "The Items Schema",
                "default": "",
                "examples": [
                    "SELECT * from BOOKS"
                ],
                "pattern": "^(.*)$"
            }
        },
        "variableMap": {
            "$id": "#/properties/variableMap",
            "type": "object",
            "title": "The Variablemap Schema"
        },
        "variableTypeHintMap": {
            "$id": "#/properties/variableTypeHintMap",
            "type": "object",
            "title": "The variableTypeHintMap Schema"
        }
    }
}
```

以下是具有靜態查詢的請求映射範本範例：

```
{
    "version": "2018-05-29",
    "statements": [
        "select title, isbn13 from BOOKS where author = 'Mark Twain'"
    ]
}
```

## 版本
<a name="version"></a>

版本欄位適用於所有請求映射範本，定義範本使用的版本。版本欄位為必要欄位。值「2018-05-29」是 Amazon RDS 映射範本唯一支援的版本。

```
"version": "2018-05-29"
```

## 陳述式和 VariableMap
<a name="statements-variablemap"></a>

陳述式陣列是開發人員所提供查詢的預留位置。目前，每個請求映射範本最多支援兩個查詢。`variableMap` 是選用欄位，其中包含別名，可用於讓 SQL 陳述式更短且更易讀。例如，下列是可能的：

```
{
"version": "2018-05-29",
    "statements": [
        "insert into BOOKS VALUES (:AUTHOR, :TITLE, :ISBN13)",
        "select * from BOOKS WHERE isbn13 = :ISBN13"
    ],
    "variableMap": {
        ":AUTHOR": $util.toJson($ctx.args.newBook.author),
        ":TITLE": $util.toJson($ctx.args.newBook.title),
        ":ISBN13": $util.toJson($ctx.args.newBook.isbn13)
    }
}
```

AWS AppSync 將使用變數映射值來建構將傳送至 Amazon Aurora Serverless Data API 的 **[SqlParameterized](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_SqlParameter.html)** 查詢。SQL 陳述式會使用變數映射中提供的參數執行，這會消除 SQL 插入的風險。

## VariableTypeHintMap
<a name="variabletypehintmap"></a>

`variableTypeHintMap` 是選用欄位，其中包含可用於傳送 [SQL 參數](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_SqlParameter.html)類型提示的別名類型。這些類型提示可避免 SQL 陳述式中的明確轉換，使其更短。例如，下列是可能的：

```
{
    "version": "2018-05-29",
    "statements": [
        "insert into LOGINDATA VALUES (:ID, :TIME)",
        "select * from LOGINDATA WHERE id = :ID"
     ],
     "variableMap": {
        ":ID": $util.toJson($ctx.args.id),
        ":TIME": $util.toJson($ctx.args.time)
     },
     "variableTypeHintMap": {
        ":id": "UUID",
        ":time": "TIME"
     }
}
```

AWS AppSync 將使用變數映射值來建構傳送至 Amazon Aurora Serverless Data API 的查詢。它也會使用`variableTypeHintMap`資料，並將類型的資訊傳送至 RDS。您可以在[此處](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_SqlParameter.html)找到 RDS 支援的 `typeHints` 。

# OpenSearch 的 AWS AppSync 解析程式映射範本參考
<a name="resolver-mapping-template-reference-elasticsearch"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

Amazon OpenSearch Service 的 AWS AppSync 解析程式可讓您使用 GraphQL 在帳戶中現有的 OpenSearch Service 網域中存放和擷取資料。此解析程式的運作方式是允許您將傳入的 GraphQL 請求映射至 OpenSearch Service 請求，然後將 OpenSearch Service 回應映射回 GraphQL。本節說明支援 OpenSearch Service 操作的映射範本。

## 請求映射範本
<a name="request-mapping-template"></a>

大多數 OpenSearch Service 請求映射範本都有共同的結構，其中只有幾個部分變更。下列範例會根據 OpenSearch Service 網域執行搜尋，其中文件是以名為 的索引組織`post`。搜尋參數定義於 `body` 區段，許多常見的查詢子句定義於 `query` 欄位。此範例將搜尋在 `"Nadia"` 欄位中包含 `"Bailey"` 或 `author` (或兩者) 的文件：

```
{
    "version":"2017-02-28",
    "operation":"GET",
    "path":"/post/_search",
    "params":{
        "headers":{},
        "queryString":{},
        "body":{
            "from":0,
            "size":50,
            "query" : {
                "bool" : {
                    "should" : [
                        {"match" : { "author" : "Nadia" }},
                        {"match" : { "author" : "Bailey" }}
                    ]
                }
            }
        }
    }
}
```

## 回應映射範本
<a name="response-mapping-template"></a>

如同其他資料來源，OpenSearch Service 會將回應傳送至需要轉換為 GraphQL 的 AWS AppSync。

大多數 GraphQL 查詢正在從 OpenSearch Service 回應中尋找 `_source` 欄位。由於您可以執行搜尋以傳回個別文件或文件清單，因此 OpenSearch Service 中有兩種常用的回應映射範本：

 **結果清單** 

```
[
    #foreach($entry in $context.result.hits.hits)
      #if( $velocityCount > 1 ) , #end
        $utils.toJson($entry.get("_source"))
    #end
]
```

 **個別項目** 

```
$utils.toJson($context.result.get("_source"))
```

## `operation` 欄位
<a name="operation-field"></a>

**注意**  
這僅適用於請求映射範本。

 AWS AppSync 傳送至 OpenSearch Service 網域的 HTTP 方法或動詞 (GET、POST、PUT、HEAD 或 DELETE)。金鑰與值皆必須為字串。

```
"operation" : "PUT"
```

## `path` 欄位
<a name="path-field"></a>

**注意**  
這僅適用於請求映射範本。

來自 AWS AppSync 的 OpenSearch Service 請求的搜尋路徑。這會形成操作的 HTTP 動詞的 URL。金鑰與值皆必須為字串。

```
"path" : "/<indexname>/_doc/<_id>"
"path" : "/<indexname>/_doc"
"path" : "/<indexname>/_search"
"path" : "/<indexname>/_update/<_id>
```

評估映射範本時，此路徑會做為 HTTP 請求的一部分傳送，包括 OpenSearch Service 網域。例如，之前的範例可轉譯為：

```
GET https://opensearch-domain-name.REGION.es.amazonaws.com/indexname/type/_search
```

## `params` 欄位
<a name="params-field"></a>

**注意**  
這僅適用於請求映射範本。

用來指定搜尋執行的動作，最常見的方式是設定**內文**內的**查詢**值。不過，有多項其他功能可設定，例如回應的格式。
+  **標頭** 

  標頭資訊，以金鑰值對形式。金鑰與值皆必須為字串。例如：

  ```
  "headers" : {
      "Content-Type" : "application/json"
  }
  ```
**注意**  
AWS AppSync 目前僅支援 JSON 做為 `Content-Type`。
+  **queryString** 

  金鑰值對，指定常見的選項，例如 JSON 回應的程式碼格式。金鑰與值皆必須為字串。例如，如果您希望獲得非常完整格式的 JSON，請使用：

  ```
  "queryString" : {
      "pretty" : "true"
  }
  ```
+  **本文** 

  這是請求的主要部分，允許 AWS AppSync 為您的 OpenSearch Service 網域製作格式正確的搜尋請求。金鑰必須是由物件組成的字串。以下顯示幾個示範。

 **範例 1** 

傳回城市符合「seattle」的所有文件：

```
"body":{
    "from":0,
    "size":50,
    "query" : {
        "match" : {
            "city" : "seattle"
        }
    }
}
```

 **範例 2** 

傳回所有符合「washington」做為城市或州的文件：

```
"body":{
    "from":0,
    "size":50,
    "query" : {
        "multi_match" : {
            "query" : "washington",
            "fields" : ["city", "state"]
        }
    }
}
```

## 傳遞變數
<a name="passing-variables"></a>

**注意**  
這僅適用於請求映射範本。

您也可以將變數做為 VTL 陳述式中評估的一部分進行傳遞。例如，假設您有一個 GraphQL 查詢如下：

```
query {
    searchForState(state: "washington"){
        ...
    }
}
```

此映射範本可採取狀態做為引數：

```
"body":{
    "from":0,
    "size":50,
    "query" : {
        "multi_match" : {
            "query" : "$context.arguments.state",
            "fields" : ["city", "state"]
        }
    }
}
```

如需您可包含在 VTL 中的公用程式清單，請參閱[存取請求標頭](resolver-context-reference.md#aws-appsync-resolver-context-reference-util)。

# Lambda 的 AWS AppSync 解析程式映射範本參考
<a name="resolver-mapping-template-reference-lambda"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

您可以使用 AWS AppSync 函數和解析程式來調用您帳戶中的 Lambda 函數。您可以在將請求承載傳回給用戶端之前，從 Lambda 函數塑造請求承載和回應。您也可以使用映射範本，向 AWS AppSync 提供關於要叫用之操作性質的提示。本節說明支援 Lambda 操作的不同映射範本。

## 請求映射範本
<a name="request-mapping-template"></a>

Lambda 請求映射範本會處理與 Lambda 函數相關的欄位：

```
{
  "version": string,
  "operation": Invoke|BatchInvoke,
  "payload": any type,
  "invocationType": RequestResponse|Event
}
```

這是解決時 Lambda 請求映射範本的 JSON 結構描述表示法：

```
{
  "definitions": {},
  "$schema": "https://json-schema.org/draft-06/schema#",
  "$id": "https://aws.amazon.com/appsync/request-mapping-template.json",
  "type": "object",
  "properties": {
    "version": {
      "$id": "/properties/version",
      "type": "string",
      "enum": [
        "2018-05-29"
      ],
      "title": "The Mapping template version.",
      "default": "2018-05-29"
    },
    "operation": {
      "$id": "/properties/operation",
      "type": "string",
      "enum": [
        "Invoke",
        "BatchInvoke"
      ],
      "title": "The Mapping template operation.",
      "description": "What operation to execute.",
      "default": "Invoke"
    },
    "payload": {},
    "invocationType": {
      "$id": "/properties/invocationType",
      "type": "string",
      "enum": [
        "RequestResponse",
        "Event"
      ],
      "title": "The Mapping template invocation type.",
      "description": "What invocation type to execute.",
      "default": "RequestResponse"
    }
  },
  "required": [
    "version",
    "operation"
  ],
  "additionalProperties": false
}
```

以下是使用 `invoke`操作的範例，其承載資料是來自 GraphQL 結構描述`getPost`的欄位，以及來自內容的引數：

```
{
  "version": "2018-05-29",
  "operation": "Invoke",
  "payload": {
    "field": "getPost",
    "arguments": $util.toJson($context.arguments)
  }
}
```

整個映射文件會做為 Lambda 函數的輸入傳遞，因此先前的範例現在如下所示：

```
{
  "version": "2018-05-29",
  "operation": "Invoke",
  "payload": {
    "field": "getPost",
    "arguments": {
      "id": "postId1"
    }
  }
}
```

### 版本
<a name="version"></a>

適用於所有請求映射範本，`version`定義範本使用的版本。`version` 為必要項目，且為靜態值：

```
"version": "2018-05-29"
```

### 作業
<a name="operation"></a>

Lambda 資料來源可讓您在 `operation` 欄位中定義兩個操作： `Invoke`和 `BatchInvoke`。`Invoke` 操作 lets AWS AppSync 知道 會為每個 GraphQL 欄位解析程式呼叫 Lambda 函數。`BatchInvoke`instructs AWS AppSync 會批次處理目前 GraphQL 欄位的請求。`operation` 欄位是必要的。

對於 `Invoke`，解析的請求映射範本符合 Lambda 函數的輸入承載。讓我們修改上述範例：

```
{
  "version": "2018-05-29",
  "operation": "Invoke",
    "payload": {
      "arguments": $util.toJson($context.arguments)
    }
}
```

這會解決並傳遞給 Lambda 函數，看起來可能會類似這樣：

```
{
  "version": "2018-05-29",
  "operation": "Invoke",
    "payload": {
      "arguments": {
        "id": "postId1"
      }
    }
}
```

對於 `BatchInvoke`，映射範本會套用至批次中的每個欄位解析程式。為了簡潔起見， AWS AppSync 會將所有解析的映射範本`payload`值合併到符合映射範本的單一物件下的清單中。以下範例範本顯示此合併：

```
{
  "version": "2018-05-29",
  "operation": "BatchInvoke",
  "payload": $util.toJson($context)
}
```

此範本已解析為以下映射文件：

```
{
  "version": "2018-05-29",
  "operation": "BatchInvoke",
  "payload": [
    {...}, // context for batch item 1
    {...}, // context for batch item 2
    {...}  // context for batch item 3
  ]
}
```

`payload` 清單的每個元素都會對應至單一批次項目。Lambda 函數也預期會傳回符合請求中傳送項目順序的清單形狀回應：

```
[
  { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 1
  { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 2
  { "data": {...}, "errorMessage": null, "errorType": null }  // result for batch item 3
]
```

### 酬載
<a name="payload"></a>

`payload` 欄位是容器，用來將任何格式正確的 JSON 傳遞至 Lambda 函數。如果 `operation` 欄位設定為 `BatchInvoke`， AWS AppSync 會將現有的`payload`值包裝在清單中。此 `payload` 欄位為選用。

### 調用類型
<a name="async-invocation-type"></a>

Lambda 資料來源可讓您定義兩種叫用類型： `RequestResponse`和 `Event`。調用類型與 [Lambda API](https://docs.aws.amazon.com//lambda/latest/api/API_Invoke.html) 中定義的調用類型同義。`RequestResponse` 叫用類型 lets AWS AppSync 會同步呼叫您的 Lambda 函數，以等待回應。`Event` 調用可讓您以非同步方式調用 Lambda 函數。如需 Lambda 如何處理`Event`調用類型請求的詳細資訊，請參閱[非同步調用](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html)。此 `invocationType` 欄位為選用。如果請求中未包含此欄位， AWS AppSync 會預設為`RequestResponse`叫用類型。

對於任何`invocationType`欄位，解析的請求符合 Lambda 函數的輸入承載。讓我們修改上述範例：

```
{
  "version": "2018-05-29",
  "operation": "Invoke",
  "invocationType": "Event"
  "payload": {
    "arguments": $util.toJson($context.arguments)
  }
}
```

這會解決並傳遞給 Lambda 函數，看起來可能會類似這樣：

```
{
  "version": "2018-05-29",
  "operation": "Invoke",
  "invocationType": "Event",
  "payload": {
    "arguments": {
      "id": "postId1"
    }
  }
}
```

當`BatchInvoke`操作與`Event`調用類型欄位搭配使用時， AWS AppSync 會以上述相同方式合併欄位解析程式，並將請求做為非同步事件傳遞給您的 Lambda 函數，而 `payload`為值清單。我們建議您停用`Event`呼叫類型解析程式的解析程式快取，因為如果有快取命中，這些解析程式不會傳送至 Lambda。

## 回應映射範本
<a name="response-mapping-template"></a>

如同其他資料來源，您的 Lambda 函數會將回應傳送至 AWS AppSync，該回應必須轉換為 GraphQL 類型。

Lambda 函數的結果是在可透過 Velocity 範本語言 (VTL) `$context.result` 屬性取得的 `context` 物件上設定。

如果您的 Lambda 函式回應形狀完全匹配 GraphQL 類型形狀時，您可以使用以下回應映射範本轉送回應：

```
$util.toJson($context.result)
```

沒有任何必要欄位或形狀限制適用於回應映射範本。不過，由於 GraphQL 是強類型，解析後的映射範本必須符合預期的 GraphQL 類型。

## Lambda 函數批次回應
<a name="aws-appsync-resolver-mapping-template-reference-lambda-batched-response"></a>

如果 `operation` 欄位設定為 `BatchInvoke`， AWS AppSync 預期會從 Lambda 函數傳回項目清單。為了讓 AWS AppSync 將每個結果對應回原始請求項目，回應清單的大小和順序必須相符。在回應清單中有`null`項目是有效的；相應地`$ctx.result`設定為 *null*。

## Direct Lambda 解析程式
<a name="direct-lambda-resolvers"></a>

如果您想要完全避免使用映射範本， AWS AppSync 可以為 Lambda 函數提供預設承載，並為 GraphQL 類型提供預設 Lambda 函數回應。您可以選擇提供請求範本、回應範本或兩者，而 AWS AppSync 會相應地處理它。

### Direct Lambda 請求映射範本
<a name="lambda-mapping-template-bypass-request"></a>

未提供請求映射範本時， AWS AppSync 會將`Context`物件直接傳送到 Lambda 函數做為 `Invoke`操作。如需 `Context` 物件結構的詳細資訊，請參閱 [AWS AppSync 解析程式映射範本內容參考](resolver-context-reference.md)。

### Direct Lambda 回應映射範本
<a name="lambda-mapping-template-bypass-response"></a>

未提供回應映射範本時， AWS AppSync 會在收到 Lambda 函數的回應時執行下列其中一項操作。如果您未提供請求映射範本，或者您提供了版本為 的請求映射範本`2018-05-29`，則回應將等同於下列回應映射範本：

```
#if($ctx.error)
     $util.error($ctx.error.message, $ctx.error.type, $ctx.result)
 #end
 $util.toJson($ctx.result)
```

如果您提供具有 版本的範本`2017-02-28`，回應邏輯函數相當於下列回應映射範本：

```
$util.toJson($ctx.result)
```

實際上，映射範本繞過的運作方式類似於使用某些映射範本，如上述範例所示。不過，在幕後，映射範本的評估會完全規避。由於會略過範本評估步驟，因此與具有需要評估之回應映射範本的 Lambda 函數相比，在某些情況下，應用程式在回應期間可能會遇到較少的額外負荷和延遲。

### Direct Lambda Resolver 回應中的自訂錯誤處理
<a name="lambda-mapping-template-bypass-errors"></a>

您可以透過提出自訂例外狀況，從直接 Lambda 解析程式叫用的 Lambda 函數自訂錯誤回應。下列範例示範如何使用 JavaScript 建立自訂例外狀況：

```
class CustomException extends Error {
  constructor(message) {
    super(message);
    this.name = "CustomException";
  }
}
 
throw new CustomException("Custom message");
```

引發例外狀況時`message`， `errorType`和 分別`errorMessage`是擲回之自訂錯誤的 `name`和 。

如果 `errorType`是 `UnauthorizedException`， AWS AppSync 會傳回預設訊息 (`"You are not authorized to make this call."`)，而不是自訂訊息。

下列程式碼片段是示範自訂 的範例 GraphQL 回應`errorType`：

```
{
  "data": {
    "query": null
  },
  "errors": [
    {
      "path": [
        "query"
      ],
      "data": null,
      "errorType": "CustomException",
      "errorInfo": null,
      "locations": [
        {
          "line": 5,
          "column": 10,
          "sourceName": null
        }
      ],
      "message": "Custom Message"
    }
  ]
}
```

### Direct Lambda 解析程式：啟用批次處理
<a name="lambda-resolvers-batching"></a>

您可以在解析程式`maxBatchSize`上設定 ，為 Direct Lambda Resolver 啟用批次處理。當 `maxBatchSize` 設定為大於 Direct Lambda 解析程式的值`0`時， AWS AppSync 會將請求批次傳送至 Lambda 函數，大小上限為 `maxBatchSize`。

在 Direct Lambda 解析程式`0`上將 `maxBatchSize`設定為 會關閉批次處理。

如需使用 Lambda 解析程式批次處理方式的詳細資訊，請參閱 [進階使用案例：批次處理](tutorial-lambda-resolvers.md#advanced-use-case-batching)。

#### 請求映射範本
<a name="lambda-resolvers-batching-request-template"></a>

啟用批次處理且未提供請求映射範本時， AWS AppSync 會將`Context`物件清單作為`BatchInvoke`操作直接傳送到 Lambda 函數。

#### 回應映射範本
<a name="lambda-resolvers-batching-response-template"></a>

啟用批次處理且未提供回應映射範本時，回應邏輯等同於下列回應映射範本：

```
#if( $context.result && $context.result.errorMessage )
      $utils.error($context.result.errorMessage, $context.result.errorType,
      $context.result.data)
#else
      $utils.toJson($context.result.data)
#end
```

Lambda 函數必須以與傳送的`Context`物件清單相同的順序傳回結果清單。您可以透過`errorType`為特定結果提供 `errorMessage`和 來傳回個別錯誤。清單中的每個結果都有下列格式：

```
{
   "data" : { ... }, // your data
   "errorMessage" : { ... }, // optional, if included an error entry is added to the "errors" object in the AppSync response 
   "errorType" : { ... } // optional, the error type
}
```

**注意**  
目前會忽略結果物件中的其他欄位。

#### 處理來自 Lambda 的錯誤
<a name="lambda-resolvers-batching-error-handling"></a>

您可以在 Lambda 函數中擲回例外狀況或錯誤，以傳回所有結果的錯誤。如果批次請求的承載請求或回應大小太大，Lambda 會傳回錯誤。在這種情況下，您應該考慮減少您的 `maxBatchSize`或減少回應承載的大小。

如需處理個別錯誤的資訊，請參閱 [傳回個別錯誤](tutorial-lambda-resolvers.md#returning-individual-errors)。

#### Lambda 函數範例
<a name="sample-lambda-function"></a>

使用以下結構描述，您可以為`Post.relatedPosts`欄位解析程式建立 Direct Lambda 解析程式，並透過在`maxBatchSize`上方設定 來啟用批次處理`0`：

```
schema {
    query: Query
    mutation: Mutation
}

type Query {
    getPost(id:ID!): Post
    allPosts: [Post]
}

type Mutation {
    addPost(id: ID!, author: String!, title: String, content: String, url: String): Post!
}

type Post {
    id: ID!
    author: String!
    title: String
    content: String
    url: String
    ups: Int
    downs: Int
    relatedPosts: [Post]
}
```

在下列查詢中，將會呼叫 Lambda 函數與批次請求來解析 `relatedPosts`：

```
query getAllPosts {
  allPosts {
    id
    relatedPosts {
      id
    }
  }
}
```

以下是 Lambda 函數的簡單實作：

```
const posts = {
  1: {
    id: '1',
    title: 'First book',
    author: 'Author1',
    url: 'https://amazon.com/',
    content:
      'SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1',
    ups: '100',
    downs: '10',
  },
  2: {
    id: '2',
    title: 'Second book',
    author: 'Author2',
    url: 'https://amazon.com',
    content: 'SAMPLE TEXT AUTHOR 2 SAMPLE TEXT AUTHOR 2 SAMPLE TEXT',
    ups: '100',
    downs: '10',
  },
  3: { id: '3', title: 'Third book', author: 'Author3', url: null, content: null, ups: null, downs: null },
  4: {
    id: '4',
    title: 'Fourth book',
    author: 'Author4',
    url: 'https://www.amazon.com/',
    content:
      'SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4',
    ups: '1000',
    downs: '0',
  },
  5: {
    id: '5',
    title: 'Fifth book',
    author: 'Author5',
    url: 'https://www.amazon.com/',
    content: 'SAMPLE TEXT AUTHOR 5 SAMPLE TEXT AUTHOR 5 SAMPLE TEXT AUTHOR 5 SAMPLE TEXT AUTHOR 5 SAMPLE TEXT',
    ups: '50',
    downs: '0',
  },
}

const relatedPosts = {
  1: [posts['4']],
  2: [posts['3'], posts['5']],
  3: [posts['2'], posts['1']],
  4: [posts['2'], posts['1']],
  5: [],
}
exports.handler = async (event) => {
  console.log('event ->', event)
  // retrieve the ID of each post
  const ids = event.map((context) => context.source.id)
  // fetch the related posts for each post id
  const related = ids.map((id) => relatedPosts[id])

  // return the related posts; or an error if none were found
  return related.map((r) => {
    if (r.length > 0) {
      return { data: r }
    } else {
      return { data: null, errorMessage: 'Not found', errorType: 'ERROR' }
    }
  })
}
```

# EventBridge 的AWS AppSync 解析程式映射範本參考
<a name="resolver-mapping-template-reference-eventbridge"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

與 EventBridge 資料來源搭配使用的 AWS AppSync 解析程式映射範本可讓您將自訂事件傳送至 Amazon EventBridge 匯流排。

## 請求映射範本
<a name="request-mapping-template"></a>

`PutEvents` 請求映射範本可讓您將多個自訂事件傳送至 EventBridge 事件匯流排。 映射文件結構如下：

```
{
    "version" : "2018-05-29", 
    "operation" : "PutEvents",
    "events" : [{}]
}
```

以下是 EventBridge 的請求映射範本範例：

```
{
    "version": "2018-05-29",
    "operation": "PutEvents",
    "events": [{
        "source": "com.mycompany.myapp",
        "detail": {
            "key1" : "value1",
            "key2" : "value2"
        },
        "detailType": "myDetailType1"
    },
    {
        "source": "com.mycompany.myapp",
        "detail": {
            "key3" : "value3",
            "key4" : "value4"
        },
        "detailType": "myDetailType2",
        "resources" : ["Resource1", "Resource2"],
        "time" : "2023-01-01T00:30:00.000Z"
    }
    
    ]
}
```

## 回應映射範本
<a name="response-mapping-template"></a>

如果`PutEvents`操作成功，EventBridge 的回應會包含在 中`$ctx.result`：

```
#if($ctx.error)
  $util.error($ctx.error.message, $ctx.error.type, $ctx.result)
#end
  $util.toJson($ctx.result)
```

執行 `InternalExceptions`或 等`PutEvents`操作時發生的錯誤`Timeouts`會出現在 中`$ctx.error`。如需 EventBridge 常見錯誤的清單，請參閱 [EventBridge 常見錯誤參考](https://docs.aws.amazon.com/eventbridge/latest/APIReference/CommonErrors.html)。

`result` 將採用下列格式：

```
{
    "Entries" [
        {
            "ErrorCode" : String,
            "ErrorMessage" : String,
            "EventId" : String
        }
    ],
    "FailedEntryCount" : number
}
```
+ **項目**

  擷取的事件結果成功和失敗。如果擷取成功，則項目`EventID`中會有 。否則，您可以使用 `ErrorCode`和 `ErrorMessage` 來識別項目的問題。

  對於每個記錄，回應元素的索引與請求陣列中的索引相同。
+ **FailedEntryCount**

  失敗項目的數量。此值以整數表示。

如需 回應的詳細資訊`PutEvents`，請參閱 [PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html#API_PutEvents_ResponseElements)。

**範例回應 1**

下列範例是具有兩個成功事件`PutEvents`的操作：

```
{
    "Entries" : [ 
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        }, 
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        }
    ],
    "FailedEntryCount" : 0
}
```

**範例回應 2**

下列範例是具有三個事件、兩個成功和一個失敗`PutEvents`的操作：

```
{
    "Entries" : [ 
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        }, 
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        },
        {
            "ErrorCode" : "SampleErrorCode",
            "ErrorMessage" : "Sample Error Message"
        }
    ],
    "FailedEntryCount" : 1
}
```

## `PutEvents` 欄位
<a name="putevents-field"></a>

`PutEvents` 包含下列映射範本欄位：
+ **版本**

  在所有請求映射範本中， `version` 欄位會定義範本使用的版本。此欄位為必填。此值`2018-05-29`是 EventBridge 映射範本唯一支援的版本。
+ **操作**

  唯一支援的操作是 `PutEvents`。此操作可讓您將自訂事件新增至事件匯流排。
+ **事件**

  將新增至事件匯流排的事件陣列。此陣列的配置應為 1 - 10 個項目。

  `Event` 物件是有效的 JSON 物件，具有下列欄位：
  + `"source"`：定義事件來源的字串。
  + `"detail"`：您可以用來連接事件相關資訊的 JSON 物件。此欄位可以是空的映射 `{ }` ()。
  + `"detailType`：識別事件類型的字串。
  + `"resources"`：可識別事件中所涉及資源的字串 JSON 陣列。此欄位可以是空陣列。
  + `"time"`：以字串提供的事件時間戳記。這應該遵循 [RFC3339](https://www.rfc-editor.org/rfc/rfc3339.txt) 時間戳記格式。

以下程式碼片段是一些有效`Event`物件的範例：

**範例 1**

```
{
    "source" : "source1",
    "detail" : {
        "key1" : [1,2,3,4],
        "key2" : "strval"
    },
    "detailType" : "sampleDetailType",
    "resources" : ["Resouce1", "Resource2"],
    "time" : "2022-01-10T05:00:10Z"
}
```

**範例 2**

```
{
    "source" : "source1",
    "detail" : {},
    "detailType" : "sampleDetailType"
}
```

**範例 3**

```
{
    "source" : "source1",
    "detail" : {
        "key1" : 1200
    },
    "detailType" : "sampleDetailType",
    "resources" : []
}
```

# `None` 資料來源的 AWS AppSync 解析程式映射範本參考
<a name="resolver-mapping-template-reference-none"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

與類型為 *None* 的資料來源搭配使用的 AWS AppSync 解析程式映射範本，可讓您塑造 AWS AppSync 本機操作的請求。

## 請求映射範本
<a name="request-mapping-template"></a>

映射範本非常簡單，可讓您透過 `payload` 欄位來傳遞任意數量的內容資訊。

```
{
   "version": string,
   "payload": any type
}
```

以下是請求映射範本在解析後呈現的 JSON 結構描述：

```
{
    "definitions": {},
    "$schema": "https://json-schema.org/draft-06/schema#",
    "$id": "https://aws.amazon.com/appsync/request-mapping-template.json",
    "type": "object",
    "properties": {
        "version": {
            "$id": "/properties/version",
            "type": "string",
            "enum": [
                "2018-05-29"
            ],
            "title": "The Mapping template version.",
            "default": "2018-05-29"
        },
        "payload": {}
    },
    "required": [
        "version"
    ],
    "additionalProperties": false
}
```

以下是透過 VTL 內容屬性 傳遞欄位引數的範例`$context.arguments`：

```
{
    "version": "2018-05-29",
    "payload": $util.toJson($context.arguments)
}
```

`payload` 欄位的值將轉發到回應映射範本，並可在 VTL 內容屬性 (`$context.result`) 上使用。

這是代表 `payload` 欄位插入值的範例：

```
{
    "id": "postId1"
}
```

## 版本
<a name="version"></a>

在所有請求映射範本中， `version` 欄位會定義範本使用的版本。

 `version` 欄位是必要的。

範例：

```
"version": "2018-05-29"
```

## 酬載
<a name="payload"></a>

`payload` 欄位是一種容器，您可以用來將任何格式正確的 JSON 傳遞到回應映射範本。

 此 `payload` 欄位為選用。

## 回應映射範本
<a name="response-mapping-template"></a>

由於沒有資料來源，`payload` 欄位的值將轉發到回應映射範本，並在可透過 VTL `context` 屬性使用的 `$context.result` 物件上設定。

如果您的 `payload` 欄位值形狀完全匹配 GraphQL 類型形狀時，您可以使用以下回應映射範本轉送回應：

```
$util.toJson($context.result)
```

沒有任何必要欄位或形狀限制適用於回應映射範本。不過，由於 GraphQL 是強類型，解析後的映射範本必須符合預期的 GraphQL 類型。

# HTTP 的 AWS AppSync 解析程式映射範本參考
<a name="resolver-mapping-template-reference-http"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

 AWS AppSync HTTP 解析程式映射範本可讓您將來自 AWS AppSync 的請求傳送至任何 HTTP 端點，並將來自 HTTP 端點的回應傳回 AWS AppSync。透過使用映射範本，您可以向 AWS AppSync 提供有關要叫用之操作性質的提示。本節說明支援的 HTTP 解析程式的不同映射範本。

## 請求映射範本
<a name="request-mapping-template"></a>

```
{
    "version": "2018-05-29",
    "method": "PUT|POST|GET|DELETE|PATCH",
    "params": {
        "query": Map,
        "headers": Map,
        "body": any
    },
    "resourcePath": string
}
```

在解析 HTTP 請求映射範本後，請求映射範本的 JSON 結構描述表示看起來會如下：

```
{
    "$id": "https://aws.amazon.com/appsync/request-mapping-template.json",
    "type": "object",
    "properties": {
        "version": {
        "$id": "/properties/version",
        "type": "string",
        "title": "The Version Schema ",
        "default": "",
        "examples": [
            "2018-05-29"
        ],
        "enum": [
            "2018-05-29"
        ]
        },
        "method": {
        "$id": "/properties/method",
        "type": "string",
        "title": "The Method Schema ",
        "default": "",
        "examples": [
            "PUT|POST|GET|DELETE|PATCH"
        ],
        "enum": [
            "PUT",
            "PATCH",
            "POST",
            "DELETE",
            "GET"
        ]
        },
        "params": {
        "$id": "/properties/params",
        "type": "object",
        "properties": {
            "query": {
            "$id": "/properties/params/properties/query",
            "type": "object"
            },
            "headers": {
            "$id": "/properties/params/properties/headers",
            "type": "object"
            },
            "body": {
            "$id": "/properties/params/properties/body",
            "type": "string",
            "title": "The Body Schema ",
            "default": "",
            "examples": [
                ""
            ]
            }
        }
        },
        "resourcePath": {
        "$id": "/properties/resourcePath",
        "type": "string",
        "title": "The Resourcepath Schema ",
        "default": "",
        "examples": [
            ""
        ]
        }
    },
    "required": [
        "version",
        "method",
        "resourcePath"
    ]
}
```

以下是 HTTP POST 請求的範例，其中包括 `text/plain` 本文：

```
{
    "version": "2018-05-29",
    "method": "POST",
    "params": {
        "headers":{
        "Content-Type":"text/plain"
        },
        "body":"this is an example of text body"
    },
    "resourcePath": "/"
}
```

## 版本
<a name="version"></a>

**注意**  
這僅適用於請求映射範本。

定義範本使用的版本。`version` 是所有請求映射範本的共用項目，並且是必要項目。

```
"version": "2018-05-29"
```

## Method
<a name="method"></a>

**注意**  
這僅適用於請求映射範本。

 AWS AppSync 傳送至 HTTP 端點的 HTTP 方法或動詞 (GET、POST、PUT、PATCH 或 DELETE)。

```
"method": "PUT"
```

## ResourcePath
<a name="resourcepath"></a>

**注意**  
這僅適用於請求映射範本。

您要存取的資源路徑。除了 HTTP 資料來源中的端點之外，資源路徑也會形成 AWS AppSync 服務發出請求的 URL。

```
"resourcePath": "/v1/users"
```

評估映射範本時，此路徑會做為 HTTP 請求的一部分進行傳送，包括 HTTP 端點。例如，之前的範例可轉譯如下：

```
PUT <endpoint>/v1/users
```

## 參數欄位
<a name="params-field"></a>

**注意**  
這僅適用於請求映射範本。

用來指定搜尋執行的動作，最常見的方式是設定**內文**中的**查詢**值。不過，有多項其他功能可設定，例如回應的格式。

** **標頭** **  
標頭資訊，以金鑰值對形式。金鑰與值皆必須為字串。  
例如：  

```
"headers" : {
    "Content-Type" : "application/json"
}
```
目前支援的 `Content-Type` 標頭包括：  

```
text/*
application/xml
application/json
application/soap+xml
application/x-amz-json-1.0
application/x-amz-json-1.1
application/vnd.api+json
application/x-ndjson
```
 **注意**：您不能設定以下 HTTP 標頭：  

```
HOST
CONNECTION
USER-AGENT
EXPECTATION
TRANSFER_ENCODING
CONTENT_LENGTH
```

** **query** **  
金鑰值對，指定常見的選項，例如 JSON 回應的程式碼格式。金鑰與值皆必須為字串。以下範例顯示如何傳送 `?type=json` 查詢字串：  

```
"query" : {
    "type" : "json"
}
```

** **本文** **  
此本文包含您選擇設定的 HTTP 請求本文。除非內容類型指定字元集，否則請求本文一律是 UTF-8 編碼的字串。  

```
"body":"body string"
```

## 回應
<a name="response"></a>

請見[此處](https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-http-resolvers.html)範例。

# HTTPS AWS AppSync 端點的憑證授權機構 (CA) 由 認可
<a name="http-cert-authorities"></a>

**注意**  
Let's Encrypt 是透過 *identrust* 和 *isrgrootx1* 憑證接受。如果您使用 Let's Encrypt，則不需要採取任何動作。

目前，使用 HTTPS 時，HTTP 解析程式不支援自我簽署憑證。 AWS AppSync 會在解析 HTTPS 的 SSL/TLS 憑證時辨識下列憑證授權單位：


**中的已知根憑證 AWS AppSync**  

| 名稱 | 日期 | SHA1 指紋 | 
| --- | --- | --- | 
| digicertassuredidrootca |  2018 年 4 月 21 日 | 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43 | 
| trustcenterclass2caii |  2018 年 4 月 21 日 | AE:50:83:ED:7C:F4:5C:BC:8F:61:C6:21:FE:68:5D:79:42:21:15:6E | 
| thawtepremiumserverca |  2018 年 4 月 21 日 | E0:AB:05:94:20:72:54:93:05:60:62:02:36:70:F7:CD:2E:FC:66:66 | 
| cia-crt-g3-02-ca |  2016 年 11 月 23 日 | 96:4A:BB:A7:BD:DA:FC:97:34:C0:0A:2D:F0:05:98:F7:E6:C6:6F:09 | 
| swisssignplatinumg2ca |  2018 年 4 月 21 日 | 56:E0:FA:C0:3B:8F:18:23:55:18:E5:D3:11:CA:E8:C2:43:31:AB:66 | 
| swisssignsilverg2ca |  2018 年 4 月 21 日 | 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB | 
| thawteserverca |  2018 年 4 月 21 日 | 9F:AD:91:A6:CE:6A:C6:C5:00:47:C4:4E:C9:D4:A5:0D:92:D8:49:79 | 
| equifaxsecureebusinessca1 |  2018 年 4 月 21 日 | AE:E6:3D:70:E3:76:FB:C7:3A:EB:B0:A1:C1:D4:C4:7A:A7:40:B3:F4 | 
| securetrustca |  2018 年 4 月 21 日 | 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11 | 
| utnuserfirstclientauthemailca |  2018 年 4 月 21 日 | B1:72:B1:A5:6D:95:F9:1F:E5:02:87:E1:4D:37:EA:6A:44:63:76:8A | 
| thawtepersonalfreemailca |  2018 年 4 月 21 日 | E6:18:83:AE:84:CA:C1:C1:CD:52:AD:E8:E9:25:2B:45:A6:4F:B7:E2 | 
| affirmtrustnetworkingca |  2018 年 4 月 21 日 | 29:36:21:02:8B:20:ED:02:F5:66:C5:32:D1:D6:ED:90:9F:45:00:2F | 
| entrustevca |  2018 年 4 月 21 日 | B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9 | 
| utnuserfirsthardwareca |  2018 年 4 月 21 日 | 04:83:ED:33:99:AC:36:08:05:87:22:ED:BC:5E:46:00:E3:BE:F9:D7 | 
| certumca |  2018 年 4 月 21 日 | 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18 | 
| addtrustclass1ca |  2018 年 4 月 21 日 | CC:AB:0E:A0:4C:23:01:D6:69:7B:DD:37:9F:CD:12:EB:24:E3:94:9D | 
| entrustrootcag2 |  2018 年 4 月 21 日 | 8C:F4:27:FD:79:0C:3A:D1:66:06:8D:E8:1E:57:EF:BB:93:22:72:D4 | 
| equifaxsecureca |  2018 年 4 月 21 日 | D2:32:09:AD:23:D3:14:23:21:74:E4:0D:7F:9D:62:13:97:86:63:3A | 
| quovadisrootca3 |  2018 年 4 月 21 日 | 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85 | 
| quovadisrootca2 |  2018 年 4 月 21 日 | CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7 | 
| digicertglobalrootg2 |  2018 年 4 月 21 日 | DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4 | 
| digicerthighassuranceevrootca |  2018 年 4 月 21 日 | 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25 | 
| secomvalicertclass1ca |  2018 年 4 月 21 日 | E5:DF:74:3C:B6:01:C4:9B:98:43:DC:AB:8C:E8:6A:81:10:9F:E4:8E | 
| equifaxsecureglobalebusinessca1 |  2018 年 4 月 21 日 | 3A:74:CB:7A:47:DB:70:DE:89:1F:24:35:98:64:B8:2D:82:BD:1A:36 | 
| geotrustuniversalca |  2018 年 4 月 21 日 | E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79 | 
| deprecateditsecca |  2012 年 1 月 27 日 | 12:12:0B:03:0E:15:14:54:F4:DD:B3:F5:DE:13:6E:83:5A:29:72:9D | 
| verisignclass3ca |  2018 年 4 月 21 日 | A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B | 
| thawteprimaryrootcag3 |  2018 年 4 月 21 日 | F1:8B:53:8D:1B:E9:03:B6:A6:F0:56:43:5B:17:15:89:CA:F3:6B:F2 | 
| thawteprimaryrootcag2 |  2018 年 4 月 21 日 | AA:DB:BC:22:23:8F:C4:01:A1:27:BB:38:DD:F4:1D:DB:08:9E:F0:12 | 
| deutschetelekomrootca2 |  2018 年 4 月 21 日 | 85:A4:08:C0:9C:19:3E:5D:51:58:7D:CD:D6:13:30:FD:8C:DE:37:BF | 
| buypassclass3ca |  2018 年 4 月 21 日 | DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57 | 
| utnuserfirstobjectca |  2018 年 4 月 21 日 | E1:2D:FB:4B:41:D7:D9:C3:2B:30:51:4B:AC:1D:81:D8:38:5E:2D:46 | 
| geotrustprimaryca |  2018 年 4 月 21 日 | 32:3C:11:8E:1B:F7:B8:B6:52:54:E2:E2:10:0D:D6:02:90:37:F0:96 | 
| buypassclass2ca |  2018 年 4 月 21 日 | 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99 | 
| baltimorecodesigningca |  2018 年 4 月 21 日 | 30:46:D8:C8:88:FF:69:30:C3:4A:FC:CD:49:27:08:7C:60:56:7B:0D | 
| verisignclass1ca |  2018 年 4 月 21 日 | CE:6A:64:A3:09:E4:2F:BB:D9:85:1C:45:3E:64:09:EA:E8:7D:60:F1 | 
| baltimorecybertrustca |  2018 年 4 月 21 日 | D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74 | 
| starfieldclass2ca |  2018 年 4 月 21 日 | AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A | 
| camerfirmachamberscommerceca |  2018 年 4 月 21 日 | 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1 | 
| ttelesecglobalrootclass3ca |  2018 年 4 月 21 日 | 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1 | 
| verisignclass3g5ca |  2018 年 4 月 21 日 | 4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5 | 
| ttelesecglobalrootclass2ca |  2018 年 4 月 21 日 | 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 | 
| trustcenteruniversalcai |  2018 年 4 月 21 日 | 6B:2F:34:AD:89:58:BE:62:FD:B0:6B:5C:CE:BB:9D:D9:4F:4E:39:F3 | 
| verisignclass3g4ca |  2018 年 4 月 21 日 | 22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A | 
| verisignclass3g3ca |  2018 年 4 月 21 日 | 13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6 | 
| xrampglobalca |  2018 年 4 月 21 日 | B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6 | 
| amzninternalrootca |  2008 年 12 月 12 日 | A7:B7:F6:15:8A:FF:1E:C8:85:13:38:BC:93:EB:A2:AB:A4:09:EF:06 | 
| certplusclass3pprimaryca |  2018 年 4 月 21 日 | 21:6B:2A:29:E6:2A:00:CE:82:01:46:D8:24:41:41:B9:25:11:B2:79 | 
| certumtrustednetworkca |  2018 年 4 月 21 日 | 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E | 
| verisignclass3g2ca |  2018 年 4 月 21 日 | 85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F | 
| globalsignr3ca |  2018 年 4 月 21 日 | D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD | 
| utndatacorpsgcca |  2018 年 4 月 21 日 | 58:11:9F:0E:12:82:87:EA:50:FD:D9:87:45:6F:4F:78:DC:FA:D6:D4 | 
| secomscrootca2 |  2018 年 4 月 21 日 | 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74 | 
| gtecybertrustglobalca |  2018 年 4 月 21 日 | 97:81:79:50:D8:1C:96:70:CC:34:D8:09:CF:79:44:31:36:7E:F4:74 | 
| secomscrootca1 |  2018 年 4 月 21 日 | 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7 | 
| affirmtrustcommercialca |  2018 年 4 月 21 日 | F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7 | 
| trustcenterclass4caii |  2018 年 4 月 21 日 | A6:9A:91:FD:05:7F:13:6A:42:63:0B:B1:76:0D:2D:51:12:0C:16:50 | 
| verisignuniversalrootca |  2018 年 4 月 21 日 | 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54 | 
| globalsignr2ca |  2018 年 4 月 21 日 | 75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE | 
| certplusclass2primaryca |  2018 年 4 月 21 日 | 74:20:74:41:72:9C:DD:92:EC:79:31:D8:23:10:8D:C2:81:92:E2:BB | 
| digicertglobalrootca |  2018 年 4 月 21 日 | A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36 | 
| globalsignca |  2018 年 4 月 21 日 | B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C | 
| thawteprimaryrootca |  2018 年 4 月 21 日 | 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81 | 
| starfieldrootg2ca |  2018 年 4 月 21 日 | B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E | 
| geotrustglobalca |  2018 年 4 月 21 日 | DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12 | 
| soneraclass2ca |  2018 年 4 月 21 日 | 37:F7:6D:E6:07:7C:90:C5:B1:3E:93:1A:B7:41:10:B4:F2:E4:9A:27 | 
| verisigntsaca |  2018 年 4 月 21 日 | 20:CE:B1:F0:F5:1C:0E:19:A9:F3:8D:B1:AA:8E:03:8C:AA:7A:C7:01 | 
| soneraclass1ca |  2018 年 4 月 21 日 | 07:47:22:01:99:CE:74:B9:7C:B0:3D:79:B2:64:A2:C8:55:E9:33:FF | 
| quovadisrootca |  2018 年 4 月 21 日 | DE:3F:40:BD:50:93:D3:9B:6C:60:F6:DA:BC:07:62:01:00:89:76:C9 | 
| affirmtrustpremiumeccca |  2018 年 4 月 21 日 | B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB | 
| starfieldservicesrootg2ca |  2018 年 4 月 21 日 | 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F | 
| valicertclass2ca |  2018 年 4 月 21 日 | 31:7A:2A:D0:7F:2B:33:5E:F5:A1:C3:4E:4B:57:E8:B7:D8:F1:FC:A6 | 
| comodoaaaca |  2018 年 4 月 21 日 | D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49 | 
| aolrootca2 |  2018 年 4 月 21 日 | 85:B5:FF:67:9B:0C:79:96:1F:C8:6E:44:22:00:46:13:DB:17:92:84 | 
| keynectisrootca |  2018 年 4 月 21 日 | 9C:61:5C:4D:4D:85:10:3A:53:26:C2:4D:BA:EA:E4:A2:D2:D5:CC:97 | 
| addtrustqualifiedca |  2018 年 4 月 21 日 | 4D:23:78:EC:91:95:39:B5:00:7F:75:8F:03:3B:21:1E:C5:4D:8B:CF | 
| aolrootca1 |  2018 年 4 月 21 日 | 39:21:C1:15:C1:5D:0E:CA:5C:CB:5B:C4:F0:7D:21:D8:05:0B:56:6A | 
| verisignclass2g3ca |  2018 年 4 月 21 日 | 61:EF:43:D7:7F:CA:D4:61:51:BC:98:E0:C3:59:12:AF:9F:EB:63:11 | 
| addtrustexternalca |  2018 年 4 月 21 日 | 02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68 | 
| verisignclass2g2ca |  2018 年 4 月 21 日 | B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D | 
| geotrustprimarycag3 |  2018 年 4 月 21 日 | 03:9E:ED:B8:0B:E7:A0:3C:69:53:89:3B:20:D2:D9:32:3A:4C:2A:FD | 
| geotrustprimarycag2 |  2018 年 4 月 21 日 | 8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0 | 
| swisssigngoldg2ca |  2018 年 4 月 21 日 | D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61 | 
| entrust2048ca |  2018 年 4 月 21 日 | 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31 | 
| chunghwaepkirootca |  2018 年 4 月 21 日 | 67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0 | 
| camerfirmachambersignca |  2018 年 4 月 21 日 | 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C | 
| camerfirmachambersca |  2018 年 4 月 21 日 | 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C | 
| godaddyclass2ca |  2018 年 4 月 21 日 | 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4 | 
| affirmtrustpremiumca |  2018 年 4 月 21 日 | D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27 | 
| verisignclass1g3ca |  2018 年 4 月 21 日 | 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5 | 
| secomevrootca1 |  2018 年 4 月 21 日 | FE:B8:C4:32:DC:F9:76:9A:CE:AE:3D:D8:90:8F:FD:28:86:65:64:7D | 
| verisignclass1g2ca |  2018 年 4 月 21 日 | 27:3E:E1:24:57:FD:C4:F9:0C:55:E8:2B:56:16:7F:62:F5:32:E5:47 | 
| amzninternalinfoseccag3 |  2015 年 2 月 27 日 | B9:B1:CA:38:F7:BF:9C:D2:D4:95:E7:B6:5E:75:32:9B:A8:78:2E:F6 | 
| cia-crt-g3-01-ca |  2016 年 11 月 23 日 | 2B:EE:2C:BA:A3:1D:B5:FE:60:40:41:95:08:ED:46:82:39:4D:ED:E2 | 
| godaddyrootg2ca |  2018 年 4 月 21 日 | 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B | 
| digicertassuredidrootca |  2018 年 4 月 21 日 | 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43 | 
| microseceszignorootca2009 |  2018 年 4 月 21 日 | 89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E | 
| affirmtrustcommercial |  2018 年 4 月 21 日 | F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7 | 
| comodoecccertificationauthority |  2018 年 4 月 21 日 | 9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11 | 
| cadisigrootr2 |  2018 年 4 月 21 日 | B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71 | 
| swisssignsilvercag2 |  2018 年 4 月 21 日 | 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB | 
| securetrustca |  2018 年 4 月 21 日 | 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11 | 
| cadisigrootr1 |  2018 年 4 月 21 日 | 8E:1C:74:F8:A6:20:B9:E5:8A:F4:61:FA:EC:2B:47:56:51:1A:52:C6 | 
| accvraiz1 |  2018 年 4 月 21 日 | 93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17 | 
| entrustrootcertificationauthority |  2018 年 4 月 21 日 | B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9 | 
| camerfirmaglobalchambersignroot |  2018 年 4 月 21 日 | 33:9B:6B:14:50:24:9B:55:7A:01:87:72:84:D9:E0:2F:C3:D2:D8:E9 | 
| dstacescax6 |  2018 年 4 月 21 日 | 40:54:DA:6F:1C:3F:40:74:AC:ED:0F:EC:CD:DB:79:D1:53:FB:90:1D | 
| identrustpublicsectorrootca1 |  2018 年 4 月 21 日 | BA:29:41:60:77:98:3F:F4:F3:EF:F2:31:05:3B:2E:EA:6D:4D:45:FD | 
| starfieldrootcertificateauthorityg2 |  2018 年 4 月 21 日 | B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E | 
| secureglobalca |  2018 年 4 月 21 日 | 3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B | 
| eecertificationcentrerootca |  2018 年 4 月 21 日 | C9:A8:B9:E7:55:80:5E:58:E3:53:77:A7:25:EB:AF:C3:7B:27:CC:D7 | 
| opentrustrootcag3 |  2018 年 4 月 21 日 | 6E:26:64:F3:56:BF:34:55:BF:D1:93:3F:7C:01:DE:D8:13:DA:8A:A6 | 
| teliasonerarootcav1 |  2018 年 4 月 21 日 | 43:13:BB:96:F1:D5:86:9B:C1:4E:6A:92:F6:CF:F6:34:69:87:82:37 | 
| autoridaddecertificacionfirmaprofesionalcifa62634068 |  2018 年 4 月 21 日 | AE:C5:FB:3F:C8:E1:BF:C4:E5:4F:03:07:5A:9A:E8:00:B7:F7:B6:FA | 
| opentrustrootcag2 |  2018 年 4 月 21 日 | 79:5F:88:60:C5:AB:7C:3D:92:E6:CB:F4:8D:E1:45:CD:11:EF:60:0B | 
| opentrustrootcag1 |  2018 年 4 月 21 日 | 79:91:E8:34:F7:E2:EE:DD:08:95:01:52:E9:55:2D:14:E9:58:D5:7E | 
| globalsigneccrootcar5 |  2018 年 4 月 21 日 | 1F:24:C6:30:CD:A4:18:EF:20:69:FF:AD:4F:DD:5F:46:3A:1B:69:AA | 
| globalsigneccrootcar4 |  2018 年 4 月 21 日 | 69:69:56:2E:40:80:F4:24:A1:E7:19:9F:14:BA:F3:EE:58:AB:6A:BB | 
| izenpecom |  2018 年 4 月 21 日 | 2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19 | 
| turktrustelektroniksertifikahizmetsaglayicisih5 |  2018 年 4 月 21 日 | C4:18:F6:4D:46:D1:DF:00:3D:27:30:13:72:43:A9:12:11:C6:75:FB | 
| gdcatrustauthr5root |  2018 年 4 月 21 日 | 0F:36:38:5B:81:1A:25:C3:9B:31:4E:83:CA:E9:34:66:70:CC:74:B4 | 
| dtrustrootclass3ca22009 |  2018 年 4 月 21 日 | 58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0 | 
| quovadisrootca3 |  2018 年 4 月 21 日 | 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85 | 
| quovadisrootca2 |  2018 年 4 月 21 日 | CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7 | 
| geotrustprimarycertificationauthorityg3 |  2018 年 4 月 21 日 | 03:9E:ED:B8:0B:E7:A0:3C:69:53:89:3B:20:D2:D9:32:3A:4C:2A:FD | 
| geotrustprimarycertificationauthorityg2 |  2018 年 4 月 21 日 | 8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0 | 
| oistewisekeyglobalrootgbca |  2018 年 4 月 21 日 | 0F:F9:40:76:18:D3:D7:6A:4B:98:F0:A8:35:9E:0C:FD:27:AC:CC:ED | 
| addtrustexternalroot |  2018 年 4 月 21 日 | 02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68 | 
| chambersofcommerceroot2008 |  2018 年 4 月 21 日 | 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C | 
| digicertglobalrootg3 |  2018 年 4 月 21 日 | 7E:04:DE:89:6A:3E:66:6D:00:E6:87:D3:3F:FA:D9:3B:E8:3D:34:9E | 
| comodoaaaservicesroot |  2018 年 4 月 21 日 | D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49 | 
| digicertglobalrootg2 |  2018 年 4 月 21 日 | DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4 | 
| certinomisrootca |  2018 年 4 月 21 日 | 9D:70:BB:01:A5:A4:A0:18:11:2E:F7:1C:01:B9:32:C5:34:E7:88:A8 | 
| oistewisekeyglobalrootgaca |  2018 年 4 月 21 日 | 59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9 | 
| dstrootcax3 |  2018 年 4 月 21 日 | DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13 | 
| certigna |  2018 年 4 月 21 日 | B1:2E:13:63:45:86:A4:6F:1A:B2:60:68:37:58:2D:C4:AC:FD:94:97 | 
| digicerthighassuranceevrootca |  2018 年 4 月 21 日 | 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25 | 
| soneraclass2rootca |  2018 年 4 月 21 日 | 37:F7:6D:E6:07:7C:90:C5:B1:3E:93:1A:B7:41:10:B4:F2:E4:9A:27 | 
| trustcorrootcertca2 |  2018 年 4 月 21 日 | B8:BE:6D:CB:56:F1:55:B9:63:D4:12:CA:4E:06:34:C7:94:B2:1C:C0 | 
| usertrustrsacertificationauthority |  2018 年 4 月 21 日 | 2B:8F:1B:57:33:0D:BB:A2:D0:7A:6C:51:F7:0E:E9:0D:DA:B9:AD:8E | 
| trustcorrootcertca1 |  2018 年 4 月 21 日 | FF:BD:CD:E7:82:C8:43:5E:3C:6F:26:86:5C:CA:A8:3A:45:5B:C3:0A | 
| geotrustuniversalca |  2018 年 4 月 21 日 | E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79 | 
| certsignrootca |  2018 年 4 月 21 日 | FA:B7:EE:36:97:26:62:FB:2D:B0:2A:F6:BF:03:FD:E8:7C:4B:2F:9B | 
| amazonrootca4 |  2018 年 4 月 21 日 | F6:10:84:07:D6:F8:BB:67:98:0C:C2:E2:44:C2:EB:AE:1C:EF:63:BE | 
| amazonrootca3 |  2018 年 4 月 21 日 | 0D:44:DD:8C:3C:8C:1A:1A:58:75:64:81:E9:0F:2E:2A:FF:B3:D2:6E | 
| amazonrootca2 |  2018 年 4 月 21 日 | 5A:8C:EF:45:D7:A6:98:59:76:7A:8C:8B:44:96:B5:78:CF:47:4B:1A | 
| verisignuniversalrootcertificationauthority |  2018 年 4 月 21 日 | 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54 | 
| amazonrootca1 |  2018 年 4 月 21 日 | 8D:A7:F9:65:EC:5E:FC:37:91:0F:1C:6E:59:FD:C1:CC:6A:6E:DE:16 | 
| networksolutionscertificateauthority |  2018 年 4 月 21 日 | 74:F8:A3:C3:EF:E7:B3:90:06:4B:83:90:3C:21:64:60:20:E5:DF:CE | 
| thawteprimaryrootcag3 |  2018 年 4 月 21 日 | F1:8B:53:8D:1B:E9:03:B6:A6:F0:56:43:5B:17:15:89:CA:F3:6B:F2 | 
| affirmtrustnetworking |  2018 年 4 月 21 日 | 29:36:21:02:8B:20:ED:02:F5:66:C5:32:D1:D6:ED:90:9F:45:00:2F | 
| thawteprimaryrootcag2 |  2018 年 4 月 21 日 | AA:DB:BC:22:23:8F:C4:01:A1:27:BB:38:DD:F4:1D:DB:08:9E:F0:12 | 
| trustcoreca1 |  2018 年 4 月 21 日 | 58:D1:DF:95:95:67:6B:63:C0:F0:5B:1C:17:4D:8B:84:0B:C8:78:BD | 
| deutschetelekomrootca2 |  2018 年 4 月 21 日 | 85:A4:08:C0:9C:19:3E:5D:51:58:7D:CD:D6:13:30:FD:8C:DE:37:BF | 
| godaddyrootcertificateauthorityg2 |  2018 年 4 月 21 日 | 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B | 
| entrustrootcertificationauthorityec1 |  2018 年 4 月 21 日 | 20:D8:06:40:DF:9B:25:F5:12:25:3A:11:EA:F7:59:8A:EB:14:B5:47 | 
| szafirrootca2 |  2018 年 4 月 21 日 | E2:52:FA:95:3F:ED:DB:24:60:BD:6E:28:F3:9C:CC:CF:5E:B3:3F:DE | 
| tubitakkamusmsslkoksertifikasisurum1 |  2018 年 4 月 21 日 | 31:43:64:9B:EC:CE:27:EC:ED:3A:3F:0B:8F:0D:E4:E8:91:DD:EE:CA | 
| buypassclass3rootca |  2018 年 4 月 21 日 | DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57 | 
| comodorsacertificationauthority |  2018 年 4 月 21 日 | AF:E5:D2:44:A8:D1:19:42:30:FF:47:9F:E2:F8:97:BB:CD:7A:8C:B4 | 
| netlockaranyclassgoldfotanusitvany |  2018 年 4 月 21 日 | 06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91 | 
| securitycommunicationrootca2 |  2018 年 4 月 21 日 | 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74 | 
| dtrustrootclass3ca2ev2009 |  2018 年 4 月 21 日 | 96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83 | 
| starfieldclass2ca |  2018 年 4 月 21 日 | AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A | 
| pscprocert |  2018 年 4 月 21 日 | 70:C1:8D:74:B4:28:81:0A:E4:FD:A5:75:D7:01:9F:99:B0:3D:50:74 | 
| actalisauthenticationrootca |  2018 年 4 月 21 日 | F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC | 
| staatdernederlandenrootcag3 |  2018 年 4 月 21 日 | D8:EB:6B:41:51:92:59:E0:F3:E7:85:00:C0:3D:B6:88:97:C9:EE:FC | 
| cfcaevroot |  2018 年 4 月 21 日 | E2:B8:29:4B:55:84:AB:6B:58:C2:90:46:6C:AC:3F:B8:39:8F:84:83 | 
| digicerttrustedrootg4 |  2018 年 4 月 21 日 | DD:FB:16:CD:49:31:C9:73:A2:03:7D:3F:C8:3A:4D:7D:77:5D:05:E4 | 
| staatdernederlandenrootcag2 |  2018 年 4 月 21 日 | 59:AF:82:79:91:86:C7:B4:75:07:CB:CF:03:57:46:EB:04:DD:B7:16 | 
| securitycommunicationevrootca1 |  2018 年 4 月 21 日 | FE:B8:C4:32:DC:F9:76:9A:CE:AE:3D:D8:90:8F:FD:28:86:65:64:7D | 
| globalsignrootcar3 |  2018 年 4 月 21 日 | D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD | 
| globalsignrootcar2 |  2018 年 4 月 21 日 | 75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE | 
| certumtrustednetworkca2 |  2018 年 4 月 21 日 | D3:DD:48:3E:2B:BF:4C:05:E8:AF:10:F5:FA:76:26:CF:D3:DC:30:92 | 
| acraizfnmtrcm |  2018 年 4 月 21 日 | EC:50:35:07:B2:15:C4:95:62:19:E2:A8:9A:5B:42:99:2C:4C:2C:20 | 
| hellenicacademicandresearchinstitutionseccrootca2015 |  2018 年 4 月 21 日 | 9F:F1:71:8D:92:D5:9A:F3:7D:74:97:B4:BC:6F:84:68:0B:BA:B6:66 | 
| certplusrootcag2 |  2018 年 4 月 21 日 | 4F:65:8E:1F:E9:06:D8:28:02:E9:54:47:41:C9:54:25:5D:69:CC:1A | 
| twcarootcertificationauthority |  2018 年 4 月 21 日 | CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48 | 
| twcaglobalrootca |  2018 年 4 月 21 日 | 9C:BB:48:53:F6:A4:F6:D3:52:A4:E8:32:52:55:60:13:F5:AD:AF:65 | 
| certplusrootcag1 |  2018 年 4 月 21 日 | 22:FD:D0:B7:FD:A2:4E:0D:AC:49:2C:A0:AC:A6:7B:6A:1F:E3:F7:66 | 
| geotrustuniversalca2 |  2018 年 4 月 21 日 | 37:9A:19:7B:41:85:45:35:0C:A6:03:69:F3:3C:2E:AF:47:4F:20:79 | 
| baltimorecybertrustroot |  2018 年 4 月 21 日 | D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74 | 
| buypassclass2rootca |  2018 年 4 月 21 日 | 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99 | 
| certumtrustednetworkca |  2018 年 4 月 21 日 | 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E | 
| digicertassuredidrootg3 |  2018 年 4 月 21 日 | F5:17:A2:4F:9A:48:C6:C9:F8:A2:00:26:9F:DC:0F:48:2C:AB:30:89 | 
| digicertassuredidrootg2 |  2018 年 4 月 21 日 | A1:4B:48:D9:43:EE:0A:0E:40:90:4F:3C:E0:A4:C0:91:93:51:5D:3F | 
| isrgrootx1 |  2018 年 4 月 21 日 | CA:BD:2A:79:A1:07:6A:31:F2:1D:25:36:35:CB:03:9D:43:29:A5:E8 | 
| entrustnetpremium2048secureserverca |  2018 年 4 月 21 日 | 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31 | 
| certplusclass2primaryca |  2018 年 4 月 21 日 | 74:20:74:41:72:9C:DD:92:EC:79:31:D8:23:10:8D:C2:81:92:E2:BB | 
| digicertglobalrootca |  2018 年 4 月 21 日 | A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36 | 
| entrustrootcertificationauthorityg2 |  2018 年 4 月 21 日 | 8C:F4:27:FD:79:0C:3A:D1:66:06:8D:E8:1E:57:EF:BB:93:22:72:D4 | 
| starfieldservicesrootcertificateauthorityg2 |  2018 年 4 月 21 日 | 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F | 
| thawteprimaryrootca |  2018 年 4 月 21 日 | 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81 | 
| atostrustedroot2011 |  2018 年 4 月 21 日 | 2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21 | 
| geotrustglobalca |  2018 年 4 月 21 日 | DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12 | 
| luxtrustglobalroot2 |  2018 年 4 月 21 日 | 1E:0E:56:19:0A:D1:8B:25:98:B2:04:44:FF:66:8A:04:17:99:5F:3F | 
| etugracertificationauthority |  2018 年 4 月 21 日 | 51:C6:E7:08:49:06:6E:F3:92:D4:5C:A0:0D:6D:A3:62:8F:C3:52:39 | 
| visaecommerceroot |  2018 年 4 月 21 日 | 70:17:9B:86:8C:00:A4:FA:60:91:52:22:3F:9F:3E:32:BD:E0:05:62 | 
| quovadisrootca |  2018 年 4 月 21 日 | DE:3F:40:BD:50:93:D3:9B:6C:60:F6:DA:BC:07:62:01:00:89:76:C9 | 
| identrustcommercialrootca1 |  2018 年 4 月 21 日 | DF:71:7E:AA:4A:D9:4E:C9:55:84:99:60:2D:48:DE:5F:BC:F0:3A:25 | 
| staatdernederlandenevrootca |  2018 年 4 月 21 日 | 76:E2:7E:C1:4F:DB:82:C1:C0:A6:75:B5:05:BE:3D:29:B4:ED:DB:BB | 
| ttelesecglobalrootclass3 |  2018 年 4 月 21 日 | 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1 | 
| ttelesecglobalrootclass2 |  2018 年 4 月 21 日 | 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 | 
| comodocertificationauthority |  2018 年 4 月 21 日 | 66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B | 
| securitycommunicationrootca |  2018 年 4 月 21 日 | 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7 | 
| quovadisrootca3g3 |  2018 年 4 月 21 日 | 48:12:BD:92:3C:A8:C4:39:06:E7:30:6D:27:96:E6:A4:CF:22:2E:7D | 
| xrampglobalcaroot |  2018 年 4 月 21 日 | B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6 | 
| securesignrootca11 |  2018 年 4 月 21 日 | 3B:C4:9F:48:F8:F3:73:A0:9C:1E:BD:F8:5B:B1:C3:65:C7:D8:11:B3 | 
| affirmtrustpremium |  2018 年 4 月 21 日 | D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27 | 
| globalsignrootca |  2018 年 4 月 21 日 | B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C | 
| swisssigngoldcag2 |  2018 年 4 月 21 日 | D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61 | 
| quovadisrootca2g3 |  2018 年 4 月 21 日 | 09:3C:61:F3:8B:8B:DC:7D:55:DF:75:38:02:05:00:E1:25:F5:C8:36 | 
| affirmtrustpremiumecc |  2018 年 4 月 21 日 | B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB | 
| geotrustprimarycertificationauthority |  2018 年 4 月 21 日 | 32:3C:11:8E:1B:F7:B8:B6:52:54:E2:E2:10:0D:D6:02:90:37:F0:96 | 
| quovadisrootca1g3 |  2018 年 4 月 21 日 | 1B:8E:EA:57:96:29:1A:C9:39:EA:B8:0A:81:1A:73:73:C0:93:79:67 | 
| hongkongpostrootca1 |  2018 年 4 月 21 日 | D6:DA:A8:20:8D:09:D2:15:4D:24:B5:2F:CB:34:6E:B2:58:B2:8A:58 | 
| usertrustecccertificationauthority |  2018 年 4 月 21 日 | D1:CB:CA:5D:B2:D5:2A:7F:69:3B:67:4D:E5:F0:5A:1D:0C:95:7D:F0 | 
| cybertrustglobalroot |  2018 年 4 月 21 日 | 5F:43:E5:B1:BF:F8:78:8C:AC:1C:C7:CA:4A:9A:C6:22:2B:CC:34:C6 | 
| godaddyclass2ca |  2018 年 4 月 21 日 | 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4 | 
| hellenicacademicandresearchinstitutionsrootca2015 |  2018 年 4 月 21 日 | 01:0C:06:95:A6:98:19:14:FF:BF:5F:C6:B0:B6:95:EA:29:E9:12:A6 | 
| ecacc |  2018 年 4 月 21 日 | 28:90:3A:63:5B:52:80:FA:E6:77:4C:0B:6D:A7:D6:BA:A6:4A:F2:E8 | 
| hellenicacademicandresearchinstitutionsrootca2011 |  2018 年 4 月 21 日 | FE:45:65:9B:79:03:5B:98:A1:61:B5:51:2E:AC:DA:58:09:48:22:4D | 
| verisignclass3publicprimarycertificationauthorityg5 |  2018 年 4 月 21 日 | 4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5 | 
| verisignclass3publicprimarycertificationauthorityg4 |  2018 年 4 月 21 日 | 22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A | 
| verisignclass3publicprimarycertificationauthorityg3 |  2018 年 4 月 21 日 | 13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6 | 
| trustisfpsrootca |  2018 年 4 月 21 日 | 3B:C0:38:0B:33:C3:F6:A6:0C:86:15:22:93:D9:DF:F5:4B:81:C0:04 | 
| epkirootcertificationauthority |  2018 年 4 月 21 日 | 67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0 | 
| globalchambersignroot2008 |  2018 年 4 月 21 日 | 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C | 
| camerfirmachambersofcommerceroot |  2018 年 4 月 21 日 | 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1 | 
| mozillacert81.pem |  2014 年 3 月 13 日 | 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E | 
| mozillacert99.pem |  2014 年 3 月 13 日 | F1:7F:6F:B6:31:DC:99:E3:A3:C8:7F:FE:1C:F1:81:10:88:D9:60:33 | 
| mozillacert145.pem |  2014 年 3 月 13 日 | 10:1D:FA:3F:D5:0B:CB:BB:9B:B5:60:0C:19:55:A4:1A:F4:73:3A:04 | 
| mozillacert37.pem |  2014 年 3 月 13 日 | B1:2E:13:63:45:86:A4:6F:1A:B2:60:68:37:58:2D:C4:AC:FD:94:97 | 
| mozillacert4.pem |  2014 年 3 月 13 日 | E3:92:51:2F:0A:CF:F5:05:DF:F6:DE:06:7F:75:37:E1:65:EA:57:4B | 
| mozillacert70.pem |  2014 年 3 月 13 日 | 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C | 
| mozillacert88.pem |  2014 年 3 月 13 日 | FE:45:65:9B:79:03:5B:98:A1:61:B5:51:2E:AC:DA:58:09:48:22:4D | 
| mozillacert134.pem |  2014 年 3 月 13 日 | 70:17:9B:86:8C:00:A4:FA:60:91:52:22:3F:9F:3E:32:BD:E0:05:62 | 
| mozillacert26.pem |  2014 年 3 月 13 日 | 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11 | 
| mozillacert77.pem |  2014 年 3 月 13 日 | 13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6 | 
| mozillacert123.pem |  2014 年 3 月 13 日 | 2A:B6:28:48:5E:78:FB:F3:AD:9E:79:10:DD:6B:DF:99:72:2C:96:E5 | 
| mozillacert15.pem |  2014 年 3 月 13 日 | 74:20:74:41:72:9C:DD:92:EC:79:31:D8:23:10:8D:C2:81:92:E2:BB | 
| mozillacert66.pem |  2014 年 3 月 13 日 | DD:E1:D2:A9:01:80:2E:1D:87:5E:84:B3:80:7E:4B:B1:FD:99:41:34 | 
| mozillacert112.pem |  2014 年 3 月 13 日 | 43:13:BB:96:F1:D5:86:9B:C1:4E:6A:92:F6:CF:F6:34:69:87:82:37 | 
| mozillacert55.pem |  2014 年 3 月 13 日 | AA:DB:BC:22:23:8F:C4:01:A1:27:BB:38:DD:F4:1D:DB:08:9E:F0:12 | 
| mozillacert101.pem |  2014 年 3 月 13 日 | 99:A6:9B:E6:1A:FE:88:6B:4D:2B:82:00:7C:B8:54:FC:31:7E:15:39 | 
| mozillacert119.pem |  2014 年 3 月 13 日 | 75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE | 
| mozillacert44.pem |  2014 年 3 月 13 日 | 5F:43:E5:B1:BF:F8:78:8C:AC:1C:C7:CA:4A:9A:C6:22:2B:CC:34:C6 | 
| mozillacert108.pem |  2014 年 3 月 13 日 | B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C | 
| mozillacert95.pem |  2014 年 3 月 13 日 | DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57 | 
| mozillacert141.pem |  2014 年 3 月 13 日 | 31:7A:2A:D0:7F:2B:33:5E:F5:A1:C3:4E:4B:57:E8:B7:D8:F1:FC:A6 | 
| mozillacert33.pem |  2014 年 3 月 13 日 | FE:B8:C4:32:DC:F9:76:9A:CE:AE:3D:D8:90:8F:FD:28:86:65:64:7D | 
| mozillacert0.pem |  2014 年 3 月 13 日 | 97:81:79:50:D8:1C:96:70:CC:34:D8:09:CF:79:44:31:36:7E:F4:74 | 
| mozillacert84.pem |  2014 年 3 月 13 日 | D3:C0:63:F2:19:ED:07:3E:34:AD:5D:75:0B:32:76:29:FF:D5:9A:F2 | 
| mozillacert130.pem |  2014 年 3 月 13 日 | E5:DF:74:3C:B6:01:C4:9B:98:43:DC:AB:8C:E8:6A:81:10:9F:E4:8E | 
| mozillacert148.pem |  2014 年 3 月 13 日 | 04:83:ED:33:99:AC:36:08:05:87:22:ED:BC:5E:46:00:E3:BE:F9:D7 | 
| mozillacert22.pem |  2014 年 3 月 13 日 | 32:3C:11:8E:1B:F7:B8:B6:52:54:E2:E2:10:0D:D6:02:90:37:F0:96 | 
| mozillacert7.pem |  2014 年 3 月 13 日 | AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A | 
| mozillacert73.pem |  2014 年 3 月 13 日 | B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E | 
| mozillacert137.pem |  2014 年 3 月 13 日 | 4A:65:D5:F4:1D:EF:39:B8:B8:90:4A:4A:D3:64:81:33:CF:C7:A1:D1 | 
| mozillacert11.pem |  2014 年 3 月 13 日 | 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43 | 
| mozillacert29.pem |  2014 年 3 月 13 日 | 74:F8:A3:C3:EF:E7:B3:90:06:4B:83:90:3C:21:64:60:20:E5:DF:CE | 
| mozillacert62.pem |  2014 年 3 月 13 日 | A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B | 
| mozillacert126.pem |  2014 年 3 月 13 日 | 25:01:90:19:CF:FB:D9:99:1C:B7:68:25:74:8D:94:5F:30:93:95:42 | 
| mozillacert18.pem |  2014 年 3 月 13 日 | 79:98:A3:08:E1:4D:65:85:E6:C2:1E:15:3A:71:9F:BA:5A:D3:4A:D9 | 
| mozillacert51.pem |  2014 年 3 月 13 日 | FA:B7:EE:36:97:26:62:FB:2D:B0:2A:F6:BF:03:FD:E8:7C:4B:2F:9B | 
| mozillacert69.pem |  2014 年 3 月 13 日 | 2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19 | 
| mozillacert115.pem |  2014 年 3 月 13 日 | 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 | 
| mozillacert40.pem |  2014 年 3 月 13 日 | 80:25:EF:F4:6E:70:C8:D4:72:24:65:84:FE:40:3B:8A:8D:6A:DB:F5 | 
| mozillacert58.pem |  2014 年 3 月 13 日 | 8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0 | 
| mozillacert104.pem |  2014 年 3 月 13 日 | 4F:99:AA:93:FB:2B:D1:37:26:A1:99:4A:CE:7F:F0:05:F2:93:5D:1E | 
| mozillacert91.pem |  2014 年 3 月 13 日 | 3B:C0:38:0B:33:C3:F6:A6:0C:86:15:22:93:D9:DF:F5:4B:81:C0:04 | 
| mozillacert47.pem |  2014 年 3 月 13 日 | 1B:4B:39:61:26:27:6B:64:91:A2:68:6D:D7:02:43:21:2D:1F:1D:96 | 
| mozillacert80.pem |  2014 年 3 月 13 日 | B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB | 
| mozillacert98.pem |  2014 年 3 月 13 日 | C9:A8:B9:E7:55:80:5E:58:E3:53:77:A7:25:EB:AF:C3:7B:27:CC:D7 | 
| mozillacert144.pem |  2014 年 3 月 13 日 | 37:F7:6D:E6:07:7C:90:C5:B1:3E:93:1A:B7:41:10:B4:F2:E4:9A:27 | 
| mozillacert36.pem |  2014 年 3 月 13 日 | 23:88:C9:D3:71:CC:9E:96:3D:FF:7D:3C:A7:CE:FC:D6:25:EC:19:0D | 
| mozillacert3.pem |  2014 年 3 月 13 日 | 87:9F:4B:EE:05:DF:98:58:3B:E3:60:D6:33:E7:0D:3F:FE:98:71:AF | 
| mozillacert87.pem |  2014 年 3 月 13 日 | 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74 | 
| mozillacert133.pem |  2014 年 3 月 13 日 | 85:B5:FF:67:9B:0C:79:96:1F:C8:6E:44:22:00:46:13:DB:17:92:84 | 
| mozillacert25.pem |  2014 年 3 月 13 日 | 4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5 | 
| mozillacert76.pem |  2014 年 3 月 13 日 | F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7 | 
| mozillacert122.pem |  2014 年 3 月 13 日 | 02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68 | 
| mozillacert14.pem |  2014 年 3 月 13 日 | 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25 | 
| mozillacert65.pem |  2014 年 3 月 13 日 | 69:BD:8C:F4:9C:D3:00:FB:59:2E:17:93:CA:55:6A:F3:EC:AA:35:FB | 
| mozillacert111.pem |  2014 年 3 月 13 日 | 9C:BB:48:53:F6:A4:F6:D3:52:A4:E8:32:52:55:60:13:F5:AD:AF:65 | 
| mozillacert129.pem |  2014 年 3 月 13 日 | E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79 | 
| mozillacert54.pem |  2014 年 3 月 13 日 | 03:9E:ED:B8:0B:E7:A0:3C:69:53:89:3B:20:D2:D9:32:3A:4C:2A:FD | 
| mozillacert100.pem |  2014 年 3 月 13 日 | 58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0 | 
| mozillacert118.pem |  2014 年 3 月 13 日 | 7E:78:4A:10:1C:82:65:CC:2D:E1:F1:6D:47:B4:40:CA:D9:0A:19:45 | 
| mozillacert151.pem |  2014 年 3 月 13 日 | AC:ED:5F:65:53:FD:25:CE:01:5F:1F:7A:48:3B:6A:74:9F:61:78:C6 | 
| mozillacert43.pem |  2014 年 3 月 13 日 | F9:CD:0E:2C:DA:76:24:C1:8F:BD:F0:F0:AB:B6:45:B8:F7:FE:D5:7A | 
| mozillacert107.pem |  2014 年 3 月 13 日 | 8E:1C:74:F8:A6:20:B9:E5:8A:F4:61:FA:EC:2B:47:56:51:1A:52:C6 | 
| mozillacert94.pem |  2014 年 3 月 13 日 | 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99 | 
| mozillacert140.pem |  2014 年 3 月 13 日 | CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7 | 
| mozillacert32.pem |  2014 年 3 月 13 日 | 60:D6:89:74:B5:C2:65:9E:8A:0F:C1:88:7C:88:D2:46:69:1B:18:2C | 
| mozillacert83.pem |  2014 年 3 月 13 日 | A0:73:E5:C5:BD:43:61:0D:86:4C:21:13:0A:85:58:57:CC:9C:EA:46 | 
| mozillacert147.pem |  2014 年 3 月 13 日 | 58:11:9F:0E:12:82:87:EA:50:FD:D9:87:45:6F:4F:78:DC:FA:D6:D4 | 
| mozillacert21.pem |  2014 年 3 月 13 日 | 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB | 
| mozillacert39.pem |  2014 年 3 月 13 日 | AE:50:83:ED:7C:F4:5C:BC:8F:61:C6:21:FE:68:5D:79:42:21:15:6E | 
| mozillacert6.pem |  2014 年 3 月 13 日 | 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4 | 
| mozillacert72.pem |  2014 年 3 月 13 日 | 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B | 
| mozillacert136.pem |  2014 年 3 月 13 日 | D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49 | 
| mozillacert10.pem |  2014 年 3 月 13 日 | 5F:3A:FC:0A:8B:64:F6:86:67:34:74:DF:7E:A9:A2:FE:F9:FA:7A:51 | 
| mozillacert28.pem |  2014 年 3 月 13 日 | 66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B | 
| mozillacert61.pem |  2014 年 3 月 13 日 | E0:B4:32:2E:B2:F6:A5:68:B6:54:53:84:48:18:4A:50:36:87:43:84 | 
| mozillacert79.pem |  2014 年 3 月 13 日 | D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27 | 
| mozillacert125.pem |  2014 年 3 月 13 日 | B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9 | 
| mozillacert17.pem |  2014 年 3 月 13 日 | 40:54:DA:6F:1C:3F:40:74:AC:ED:0F:EC:CD:DB:79:D1:53:FB:90:1D | 
| mozillacert50.pem |  2014 年 3 月 13 日 | 8C:96:BA:EB:DD:2B:07:07:48:EE:30:32:66:A0:F3:98:6E:7C:AE:58 | 
| mozillacert68.pem |  2014 年 3 月 13 日 | AE:C5:FB:3F:C8:E1:BF:C4:E5:4F:03:07:5A:9A:E8:00:B7:F7:B6:FA | 
| mozillacert114.pem |  2014 年 3 月 13 日 | 51:C6:E7:08:49:06:6E:F3:92:D4:5C:A0:0D:6D:A3:62:8F:C3:52:39 | 
| mozillacert57.pem |  2014 年 3 月 13 日 | D6:DA:A8:20:8D:09:D2:15:4D:24:B5:2F:CB:34:6E:B2:58:B2:8A:58 | 
| mozillacert103.pem |  2014 年 3 月 13 日 | 70:C1:8D:74:B4:28:81:0A:E4:FD:A5:75:D7:01:9F:99:B0:3D:50:74 | 
| mozillacert90.pem |  2014 年 3 月 13 日 | F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC | 
| mozillacert46.pem |  2014 年 3 月 13 日 | 40:9D:4B:D9:17:B5:5C:27:B6:9B:64:CB:98:22:44:0D:CD:09:B8:89 | 
| mozillacert97.pem |  2014 年 3 月 13 日 | 85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F | 
| mozillacert143.pem |  2014 年 3 月 13 日 | 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7 | 
| mozillacert35.pem |  2014 年 3 月 13 日 | 2A:C8:D5:8B:57:CE:BF:2F:49:AF:F2:FC:76:8F:51:14:62:90:7A:41 | 
| mozillacert2.pem |  2014 年 3 月 13 日 | 22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A | 
| mozillacert86.pem |  2014 年 3 月 13 日 | 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2 | 
| mozillacert132.pem |  2014 年 3 月 13 日 | 39:21:C1:15:C1:5D:0E:CA:5C:CB:5B:C4:F0:7D:21:D8:05:0B:56:6A | 
| mozillacert24.pem |  2014 年 3 月 13 日 | 59:AF:82:79:91:86:C7:B4:75:07:CB:CF:03:57:46:EB:04:DD:B7:16 | 
| mozillacert9.pem |  2014 年 3 月 13 日 | F4:8B:11:BF:DE:AB:BE:94:54:20:71:E6:41:DE:6B:BE:88:2B:40:B9 | 
| mozillacert75.pem |  2014 年 3 月 13 日 | D2:32:09:AD:23:D3:14:23:21:74:E4:0D:7F:9D:62:13:97:86:63:3A | 
| mozillacert121.pem |  2014 年 3 月 13 日 | CC:AB:0E:A0:4C:23:01:D6:69:7B:DD:37:9F:CD:12:EB:24:E3:94:9D | 
| mozillacert139.pem |  2014 年 3 月 13 日 | DE:3F:40:BD:50:93:D3:9B:6C:60:F6:DA:BC:07:62:01:00:89:76:C9 | 
| mozillacert13.pem |  2014 年 3 月 13 日 | 06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91 | 
| mozillacert64.pem |  2014 年 3 月 13 日 | 62:7F:8D:78:27:65:63:99:D2:7D:7F:90:44:C9:FE:B3:F3:3E:FA:9A | 
| mozillacert110.pem |  2014 年 3 月 13 日 | 93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17 | 
| mozillacert128.pem |  2014 年 3 月 13 日 | A9:E9:78:08:14:37:58:88:F2:05:19:B0:6D:2B:0D:2B:60:16:90:7D | 
| mozillacert53.pem |  2014 年 3 月 13 日 | 7F:8A:B0:CF:D0:51:87:6A:66:F3:36:0F:47:C8:8D:8C:D3:35:FC:74 | 
| mozillacert117.pem |  2014 年 3 月 13 日 | D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74 | 
| mozillacert150.pem |  2014 年 3 月 13 日 | 33:9B:6B:14:50:24:9B:55:7A:01:87:72:84:D9:E0:2F:C3:D2:D8:E9 | 
| mozillacert42.pem |  2014 年 3 月 13 日 | 85:A4:08:C0:9C:19:3E:5D:51:58:7D:CD:D6:13:30:FD:8C:DE:37:BF | 
| mozillacert106.pem |  2014 年 3 月 13 日 | E7:A1:90:29:D3:D5:52:DC:0D:0F:C6:92:D3:EA:88:0D:15:2E:1A:6B | 
| mozillacert93.pem |  2014 年 3 月 13 日 | 31:F1:FD:68:22:63:20:EE:C6:3B:3F:9D:EA:4A:3E:53:7C:7C:39:17 | 
| mozillacert31.pem |  2014 年 3 月 13 日 | 9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11 | 
| mozillacert49.pem |  2014 年 3 月 13 日 | 61:57:3A:11:DF:0E:D8:7E:D5:92:65:22:EA:D0:56:D7:44:B3:23:71 | 
| mozillacert82.pem |  2014 年 3 月 13 日 | 2E:14:DA:EC:28:F0:FA:1E:8E:38:9A:4E:AB:EB:26:C0:0A:D3:83:C3 | 
| mozillacert146.pem |  2014 年 3 月 13 日 | 21:FC:BD:8E:7F:6C:AF:05:1B:D1:B3:43:EC:A8:E7:61:47:F2:0F:8A | 
| mozillacert20.pem |  2014 年 3 月 13 日 | D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61 | 
| mozillacert38.pem |  2014 年 3 月 13 日 | CB:A1:C5:F8:B0:E3:5E:B8:B9:45:12:D3:F9:34:A2:E9:06:10:D3:36 | 
| mozillacert5.pem |  2014 年 3 月 13 日 | B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6 | 
| mozillacert71.pem |  2014 年 3 月 13 日 | 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C | 
| mozillacert89.pem |  2014 年 3 月 13 日 | C8:EC:8C:87:92:69:CB:4B:AB:39:E9:8D:7E:57:67:F3:14:95:73:9D | 
| mozillacert135.pem |  2014 年 3 月 13 日 | 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18 | 
| mozillacert27.pem |  2014 年 3 月 13 日 | 3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B | 
| mozillacert60.pem |  2014 年 3 月 13 日 | 3B:C4:9F:48:F8:F3:73:A0:9C:1E:BD:F8:5B:B1:C3:65:C7:D8:11:B3 | 
| mozillacert78.pem |  2014 年 3 月 13 日 | 29:36:21:02:8B:20:ED:02:F5:66:C5:32:D1:D6:ED:90:9F:45:00:2F | 
| mozillacert124.pem |  2014 年 3 月 13 日 | 4D:23:78:EC:91:95:39:B5:00:7F:75:8F:03:3B:21:1E:C5:4D:8B:CF | 
| mozillacert16.pem |  2014 年 3 月 13 日 | DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13 | 
| mozillacert67.pem |  2014 年 3 月 13 日 | D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD | 
| mozillacert113.pem |  2014 年 3 月 13 日 | 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31 | 
| mozillacert56.pem |  2014 年 3 月 13 日 | F1:8B:53:8D:1B:E9:03:B6:A6:F0:56:43:5B:17:15:89:CA:F3:6B:F2 | 
| mozillacert102.pem |  2014 年 3 月 13 日 | 96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83 | 
| mozillacert45.pem |  2014 年 3 月 13 日 | 67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0 | 
| mozillacert109.pem |  2014 年 3 月 13 日 | B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71 | 
| mozillacert96.pem |  2014 年 3 月 13 日 | 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1 | 
| mozillacert142.pem |  2014 年 3 月 13 日 | 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85 | 
| mozillacert34.pem |  2014 年 3 月 13 日 | 59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9 | 
| mozillacert1.pem |  2014 年 3 月 13 日 | 23:E5:94:94:51:95:F2:41:48:03:B4:D5:64:D2:A3:A3:F5:D8:8B:8C | 
| mozillacert85.pem |  2014 年 3 月 13 日 | CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48 | 
| mozillacert131.pem |  2014 年 3 月 13 日 | 37:9A:19:7B:41:85:45:35:0C:A6:03:69:F3:3C:2E:AF:47:4F:20:79 | 
| mozillacert149.pem |  2014 年 3 月 13 日 | 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1 | 
| mozillacert23.pem |  2014 年 3 月 13 日 | 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81 | 
| mozillacert8.pem |  2014 年 3 月 13 日 | 3E:2B:F7:F2:03:1B:96:F3:8C:E6:C4:D8:A8:5D:3E:2D:58:47:6A:0F | 
| mozillacert74.pem |  2014 年 3 月 13 日 | 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F | 
| mozillacert120.pem |  2014 年 3 月 13 日 | DA:40:18:8B:91:89:A3:ED:EE:AE:DA:97:FE:2F:9D:F5:B7:D1:8A:41 | 
| mozillacert138.pem |  2014 年 3 月 13 日 | E1:9F:E3:0E:8B:84:60:9E:80:9B:17:0D:72:A8:C5:BA:6E:14:09:BD | 
| mozillacert12.pem |  2014 年 3 月 13 日 | A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36 | 
| mozillacert63.pem |  2014 年 3 月 13 日 | 89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E | 
| mozillacert127.pem |  2014 年 3 月 13 日 | DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12 | 
| mozillacert19.pem |  2014 年 3 月 13 日 | B4:35:D4:E1:11:9D:1C:66:90:A7:49:EB:B3:94:BD:63:7B:A7:82:B7 | 
| mozillacert52.pem |  2014 年 3 月 13 日 | 8B:AF:4C:9B:1D:F0:2A:92:F7:DA:12:8E:B9:1B:AC:F4:98:60:4B:6F | 
| mozillacert116.pem |  2014 年 3 月 13 日 | 2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21 | 
| mozillacert41.pem |  2014 年 3 月 13 日 | 6B:2F:34:AD:89:58:BE:62:FD:B0:6B:5C:CE:BB:9D:D9:4F:4E:39:F3 | 
| mozillacert59.pem |  2014 年 3 月 13 日 | 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54 | 
| mozillacert105.pem |  2014 年 3 月 13 日 | 77:47:4F:C6:30:E4:0F:4C:47:64:3F:84:BA:B8:C6:95:4A:8A:41:EC | 
| mozillacert92.pem |  2014 年 3 月 13 日 | A3:F1:33:3F:E2:42:BF:CF:C5:D1:4E:8F:39:42:98:40:68:10:D1:A0 | 
| mozillacert30.pem |  2014 年 3 月 13 日 | E7:B4:F6:9D:61:EC:90:69:DB:7E:90:A7:40:1A:3C:F4:7D:4F:E8:EE | 
| mozillacert48.pem |  2014 年 3 月 13 日 | A0:A1:AB:90:C9:FC:84:7B:3B:12:61:E8:97:7D:5F:D3:22:61:D3:CC | 
| verisignc4g2.pem |  2014 年 3 月 20 日 | 0B:77:BE:BB:CB:7A:A2:47:05:DE:CC:0F:BD:6A:02:FC:7A:BD:9B:52 | 
| verisignc2g3.pem |  2014 年 3 月 20 日 | 61:EF:43:D7:7F:CA:D4:61:51:BC:98:E0:C3:59:12:AF:9F:EB:63:11 | 
| verisignc1g6.pem |  2014 年 12 月 31 日 | 51:7F:61:1E:29:91:6B:53:82:FB:72:E7:44:D9:8D:C3:CC:53:6D:64 | 
| verisignc2g2.pem |  2014 年 3 月 20 日 | B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D | 
| verisignroot.pem |  2014 年 3 月 20 日 | 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54 | 
| verisignc2g1.pem |  2014 年 3 月 20 日 | 67:82:AA:E0:ED:EE:E2:1A:58:39:D3:C0:CD:14:68:0A:4F:60:14:2A | 
| verisignc3g5.pem |  2014 年 3 月 20 日 | 4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5 | 
| verisignc1g3.pem |  2014 年 3 月 20 日 | 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5 | 
| verisignc3g4.pem |  2014 年 3 月 20 日 | 22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A | 
| verisignc1g2.pem |  2014 年 3 月 20 日 | 27:3E:E1:24:57:FD:C4:F9:0C:55:E8:2B:56:16:7F:62:F5:32:E5:47 | 
| verisignc3g3.pem |  2014 年 3 月 20 日 | 13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6 | 
| verisignc1g1.pem |  2014 年 3 月 20 日 | 90:AE:A2:69:85:FF:14:80:4C:43:49:52:EC:E9:60:84:77:AF:55:6F | 
| verisignc3g2.pem |  2014 年 3 月 20 日 | 85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F | 
| verisignc3g1.pem |  2014 年 3 月 20 日 | A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B | 
| verisignc2g6.pem |  2014 年 12 月 31 日 | 40:B3:31:A0:E9:BF:E8:55:BC:39:93:CA:70:4F:4E:C2:51:D4:1D:8F | 
| verisignc4g3.pem |  2014 年 3 月 20 日 | C8:EC:8C:87:92:69:CB:4B:AB:39:E9:8D:7E:57:67:F3:14:95:73:9D | 
| gdroot-g2.pem |  2014 年 12 月 31 日 | 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B | 
| gd-class2-root.pem |  2014 年 12 月 31 日 | 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4 | 
| gd\$1bundle-g2.pem |  2014 年 12 月 31 日 | 27:AC:93:69:FA:F2:52:07:BB:26:27:CE:FA:CC:BE:4E:F9:C3:19:B8 | 
| dstacescax6 |  2018 年 6 月 18 日 | 40:54:DA:6F:1C:3F:40:74:AC:ED:0F:EC:CD:DB:79:D1:53:FB:90:1D | 
| gd\$1bundle-g2.pem |  2018 年 6 月 18 日 | 27:AC:93:69:FA:F2:52:07:BB:26:27:CE:FA:CC:BE:4E:F9:C3:19:B8 | 
| verisignc4g3.pem |  2018 年 6 月 18 日 | C8:EC:8C:87:92:69:CB:4B:AB:39:E9:8D:7E:57:67:F3:14:95:73:9D | 
| swisssignplatinumg2ca |  2018 年 4 月 21 日 | 56:E0:FA:C0:3B:8F:18:23:55:18:E5:D3:11:CA:E8:C2:43:31:AB:66 | 
| geotrustprimarycertificationauthorityg3 |  2018 年 6 月 18 日 | 03:9E:ED:B8:0B:E7:A0:3C:69:53:89:3B:20:D2:D9:32:3A:4C:2A:FD | 
| geotrustprimarycertificationauthorityg2 |  2018 年 6 月 18 日 | 8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0 | 
| buypassclass2rootca |  2018 年 6 月 18 日 | 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99 | 
| camerfirmachambersofcommerceroot |  2018 年 6 月 18 日 | 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1 | 
| mozillacert20.pem |  2018 年 6 月 18 日 | D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61 | 
| mozillacert12.pem |  2018 年 6 月 18 日 | A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36 | 
| mozillacert90.pem |  2018 年 6 月 18 日 | F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC | 
| mozillacert82.pem |  2018 年 6 月 18 日 | 2E:14:DA:EC:28:F0:FA:1E:8E:38:9A:4E:AB:EB:26:C0:0A:D3:83:C3 | 
| mozillacert140.pem |  2018 年 6 月 18 日 | CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7 | 
| mozillacert74.pem |  2018 年 6 月 18 日 | 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F | 
| mozillacert132.pem |  2018 年 6 月 18 日 | 39:21:C1:15:C1:5D:0E:CA:5C:CB:5B:C4:F0:7D:21:D8:05:0B:56:6A | 
| mozillacert66.pem |  2018 年 6 月 18 日 | DD:E1:D2:A9:01:80:2E:1D:87:5E:84:B3:80:7E:4B:B1:FD:99:41:34 | 
| mozillacert124.pem |  2018 年 6 月 18 日 | 4D:23:78:EC:91:95:39:B5:00:7F:75:8F:03:3B:21:1E:C5:4D:8B:CF | 
| mozillacert58.pem |  2018 年 6 月 18 日 | 8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0 | 
| securitycommunicationrootca2 |  2018 年 6 月 18 日 | 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74 | 
| mozillacert116.pem |  2018 年 6 月 18 日 | 2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21 | 
| mozillacert108.pem |  2018 年 6 月 18 日 | B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C | 
| certigna |  2018 年 6 月 18 日 | B1:2E:13:63:45:86:A4:6F:1A:B2:60:68:37:58:2D:C4:AC:FD:94:97 | 
| mozillacert3.pem |  2018 年 6 月 18 日 | 87:9F:4B:EE:05:DF:98:58:3B:E3:60:D6:33:E7:0D:3F:FE:98:71:AF | 
| verisignc1g1.pem |  2018 年 6 月 18 日 | 90:AE:A2:69:85:FF:14:80:4C:43:49:52:EC:E9:60:84:77:AF:55:6F | 
| verisignc4g2.pem |  2018 年 6 月 18 日 | 0B:77:BE:BB:CB:7A:A2:47:05:DE:CC:0F:BD:6A:02:FC:7A:BD:9B:52 | 
| deutschetelekomrootca2 |  2018 年 6 月 18 日 | 85:A4:08:C0:9C:19:3E:5D:51:58:7D:CD:D6:13:30:FD:8C:DE:37:BF | 
| starfieldrootg2ca |  2018 年 4 月 21 日 | B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E | 
| comodoecccertificationauthority |  2018 年 6 月 18 日 | 9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11 | 
| digicertglobalrootg3 |  2018 年 6 月 18 日 | 7E:04:DE:89:6A:3E:66:6D:00:E6:87:D3:3F:FA:D9:3B:E8:3D:34:9E | 
| digicertglobalrootg2 |  2018 年 6 月 18 日 | DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4 | 
| mozillacert11.pem |  2018 年 6 月 18 日 | 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43 | 
| mozillacert81.pem |  2018 年 6 月 18 日 | 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E | 
| mozillacert73.pem |  2018 年 6 月 18 日 | B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E | 
| szafirrootca2 |  2018 年 6 月 18 日 | E2:52:FA:95:3F:ED:DB:24:60:BD:6E:28:F3:9C:CC:CF:5E:B3:3F:DE | 
| mozillacert131.pem |  2018 年 6 月 18 日 | 37:9A:19:7B:41:85:45:35:0C:A6:03:69:F3:3C:2E:AF:47:4F:20:79 | 
| ecacc |  2018 年 6 月 18 日 | 28:90:3A:63:5B:52:80:FA:E6:77:4C:0B:6D:A7:D6:BA:A6:4A:F2:E8 | 
| mozillacert65.pem |  2018 年 6 月 18 日 | 69:BD:8C:F4:9C:D3:00:FB:59:2E:17:93:CA:55:6A:F3:EC:AA:35:FB | 
| turktrustelektroniksertifikahizmetsaglayicisih5 |  2018 年 6 月 18 日 | C4:18:F6:4D:46:D1:DF:00:3D:27:30:13:72:43:A9:12:11:C6:75:FB | 
| mozillacert123.pem |  2018 年 6 月 18 日 | 2A:B6:28:48:5E:78:FB:F3:AD:9E:79:10:DD:6B:DF:99:72:2C:96:E5 | 
| mozillacert57.pem |  2018 年 6 月 18 日 | D6:DA:A8:20:8D:09:D2:15:4D:24:B5:2F:CB:34:6E:B2:58:B2:8A:58 | 
| mozillacert115.pem |  2018 年 6 月 18 日 | 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 | 
| mozillacert49.pem |  2018 年 6 月 18 日 | 61:57:3A:11:DF:0E:D8:7E:D5:92:65:22:EA:D0:56:D7:44:B3:23:71 | 
| mozillacert107.pem |  2018 年 6 月 18 日 | 8E:1C:74:F8:A6:20:B9:E5:8A:F4:61:FA:EC:2B:47:56:51:1A:52:C6 | 
| verisignclass3g4ca |  2018 年 4 月 21 日 | 22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A | 
| securetrustca |  2018 年 6 月 18 日 | 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11 | 
| mozillacert2.pem |  2018 年 6 月 18 日 | 22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A | 
| buypassclass2ca |  2018 年 4 月 21 日 | 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99 | 
| secomscrootca2 |  2018 年 4 月 21 日 | 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74 | 
| secomscrootca1 |  2018 年 4 月 21 日 | 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7 | 
| trustisfpsrootca |  2018 年 6 月 18 日 | 3B:C0:38:0B:33:C3:F6:A6:0C:86:15:22:93:D9:DF:F5:4B:81:C0:04 | 
| hongkongpostrootca1 |  2018 年 6 月 18 日 | D6:DA:A8:20:8D:09:D2:15:4D:24:B5:2F:CB:34:6E:B2:58:B2:8A:58 | 
| certsignrootca |  2018 年 6 月 18 日 | FA:B7:EE:36:97:26:62:FB:2D:B0:2A:F6:BF:03:FD:E8:7C:4B:2F:9B | 
| geotrustprimaryca |  2018 年 4 月 21 日 | 32:3C:11:8E:1B:F7:B8:B6:52:54:E2:E2:10:0D:D6:02:90:37:F0:96 | 
| twcaglobalrootca |  2018 年 6 月 18 日 | 9C:BB:48:53:F6:A4:F6:D3:52:A4:E8:32:52:55:60:13:F5:AD:AF:65 | 
| camerfirmachambersca |  2018 年 4 月 21 日 | 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C | 
| mozillacert10.pem |  2018 年 6 月 18 日 | 5F:3A:FC:0A:8B:64:F6:86:67:34:74:DF:7E:A9:A2:FE:F9:FA:7A:51 | 
| mozillacert80.pem |  2018 年 6 月 18 日 | B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB | 
| mozillacert72.pem |  2018 年 6 月 18 日 | 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B | 
| comodoaaaca |  2018 年 4 月 21 日 | D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49 | 
| mozillacert130.pem |  2018 年 6 月 18 日 | E5:DF:74:3C:B6:01:C4:9B:98:43:DC:AB:8C:E8:6A:81:10:9F:E4:8E | 
| mozillacert64.pem |  2018 年 6 月 18 日 | 62:7F:8D:78:27:65:63:99:D2:7D:7F:90:44:C9:FE:B3:F3:3E:FA:9A | 
| mozillacert122.pem |  2018 年 6 月 18 日 | 02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68 | 
| mozillacert56.pem |  2018 年 6 月 18 日 | F1:8B:53:8D:1B:E9:03:B6:A6:F0:56:43:5B:17:15:89:CA:F3:6B:F2 | 
| equifaxsecureebusinessca1 |  2018 年 4 月 21 日 | AE:E6:3D:70:E3:76:FB:C7:3A:EB:B0:A1:C1:D4:C4:7A:A7:40:B3:F4 | 
| camerfirmachambersignca |  2018 年 4 月 21 日 | 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C | 
| mozillacert114.pem |  2018 年 6 月 18 日 | 51:C6:E7:08:49:06:6E:F3:92:D4:5C:A0:0D:6D:A3:62:8F:C3:52:39 | 
| mozillacert48.pem |  2018 年 6 月 18 日 | A0:A1:AB:90:C9:FC:84:7B:3B:12:61:E8:97:7D:5F:D3:22:61:D3:CC | 
| pscprocert |  2018 年 6 月 18 日 | 70:C1:8D:74:B4:28:81:0A:E4:FD:A5:75:D7:01:9F:99:B0:3D:50:74 | 
| mozillacert106.pem |  2018 年 6 月 18 日 | E7:A1:90:29:D3:D5:52:DC:0D:0F:C6:92:D3:EA:88:0D:15:2E:1A:6B | 
| mozillacert1.pem |  2018 年 6 月 18 日 | 23:E5:94:94:51:95:F2:41:48:03:B4:D5:64:D2:A3:A3:F5:D8:8B:8C | 
| eecertificationcentrerootca |  2018 年 6 月 18 日 | C9:A8:B9:E7:55:80:5E:58:E3:53:77:A7:25:EB:AF:C3:7B:27:CC:D7 | 
| digicertglobalrootca |  2018 年 6 月 18 日 | A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36 | 
| thawteprimaryrootcag3 |  2018 年 6 月 18 日 | F1:8B:53:8D:1B:E9:03:B6:A6:F0:56:43:5B:17:15:89:CA:F3:6B:F2 | 
| thawteprimaryrootcag2 |  2018 年 6 月 18 日 | AA:DB:BC:22:23:8F:C4:01:A1:27:BB:38:DD:F4:1D:DB:08:9E:F0:12 | 
| entrustrootcertificationauthorityec1 |  2018 年 6 月 18 日 | 20:D8:06:40:DF:9B:25:F5:12:25:3A:11:EA:F7:59:8A:EB:14:B5:47 | 
| valicertclass2ca |  2018 年 4 月 21 日 | 31:7A:2A:D0:7F:2B:33:5E:F5:A1:C3:4E:4B:57:E8:B7:D8:F1:FC:A6 | 
| globalchambersignroot2008 |  2018 年 6 月 18 日 | 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C | 
| amazonrootca4 |  2018 年 6 月 18 日 | F6:10:84:07:D6:F8:BB:67:98:0C:C2:E2:44:C2:EB:AE:1C:EF:63:BE | 
| gd-class2-root.pem |  2018 年 6 月 18 日 | 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4 | 
| amazonrootca3 |  2018 年 6 月 18 日 | 0D:44:DD:8C:3C:8C:1A:1A:58:75:64:81:E9:0F:2E:2A:FF:B3:D2:6E | 
| amazonrootca2 |  2018 年 6 月 18 日 | 5A:8C:EF:45:D7:A6:98:59:76:7A:8C:8B:44:96:B5:78:CF:47:4B:1A | 
| securitycommunicationrootca |  2018 年 6 月 18 日 | 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7 | 
| amazonrootca1 |  2018 年 6 月 18 日 | 8D:A7:F9:65:EC:5E:FC:37:91:0F:1C:6E:59:FD:C1:CC:6A:6E:DE:16 | 
| acraizfnmtrcm |  2018 年 6 月 18 日 | EC:50:35:07:B2:15:C4:95:62:19:E2:A8:9A:5B:42:99:2C:4C:2C:20 | 
| quovadisrootca3g3 |  2018 年 6 月 18 日 | 48:12:BD:92:3C:A8:C4:39:06:E7:30:6D:27:96:E6:A4:CF:22:2E:7D | 
| certplusrootcag2 |  2018 年 6 月 18 日 | 4F:65:8E:1F:E9:06:D8:28:02:E9:54:47:41:C9:54:25:5D:69:CC:1A | 
| certplusrootcag1 |  2018 年 6 月 18 日 | 22:FD:D0:B7:FD:A2:4E:0D:AC:49:2C:A0:AC:A6:7B:6A:1F:E3:F7:66 | 
| mozillacert71.pem |  2018 年 6 月 18 日 | 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C | 
| mozillacert63.pem |  2018 年 6 月 18 日 | 89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E | 
| mozillacert121.pem |  2018 年 6 月 18 日 | CC:AB:0E:A0:4C:23:01:D6:69:7B:DD:37:9F:CD:12:EB:24:E3:94:9D | 
| ttelesecglobalrootclass3ca |  2018 年 4 月 21 日 | 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1 | 
| mozillacert55.pem |  2018 年 6 月 18 日 | AA:DB:BC:22:23:8F:C4:01:A1:27:BB:38:DD:F4:1D:DB:08:9E:F0:12 | 
| mozillacert113.pem |  2018 年 6 月 18 日 | 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31 | 
| baltimorecybertrustca |  2018 年 4 月 21 日 | D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74 | 
| mozillacert47.pem |  2018 年 6 月 18 日 | 1B:4B:39:61:26:27:6B:64:91:A2:68:6D:D7:02:43:21:2D:1F:1D:96 | 
| mozillacert105.pem |  2018 年 6 月 18 日 | 77:47:4F:C6:30:E4:0F:4C:47:64:3F:84:BA:B8:C6:95:4A:8A:41:EC | 
| mozillacert39.pem |  2018 年 6 月 18 日 | AE:50:83:ED:7C:F4:5C:BC:8F:61:C6:21:FE:68:5D:79:42:21:15:6E | 
| usertrustecccertificationauthority |  2018 年 6 月 18 日 | D1:CB:CA:5D:B2:D5:2A:7F:69:3B:67:4D:E5:F0:5A:1D:0C:95:7D:F0 | 
| mozillacert0.pem |  2018 年 6 月 18 日 | 97:81:79:50:D8:1C:96:70:CC:34:D8:09:CF:79:44:31:36:7E:F4:74 | 
| securitycommunicationevrootca1 |  2018 年 6 月 18 日 | FE:B8:C4:32:DC:F9:76:9A:CE:AE:3D:D8:90:8F:FD:28:86:65:64:7D | 
| verisignc3g5.pem |  2018 年 6 月 18 日 | 4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5 | 
| globalsignr3ca |  2018 年 4 月 21 日 | D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD | 
| trustcoreca1 |  2018 年 6 月 18 日 | 58:D1:DF:95:95:67:6B:63:C0:F0:5B:1C:17:4D:8B:84:0B:C8:78:BD | 
| equifaxsecureglobalebusinessca1 |  2018 年 4 月 21 日 | 3A:74:CB:7A:47:DB:70:DE:89:1F:24:35:98:64:B8:2D:82:BD:1A:36 | 
| geotrustuniversalca |  2018 年 6 月 18 日 | E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79 | 
| affirmtrustpremiumca |  2018 年 4 月 21 日 | D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27 | 
| staatdernederlandenrootcag3 |  2018 年 6 月 18 日 | D8:EB:6B:41:51:92:59:E0:F3:E7:85:00:C0:3D:B6:88:97:C9:EE:FC | 
| staatdernederlandenrootcag2 |  2018 年 6 月 18 日 | 59:AF:82:79:91:86:C7:B4:75:07:CB:CF:03:57:46:EB:04:DD:B7:16 | 
| mozillacert70.pem |  2018 年 6 月 18 日 | 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C | 
| secomevrootca1 |  2018 年 4 月 21 日 | FE:B8:C4:32:DC:F9:76:9A:CE:AE:3D:D8:90:8F:FD:28:86:65:64:7D | 
| geotrustglobalca |  2018 年 6 月 18 日 | DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12 | 
| mozillacert62.pem |  2018 年 6 月 18 日 | A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B | 
| mozillacert120.pem |  2018 年 6 月 18 日 | DA:40:18:8B:91:89:A3:ED:EE:AE:DA:97:FE:2F:9D:F5:B7:D1:8A:41 | 
| mozillacert54.pem |  2018 年 6 月 18 日 | 03:9E:ED:B8:0B:E7:A0:3C:69:53:89:3B:20:D2:D9:32:3A:4C:2A:FD | 
| mozillacert112.pem |  2018 年 6 月 18 日 | 43:13:BB:96:F1:D5:86:9B:C1:4E:6A:92:F6:CF:F6:34:69:87:82:37 | 
| mozillacert46.pem |  2018 年 6 月 18 日 | 40:9D:4B:D9:17:B5:5C:27:B6:9B:64:CB:98:22:44:0D:CD:09:B8:89 | 
| swisssigngoldcag2 |  2018 年 6 月 18 日 | D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61 | 
| mozillacert104.pem |  2018 年 6 月 18 日 | 4F:99:AA:93:FB:2B:D1:37:26:A1:99:4A:CE:7F:F0:05:F2:93:5D:1E | 
| mozillacert38.pem |  2018 年 6 月 18 日 | CB:A1:C5:F8:B0:E3:5E:B8:B9:45:12:D3:F9:34:A2:E9:06:10:D3:36 | 
| certplusclass3pprimaryca |  2018 年 4 月 21 日 | 21:6B:2A:29:E6:2A:00:CE:82:01:46:D8:24:41:41:B9:25:11:B2:79 | 
| entrustrootcertificationauthorityg2 |  2018 年 6 月 18 日 | 8C:F4:27:FD:79:0C:3A:D1:66:06:8D:E8:1E:57:EF:BB:93:22:72:D4 | 
| godaddyrootg2ca |  2018 年 4 月 21 日 | 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B | 
| cfcaevroot |  2018 年 6 月 18 日 | E2:B8:29:4B:55:84:AB:6B:58:C2:90:46:6C:AC:3F:B8:39:8F:84:83 | 
| verisignc3g4.pem |  2018 年 6 月 18 日 | 22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A | 
| geotrustuniversalca2 |  2018 年 6 月 18 日 | 37:9A:19:7B:41:85:45:35:0C:A6:03:69:F3:3C:2E:AF:47:4F:20:79 | 
| starfieldservicesrootg2ca |  2018 年 4 月 21 日 | 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F | 
| digicerthighassuranceevrootca |  2018 年 6 月 18 日 | 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25 | 
| entrustnetpremium2048secureserverca |  2018 年 6 月 18 日 | 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31 | 
| camerfirmaglobalchambersignroot |  2018 年 6 月 18 日 | 33:9B:6B:14:50:24:9B:55:7A:01:87:72:84:D9:E0:2F:C3:D2:D8:E9 | 
| verisignclass3g3ca |  2018 年 4 月 21 日 | 13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6 | 
| godaddyclass2ca |  2018 年 6 月 18 日 | 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4 | 
| mozillacert61.pem |  2018 年 6 月 18 日 | E0:B4:32:2E:B2:F6:A5:68:B6:54:53:84:48:18:4A:50:36:87:43:84 | 
| mozillacert53.pem |  2018 年 6 月 18 日 | 7F:8A:B0:CF:D0:51:87:6A:66:F3:36:0F:47:C8:8D:8C:D3:35:FC:74 | 
| atostrustedroot2011 |  2018 年 6 月 18 日 | 2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21 | 
| mozillacert111.pem |  2018 年 6 月 18 日 | 9C:BB:48:53:F6:A4:F6:D3:52:A4:E8:32:52:55:60:13:F5:AD:AF:65 | 
| staatdernederlandenevrootca |  2018 年 6 月 18 日 | 76:E2:7E:C1:4F:DB:82:C1:C0:A6:75:B5:05:BE:3D:29:B4:ED:DB:BB | 
| mozillacert45.pem |  2018 年 6 月 18 日 | 67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0 | 
| mozillacert103.pem |  2018 年 6 月 18 日 | 70:C1:8D:74:B4:28:81:0A:E4:FD:A5:75:D7:01:9F:99:B0:3D:50:74 | 
| mozillacert37.pem |  2018 年 6 月 18 日 | B1:2E:13:63:45:86:A4:6F:1A:B2:60:68:37:58:2D:C4:AC:FD:94:97 | 
| mozillacert29.pem |  2018 年 6 月 18 日 | 74:F8:A3:C3:EF:E7:B3:90:06:4B:83:90:3C:21:64:60:20:E5:DF:CE | 
| izenpecom |  2018 年 6 月 18 日 | 2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19 | 
| comodorsacertificationauthority |  2018 年 6 月 18 日 | AF:E5:D2:44:A8:D1:19:42:30:FF:47:9F:E2:F8:97:BB:CD:7A:8C:B4 | 
| mozillacert99.pem |  2018 年 6 月 18 日 | F1:7F:6F:B6:31:DC:99:E3:A3:C8:7F:FE:1C:F1:81:10:88:D9:60:33 | 
| mozillacert149.pem |  2018 年 6 月 18 日 | 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1 | 
| utnuserfirstobjectca |  2018 年 4 月 21 日 | E1:2D:FB:4B:41:D7:D9:C3:2B:30:51:4B:AC:1D:81:D8:38:5E:2D:46 | 
| verisignc3g3.pem |  2018 年 6 月 18 日 | 13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6 | 
| dstrootcax3 |  2018 年 6 月 18 日 | DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13 | 
| addtrustexternalroot |  2018 年 6 月 18 日 | 02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68 | 
| certumtrustednetworkca |  2018 年 6 月 18 日 | 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E | 
| affirmtrustpremiumecc |  2018 年 6 月 18 日 | B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB | 
| starfieldclass2ca |  2018 年 6 月 18 日 | AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A | 
| actalisauthenticationrootca |  2018 年 6 月 18 日 | F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC | 
| verisignclass2g3ca |  2018 年 4 月 21 日 | 61:EF:43:D7:7F:CA:D4:61:51:BC:98:E0:C3:59:12:AF:9F:EB:63:11 | 
| isrgrootx1 |  2018 年 6 月 18 日 | CA:BD:2A:79:A1:07:6A:31:F2:1D:25:36:35:CB:03:9D:43:29:A5:E8 | 
| godaddyrootcertificateauthorityg2 |  2018 年 6 月 18 日 | 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B | 
| mozillacert60.pem |  2018 年 6 月 18 日 | 3B:C4:9F:48:F8:F3:73:A0:9C:1E:BD:F8:5B:B1:C3:65:C7:D8:11:B3 | 
| chunghwaepkirootca |  2018 年 4 月 21 日 | 67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0 | 
| mozillacert52.pem |  2018 年 6 月 18 日 | 8B:AF:4C:9B:1D:F0:2A:92:F7:DA:12:8E:B9:1B:AC:F4:98:60:4B:6F | 
| microseceszignorootca2009 |  2018 年 6 月 18 日 | 89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E | 
| securesignrootca11 |  2018 年 6 月 18 日 | 3B:C4:9F:48:F8:F3:73:A0:9C:1E:BD:F8:5B:B1:C3:65:C7:D8:11:B3 | 
| mozillacert110.pem |  2018 年 6 月 18 日 | 93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17 | 
| mozillacert44.pem |  2018 年 6 月 18 日 | 5F:43:E5:B1:BF:F8:78:8C:AC:1C:C7:CA:4A:9A:C6:22:2B:CC:34:C6 | 
| mozillacert102.pem |  2018 年 6 月 18 日 | 96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83 | 
| mozillacert36.pem |  2018 年 6 月 18 日 | 23:88:C9:D3:71:CC:9E:96:3D:FF:7D:3C:A7:CE:FC:D6:25:EC:19:0D | 
| mozillacert28.pem |  2018 年 6 月 18 日 | 66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B | 
| baltimorecybertrustroot |  2018 年 6 月 18 日 | D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74 | 
| amzninternalrootca |  2008 年 12 月 12 日 | A7:B7:F6:15:8A:FF:1E:C8:85:13:38:BC:93:EB:A2:AB:A4:09:EF:06 | 
| mozillacert98.pem |  2018 年 6 月 18 日 | C9:A8:B9:E7:55:80:5E:58:E3:53:77:A7:25:EB:AF:C3:7B:27:CC:D7 | 
| mozillacert148.pem |  2018 年 6 月 18 日 | 04:83:ED:33:99:AC:36:08:05:87:22:ED:BC:5E:46:00:E3:BE:F9:D7 | 
| verisignc3g2.pem |  2018 年 6 月 18 日 | 85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F | 
| quovadisrootca2g3 |  2018 年 6 月 18 日 | 09:3C:61:F3:8B:8B:DC:7D:55:DF:75:38:02:05:00:E1:25:F5:C8:36 | 
| geotrustprimarycertificationauthority |  2018 年 6 月 18 日 | 32:3C:11:8E:1B:F7:B8:B6:52:54:E2:E2:10:0D:D6:02:90:37:F0:96 | 
| opentrustrootcag3 |  2018 年 6 月 18 日 | 6E:26:64:F3:56:BF:34:55:BF:D1:93:3F:7C:01:DE:D8:13:DA:8A:A6 | 
| opentrustrootcag2 |  2018 年 6 月 18 日 | 79:5F:88:60:C5:AB:7C:3D:92:E6:CB:F4:8D:E1:45:CD:11:EF:60:0B | 
| opentrustrootcag1 |  2018 年 6 月 18 日 | 79:91:E8:34:F7:E2:EE:DD:08:95:01:52:E9:55:2D:14:E9:58:D5:7E | 
| verisignclass3ca |  2018 年 4 月 21 日 | A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B | 
| globalsignca |  2018 年 4 月 21 日 | B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C | 
| ttelesecglobalrootclass2ca |  2018 年 4 月 21 日 | 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 | 
| verisignclass1g3ca |  2018 年 4 月 21 日 | 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5 | 
| verisignuniversalrootca |  2018 年 4 月 21 日 | 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54 | 
| soneraclass2ca |  2018 年 4 月 21 日 | 37:F7:6D:E6:07:7C:90:C5:B1:3E:93:1A:B7:41:10:B4:F2:E4:9A:27 | 
| starfieldservicesrootcertificateauthorityg2 |  2018 年 6 月 18 日 | 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F | 
| mozillacert51.pem |  2018 年 6 月 18 日 | FA:B7:EE:36:97:26:62:FB:2D:B0:2A:F6:BF:03:FD:E8:7C:4B:2F:9B | 
| mozillacert43.pem |  2018 年 6 月 18 日 | F9:CD:0E:2C:DA:76:24:C1:8F:BD:F0:F0:AB:B6:45:B8:F7:FE:D5:7A | 
| mozillacert101.pem |  2018 年 6 月 18 日 | 99:A6:9B:E6:1A:FE:88:6B:4D:2B:82:00:7C:B8:54:FC:31:7E:15:39 | 
| mozillacert35.pem |  2018 年 6 月 18 日 | 2A:C8:D5:8B:57:CE:BF:2F:49:AF:F2:FC:76:8F:51:14:62:90:7A:41 | 
| globalsignr2ca |  2018 年 4 月 21 日 | 75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE | 
| mozillacert27.pem |  2018 年 6 月 18 日 | 3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B | 
| affirmtrustpremium |  2018 年 6 月 18 日 | D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27 | 
| mozillacert19.pem |  2018 年 6 月 18 日 | B4:35:D4:E1:11:9D:1C:66:90:A7:49:EB:B3:94:BD:63:7B:A7:82:B7 | 
| mozillacert97.pem |  2018 年 6 月 18 日 | 85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F | 
| netlockaranyclassgoldfotanusitvany |  2018 年 6 月 18 日 | 06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91 | 
| mozillacert89.pem |  2018 年 6 月 18 日 | C8:EC:8C:87:92:69:CB:4B:AB:39:E9:8D:7E:57:67:F3:14:95:73:9D | 
| verisignroot.pem |  2018 年 6 月 18 日 | 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54 | 
| mozillacert147.pem |  2018 年 6 月 18 日 | 58:11:9F:0E:12:82:87:EA:50:FD:D9:87:45:6F:4F:78:DC:FA:D6:D4 | 
| aolrootca2 |  2018 年 4 月 21 日 | 85:B5:FF:67:9B:0C:79:96:1F:C8:6E:44:22:00:46:13:DB:17:92:84 | 
| cia-crt-g3-01-ca |  2016 年 11 月 23 日 | 2B:EE:2C:BA:A3:1D:B5:FE:60:40:41:95:08:ED:46:82:39:4D:ED:E2 | 
| aolrootca1 |  2018 年 4 月 21 日 | 39:21:C1:15:C1:5D:0E:CA:5C:CB:5B:C4:F0:7D:21:D8:05:0B:56:6A | 
| verisignc3g1.pem |  2018 年 6 月 18 日 | A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B | 
| mozillacert139.pem |  2018 年 6 月 18 日 | DE:3F:40:BD:50:93:D3:9B:6C:60:F6:DA:BC:07:62:01:00:89:76:C9 | 
| soneraclass2rootca |  2018 年 6 月 18 日 | 37:F7:6D:E6:07:7C:90:C5:B1:3E:93:1A:B7:41:10:B4:F2:E4:9A:27 | 
| swisssignsilverg2ca |  2018 年 4 月 21 日 | 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB | 
| thawteprimaryrootca |  2018 年 6 月 18 日 | 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81 | 
| gdcatrustauthr5root |  2018 年 6 月 18 日 | 0F:36:38:5B:81:1A:25:C3:9B:31:4E:83:CA:E9:34:66:70:CC:74:B4 | 
| trustcenterclass4caii |  2018 年 4 月 21 日 | A6:9A:91:FD:05:7F:13:6A:42:63:0B:B1:76:0D:2D:51:12:0C:16:50 | 
| usertrustrsacertificationauthority |  2018 年 6 月 18 日 | 2B:8F:1B:57:33:0D:BB:A2:D0:7A:6C:51:F7:0E:E9:0D:DA:B9:AD:8E | 
| digicertassuredidrootg3 |  2018 年 6 月 18 日 | F5:17:A2:4F:9A:48:C6:C9:F8:A2:00:26:9F:DC:0F:48:2C:AB:30:89 | 
| digicertassuredidrootg2 |  2018 年 6 月 18 日 | A1:4B:48:D9:43:EE:0A:0E:40:90:4F:3C:E0:A4:C0:91:93:51:5D:3F | 
| mozillacert50.pem |  2018 年 6 月 18 日 | 8C:96:BA:EB:DD:2B:07:07:48:EE:30:32:66:A0:F3:98:6E:7C:AE:58 | 
| mozillacert42.pem |  2018 年 6 月 18 日 | 85:A4:08:C0:9C:19:3E:5D:51:58:7D:CD:D6:13:30:FD:8C:DE:37:BF | 
| mozillacert100.pem |  2018 年 6 月 18 日 | 58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0 | 
| mozillacert34.pem |  2018 年 6 月 18 日 | 59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9 | 
| affirmtrustcommercialca |  2018 年 4 月 21 日 | F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7 | 
| mozillacert26.pem |  2018 年 6 月 18 日 | 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11 | 
| globalsigneccrootcar5 |  2018 年 6 月 18 日 | 1F:24:C6:30:CD:A4:18:EF:20:69:FF:AD:4F:DD:5F:46:3A:1B:69:AA | 
| globalsigneccrootcar4 |  2018 年 6 月 18 日 | 69:69:56:2E:40:80:F4:24:A1:E7:19:9F:14:BA:F3:EE:58:AB:6A:BB | 
| buypassclass3rootca |  2018 年 6 月 18 日 | DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57 | 
| mozillacert18.pem |  2018 年 6 月 18 日 | 79:98:A3:08:E1:4D:65:85:E6:C2:1E:15:3A:71:9F:BA:5A:D3:4A:D9 | 
| mozillacert96.pem |  2018 年 6 月 18 日 | 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1 | 
| verisignc2g6.pem |  2018 年 6 月 18 日 | 40:B3:31:A0:E9:BF:E8:55:BC:39:93:CA:70:4F:4E:C2:51:D4:1D:8F | 
| secomvalicertclass1ca |  2018 年 4 月 21 日 | E5:DF:74:3C:B6:01:C4:9B:98:43:DC:AB:8C:E8:6A:81:10:9F:E4:8E | 
| mozillacert88.pem |  2018 年 6 月 18 日 | FE:45:65:9B:79:03:5B:98:A1:61:B5:51:2E:AC:DA:58:09:48:22:4D | 
| accvraiz1 |  2018 年 6 月 18 日 | 93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17 | 
| mozillacert146.pem |  2018 年 6 月 18 日 | 21:FC:BD:8E:7F:6C:AF:05:1B:D1:B3:43:EC:A8:E7:61:47:F2:0F:8A | 
| mozillacert138.pem |  2018 年 6 月 18 日 | E1:9F:E3:0E:8B:84:60:9E:80:9B:17:0D:72:A8:C5:BA:6E:14:09:BD | 
| verisignclass3g2ca |  2018 年 4 月 21 日 | 85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F | 
| dtrustrootclass3ca2ev2009 |  2018 年 6 月 18 日 | 96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83 | 
| xrampglobalca |  2018 年 4 月 21 日 | B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6 | 
| mozillacert9.pem |  2018 年 6 月 18 日 | F4:8B:11:BF:DE:AB:BE:94:54:20:71:E6:41:DE:6B:BE:88:2B:40:B9 | 
| verisignuniversalrootcertificationauthority |  2018 年 6 月 18 日 | 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54 | 
| tubitakkamusmsslkoksertifikasisurum1 |  2018 年 6 月 18 日 | 31:43:64:9B:EC:CE:27:EC:ED:3A:3F:0B:8F:0D:E4:E8:91:DD:EE:CA | 
| mozillacert41.pem |  2018 年 6 月 18 日 | 6B:2F:34:AD:89:58:BE:62:FD:B0:6B:5C:CE:BB:9D:D9:4F:4E:39:F3 | 
| mozillacert33.pem |  2018 年 6 月 18 日 | FE:B8:C4:32:DC:F9:76:9A:CE:AE:3D:D8:90:8F:FD:28:86:65:64:7D | 
| mozillacert25.pem |  2018 年 6 月 18 日 | 4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5 | 
| mozillacert17.pem |  2018 年 6 月 18 日 | 40:54:DA:6F:1C:3F:40:74:AC:ED:0F:EC:CD:DB:79:D1:53:FB:90:1D | 
| mozillacert95.pem |  2018 年 6 月 18 日 | DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57 | 
| affirmtrustpremiumeccca |  2018 年 4 月 21 日 | B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB | 
| mozillacert87.pem |  2018 年 6 月 18 日 | 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74 | 
| mozillacert145.pem |  2018 年 6 月 18 日 | 10:1D:FA:3F:D5:0B:CB:BB:9B:B5:60:0C:19:55:A4:1A:F4:73:3A:04 | 
| mozillacert79.pem |  2018 年 6 月 18 日 | D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27 | 
| mozillacert137.pem |  2018 年 6 月 18 日 | 4A:65:D5:F4:1D:EF:39:B8:B8:90:4A:4A:D3:64:81:33:CF:C7:A1:D1 | 
| digicertassuredidrootca |  2018 年 6 月 18 日 | 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43 | 
| addtrustqualifiedca |  2018 年 4 月 21 日 | 4D:23:78:EC:91:95:39:B5:00:7F:75:8F:03:3B:21:1E:C5:4D:8B:CF | 
| mozillacert129.pem |  2018 年 6 月 18 日 | E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79 | 
| verisignclass2g2ca |  2018 年 4 月 21 日 | B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D | 
| baltimorecodesigningca |  2018 年 4 月 21 日 | 30:46:D8:C8:88:FF:69:30:C3:4A:FC:CD:49:27:08:7C:60:56:7B:0D | 
| luxtrustglobalroot2 |  2018 年 6 月 18 日 | 1E:0E:56:19:0A:D1:8B:25:98:B2:04:44:FF:66:8A:04:17:99:5F:3F | 
| visaecommerceroot |  2018 年 6 月 18 日 | 70:17:9B:86:8C:00:A4:FA:60:91:52:22:3F:9F:3E:32:BD:E0:05:62 | 
| oistewisekeyglobalrootgbca |  2018 年 6 月 18 日 | 0F:F9:40:76:18:D3:D7:6A:4B:98:F0:A8:35:9E:0C:FD:27:AC:CC:ED | 
| mozillacert8.pem |  2018 年 6 月 18 日 | 3E:2B:F7:F2:03:1B:96:F3:8C:E6:C4:D8:A8:5D:3E:2D:58:47:6A:0F | 
| comodocertificationauthority |  2018 年 6 月 18 日 | 66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B | 
| cia-crt-g3-02-ca |  2016 年 11 月 23 日 | 96:4A:BB:A7:BD:DA:FC:97:34:C0:0A:2D:F0:05:98:F7:E6:C6:6F:09 | 
| verisignc1g6.pem |  2018 年 6 月 18 日 | 51:7F:61:1E:29:91:6B:53:82:FB:72:E7:44:D9:8D:C3:CC:53:6D:64 | 
| trustcenterclass2caii |  2018 年 4 月 21 日 | AE:50:83:ED:7C:F4:5C:BC:8F:61:C6:21:FE:68:5D:79:42:21:15:6E | 
| quovadisrootca1g3 |  2018 年 6 月 18 日 | 1B:8E:EA:57:96:29:1A:C9:39:EA:B8:0A:81:1A:73:73:C0:93:79:67 | 
| mozillacert40.pem |  2018 年 6 月 18 日 | 80:25:EF:F4:6E:70:C8:D4:72:24:65:84:FE:40:3B:8A:8D:6A:DB:F5 | 
| cadisigrootr2 |  2018 年 6 月 18 日 | B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71 | 
| cadisigrootr1 |  2018 年 6 月 18 日 | 8E:1C:74:F8:A6:20:B9:E5:8A:F4:61:FA:EC:2B:47:56:51:1A:52:C6 | 
| mozillacert32.pem |  2018 年 6 月 18 日 | 60:D6:89:74:B5:C2:65:9E:8A:0F:C1:88:7C:88:D2:46:69:1B:18:2C | 
| utndatacorpsgcca |  2018 年 4 月 21 日 | 58:11:9F:0E:12:82:87:EA:50:FD:D9:87:45:6F:4F:78:DC:FA:D6:D4 | 
| mozillacert24.pem |  2018 年 6 月 18 日 | 59:AF:82:79:91:86:C7:B4:75:07:CB:CF:03:57:46:EB:04:DD:B7:16 | 
| addtrustclass1ca |  2018 年 4 月 21 日 | CC:AB:0E:A0:4C:23:01:D6:69:7B:DD:37:9F:CD:12:EB:24:E3:94:9D | 
| mozillacert16.pem |  2018 年 6 月 18 日 | DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13 | 
| affirmtrustnetworkingca |  2018 年 4 月 21 日 | 29:36:21:02:8B:20:ED:02:F5:66:C5:32:D1:D6:ED:90:9F:45:00:2F | 
| mozillacert94.pem |  2018 年 6 月 18 日 | 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99 | 
| mozillacert86.pem |  2018 年 6 月 18 日 | 74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2 | 
| mozillacert144.pem |  2018 年 6 月 18 日 | 37:F7:6D:E6:07:7C:90:C5:B1:3E:93:1A:B7:41:10:B4:F2:E4:9A:27 | 
| mozillacert78.pem |  2018 年 6 月 18 日 | 29:36:21:02:8B:20:ED:02:F5:66:C5:32:D1:D6:ED:90:9F:45:00:2F | 
| mozillacert136.pem |  2018 年 6 月 18 日 | D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49 | 
| mozillacert128.pem |  2018 年 6 月 18 日 | A9:E9:78:08:14:37:58:88:F2:05:19:B0:6D:2B:0D:2B:60:16:90:7D | 
| verisignclass1g2ca |  2018 年 4 月 21 日 | 27:3E:E1:24:57:FD:C4:F9:0C:55:E8:2B:56:16:7F:62:F5:32:E5:47 | 
| hellenicacademicandresearchinstitutionsrootca2015 |  2018 年 6 月 18 日 | 01:0C:06:95:A6:98:19:14:FF:BF:5F:C6:B0:B6:95:EA:29:E9:12:A6 | 
| soneraclass1ca |  2018 年 4 月 21 日 | 07:47:22:01:99:CE:74:B9:7C:B0:3D:79:B2:64:A2:C8:55:E9:33:FF | 
| hellenicacademicandresearchinstitutionsrootca2011 |  2018 年 6 月 18 日 | FE:45:65:9B:79:03:5B:98:A1:61:B5:51:2E:AC:DA:58:09:48:22:4D | 
| certumtrustednetworkca2 |  2018 年 6 月 18 日 | D3:DD:48:3E:2B:BF:4C:05:E8:AF:10:F5:FA:76:26:CF:D3:DC:30:92 | 
| equifaxsecureca |  2018 年 4 月 21 日 | D2:32:09:AD:23:D3:14:23:21:74:E4:0D:7F:9D:62:13:97:86:63:3A | 
| thawteserverca |  2018 年 4 月 21 日 | 9F:AD:91:A6:CE:6A:C6:C5:00:47:C4:4E:C9:D4:A5:0D:92:D8:49:79 | 
| mozillacert7.pem |  2018 年 6 月 18 日 | AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A | 
| affirmtrustnetworking |  2018 年 6 月 18 日 | 29:36:21:02:8B:20:ED:02:F5:66:C5:32:D1:D6:ED:90:9F:45:00:2F | 
| deprecateditsecca |  2012 年 1 月 27 日 | 12:12:0B:03:0E:15:14:54:F4:DD:B3:F5:DE:13:6E:83:5A:29:72:9D | 
| globalsignrootcar3 |  2018 年 6 月 18 日 | D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD | 
| globalsignrootcar2 |  2018 年 6 月 18 日 | 75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE | 
| quovadisrootca |  2018 年 6 月 18 日 | DE:3F:40:BD:50:93:D3:9B:6C:60:F6:DA:BC:07:62:01:00:89:76:C9 | 
| mozillacert31.pem |  2018 年 6 月 18 日 | 9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11 | 
| entrustrootcertificationauthority |  2018 年 6 月 18 日 | B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9 | 
| mozillacert23.pem |  2018 年 6 月 18 日 | 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81 | 
| mozillacert15.pem |  2018 年 6 月 18 日 | 74:20:74:41:72:9C:DD:92:EC:79:31:D8:23:10:8D:C2:81:92:E2:BB | 
| verisignc2g3.pem |  2018 年 6 月 18 日 | 61:EF:43:D7:7F:CA:D4:61:51:BC:98:E0:C3:59:12:AF:9F:EB:63:11 | 
| mozillacert93.pem |  2018 年 6 月 18 日 | 31:F1:FD:68:22:63:20:EE:C6:3B:3F:9D:EA:4A:3E:53:7C:7C:39:17 | 
| mozillacert151.pem |  2018 年 6 月 18 日 | AC:ED:5F:65:53:FD:25:CE:01:5F:1F:7A:48:3B:6A:74:9F:61:78:C6 | 
| mozillacert85.pem |  2018 年 6 月 18 日 | CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48 | 
| certplusclass2primaryca |  2018 年 6 月 18 日 | 74:20:74:41:72:9C:DD:92:EC:79:31:D8:23:10:8D:C2:81:92:E2:BB | 
| mozillacert143.pem |  2018 年 6 月 18 日 | 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7 | 
| mozillacert77.pem |  2018 年 6 月 18 日 | 13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6 | 
| mozillacert135.pem |  2018 年 6 月 18 日 | 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18 | 
| mozillacert69.pem |  2018 年 6 月 18 日 | 2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19 | 
| mozillacert127.pem |  2018 年 6 月 18 日 | DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12 | 
| mozillacert119.pem |  2018 年 6 月 18 日 | 75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE | 
| geotrustprimarycag3 |  2018 年 4 月 21 日 | 03:9E:ED:B8:0B:E7:A0:3C:69:53:89:3B:20:D2:D9:32:3A:4C:2A:FD | 
| identrustpublicsectorrootca1 |  2018 年 6 月 18 日 | BA:29:41:60:77:98:3F:F4:F3:EF:F2:31:05:3B:2E:EA:6D:4D:45:FD | 
| geotrustprimarycag2 |  2018 年 4 月 21 日 | 8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0 | 
| trustcorrootcertca2 |  2018 年 6 月 18 日 | B8:BE:6D:CB:56:F1:55:B9:63:D4:12:CA:4E:06:34:C7:94:B2:1C:C0 | 
| mozillacert6.pem |  2018 年 6 月 18 日 | 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4 | 
| trustcorrootcertca1 |  2018 年 6 月 18 日 | FF:BD:CD:E7:82:C8:43:5E:3C:6F:26:86:5C:CA:A8:3A:45:5B:C3:0A | 
| networksolutionscertificateauthority |  2018 年 6 月 18 日 | 74:F8:A3:C3:EF:E7:B3:90:06:4B:83:90:3C:21:64:60:20:E5:DF:CE | 
| twcarootcertificationauthority |  2018 年 6 月 18 日 | CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48 | 
| addtrustexternalca |  2018 年 4 月 21 日 | 02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68 | 
| verisignclass3g5ca |  2018 年 4 月 21 日 | 4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5 | 
| autoridaddecertificacionfirmaprofesionalcifa62634068 |  2018 年 6 月 18 日 | AE:C5:FB:3F:C8:E1:BF:C4:E5:4F:03:07:5A:9A:E8:00:B7:F7:B6:FA | 
| hellenicacademicandresearchinstitutionseccrootca2015 |  2018 年 6 月 18 日 | 9F:F1:71:8D:92:D5:9A:F3:7D:74:97:B4:BC:6F:84:68:0B:BA:B6:66 | 
| verisigntsaca |  2018 年 4 月 21 日 | 20:CE:B1:F0:F5:1C:0E:19:A9:F3:8D:B1:AA:8E:03:8C:AA:7A:C7:01 | 
| utnuserfirsthardwareca |  2018 年 4 月 21 日 | 04:83:ED:33:99:AC:36:08:05:87:22:ED:BC:5E:46:00:E3:BE:F9:D7 | 
| identrustcommercialrootca1 |  2018 年 6 月 18 日 | DF:71:7E:AA:4A:D9:4E:C9:55:84:99:60:2D:48:DE:5F:BC:F0:3A:25 | 
| dtrustrootclass3ca22009 |  2018 年 6 月 18 日 | 58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0 | 
| epkirootcertificationauthority |  2018 年 6 月 18 日 | 67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0 | 
| mozillacert30.pem |  2018 年 6 月 18 日 | E7:B4:F6:9D:61:EC:90:69:DB:7E:90:A7:40:1A:3C:F4:7D:4F:E8:EE | 
| teliasonerarootcav1 |  2018 年 6 月 18 日 | 43:13:BB:96:F1:D5:86:9B:C1:4E:6A:92:F6:CF:F6:34:69:87:82:37 | 
| buypassclass3ca |  2018 年 4 月 21 日 | DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57 | 
| mozillacert22.pem |  2018 年 6 月 18 日 | 32:3C:11:8E:1B:F7:B8:B6:52:54:E2:E2:10:0D:D6:02:90:37:F0:96 | 
| mozillacert14.pem |  2018 年 6 月 18 日 | 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25 | 
| verisignc2g2.pem |  2018 年 6 月 18 日 | B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D | 
| certumca |  2018 年 4 月 21 日 | 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18 | 
| mozillacert92.pem |  2018 年 6 月 18 日 | A3:F1:33:3F:E2:42:BF:CF:C5:D1:4E:8F:39:42:98:40:68:10:D1:A0 | 
| mozillacert150.pem |  2018 年 6 月 18 日 | 33:9B:6B:14:50:24:9B:55:7A:01:87:72:84:D9:E0:2F:C3:D2:D8:E9 | 
| mozillacert84.pem |  2018 年 6 月 18 日 | D3:C0:63:F2:19:ED:07:3E:34:AD:5D:75:0B:32:76:29:FF:D5:9A:F2 | 
| ttelesecglobalrootclass3 |  2018 年 6 月 18 日 | 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1 | 
| globalsignrootca |  2018 年 6 月 18 日 | B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C | 
| ttelesecglobalrootclass2 |  2018 年 6 月 18 日 | 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 | 
| mozillacert142.pem |  2018 年 6 月 18 日 | 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85 | 
| mozillacert76.pem |  2018 年 6 月 18 日 | F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7 | 
| mozillacert134.pem |  2018 年 6 月 18 日 | 70:17:9B:86:8C:00:A4:FA:60:91:52:22:3F:9F:3E:32:BD:E0:05:62 | 
| mozillacert68.pem |  2018 年 6 月 18 日 | AE:C5:FB:3F:C8:E1:BF:C4:E5:4F:03:07:5A:9A:E8:00:B7:F7:B6:FA | 
| etugracertificationauthority |  2018 年 6 月 18 日 | 51:C6:E7:08:49:06:6E:F3:92:D4:5C:A0:0D:6D:A3:62:8F:C3:52:39 | 
| mozillacert126.pem |  2018 年 6 月 18 日 | 25:01:90:19:CF:FB:D9:99:1C:B7:68:25:74:8D:94:5F:30:93:95:42 | 
| keynectisrootca |  2018 年 4 月 21 日 | 9C:61:5C:4D:4D:85:10:3A:53:26:C2:4D:BA:EA:E4:A2:D2:D5:CC:97 | 
| mozillacert118.pem |  2018 年 6 月 18 日 | 7E:78:4A:10:1C:82:65:CC:2D:E1:F1:6D:47:B4:40:CA:D9:0A:19:45 | 
| quovadisrootca3 |  2018 年 6 月 18 日 | 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85 | 
| quovadisrootca2 |  2018 年 6 月 18 日 | CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7 | 
| mozillacert5.pem |  2018 年 6 月 18 日 | B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6 | 
| verisignc1g3.pem |  2018 年 6 月 18 日 | 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5 | 
| cybertrustglobalroot |  2018 年 6 月 18 日 | 5F:43:E5:B1:BF:F8:78:8C:AC:1C:C7:CA:4A:9A:C6:22:2B:CC:34:C6 | 
| amzninternalinfoseccag3 |  2015 年 2 月 27 日 | B9:B1:CA:38:F7:BF:9C:D2:D4:95:E7:B6:5E:75:32:9B:A8:78:2E:F6 | 
| starfieldrootcertificateauthorityg2 |  2018 年 6 月 18 日 | B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E | 
| entrust2048ca |  2018 年 4 月 21 日 | 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31 | 
| swisssignsilvercag2 |  2018 年 6 月 18 日 | 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB | 
| affirmtrustcommercial |  2018 年 6 月 18 日 | F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7 | 
| certinomisrootca |  2018 年 6 月 18 日 | 9D:70:BB:01:A5:A4:A0:18:11:2E:F7:1C:01:B9:32:C5:34:E7:88:A8 | 
| xrampglobalcaroot |  2018 年 6 月 18 日 | B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6 | 
| secureglobalca |  2018 年 6 月 18 日 | 3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B | 
| swisssigngoldg2ca |  2018 年 4 月 21 日 | D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61 | 
| mozillacert21.pem |  2018 年 6 月 18 日 | 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB | 
| mozillacert13.pem |  2018 年 6 月 18 日 | 06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91 | 
| verisignc2g1.pem |  2018 年 6 月 18 日 | 67:82:AA:E0:ED:EE:E2:1A:58:39:D3:C0:CD:14:68:0A:4F:60:14:2A | 
| mozillacert91.pem |  2018 年 6 月 18 日 | 3B:C0:38:0B:33:C3:F6:A6:0C:86:15:22:93:D9:DF:F5:4B:81:C0:04 | 
| oistewisekeyglobalrootgaca |  2018 年 6 月 18 日 | 59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9 | 
| mozillacert83.pem |  2018 年 6 月 18 日 | A0:73:E5:C5:BD:43:61:0D:86:4C:21:13:0A:85:58:57:CC:9C:EA:46 | 
| entrustevca |  2018 年 4 月 21 日 | B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9 | 
| mozillacert141.pem |  2018 年 6 月 18 日 | 31:7A:2A:D0:7F:2B:33:5E:F5:A1:C3:4E:4B:57:E8:B7:D8:F1:FC:A6 | 
| mozillacert75.pem |  2018 年 6 月 18 日 | D2:32:09:AD:23:D3:14:23:21:74:E4:0D:7F:9D:62:13:97:86:63:3A | 
| mozillacert133.pem |  2018 年 6 月 18 日 | 85:B5:FF:67:9B:0C:79:96:1F:C8:6E:44:22:00:46:13:DB:17:92:84 | 
| mozillacert67.pem |  2018 年 6 月 18 日 | D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD | 
| mozillacert125.pem |  2018 年 6 月 18 日 | B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9 | 
| mozillacert59.pem |  2018 年 6 月 18 日 | 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54 | 
| thawtepremiumserverca |  2018 年 4 月 21 日 | E0:AB:05:94:20:72:54:93:05:60:62:02:36:70:F7:CD:2E:FC:66:66 | 
| mozillacert117.pem |  2018 年 6 月 18 日 | D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74 | 
| utnuserfirstclientauthemailca |  2018 年 4 月 21 日 | B1:72:B1:A5:6D:95:F9:1F:E5:02:87:E1:4D:37:EA:6A:44:63:76:8A | 
| entrustrootcag2 |  2018 年 4 月 21 日 | 8C:F4:27:FD:79:0C:3A:D1:66:06:8D:E8:1E:57:EF:BB:93:22:72:D4 | 
| mozillacert109.pem |  2018 年 6 月 18 日 | B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71 | 
| digicerttrustedrootg4 |  2018 年 6 月 18 日 | DD:FB:16:CD:49:31:C9:73:A2:03:7D:3F:C8:3A:4D:7D:77:5D:05:E4 | 
| gdroot-g2.pem |  2018 年 6 月 18 日 | 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B | 
| comodoaaaservicesroot |  2018 年 6 月 18 日 | D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49 | 
| mozillacert4.pem |  2018 年 6 月 18 日 | E3:92:51:2F:0A:CF:F5:05:DF:F6:DE:06:7F:75:37:E1:65:EA:57:4B | 
| verisignclass3publicprimarycertificationauthorityg5 |  2018 年 6 月 18 日 | 4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5 | 
| chambersofcommerceroot2008 |  2018 年 6 月 18 日 | 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C | 
| verisignclass3publicprimarycertificationauthorityg4 |  2018 年 6 月 18 日 | 22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A | 
| verisignclass3publicprimarycertificationauthorityg3 |  2018 年 6 月 18 日 | 13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6 | 
| thawtepersonalfreemailca |  2018 年 4 月 21 日 | E6:18:83:AE:84:CA:C1:C1:CD:52:AD:E8:E9:25:2B:45:A6:4F:B7:E2 | 
| verisignc1g2.pem |  2018 年 6 月 18 日 | 27:3E:E1:24:57:FD:C4:F9:0C:55:E8:2B:56:16:7F:62:F5:32:E5:47 | 
| gtecybertrustglobalca |  2018 年 4 月 21 日 | 97:81:79:50:D8:1C:96:70:CC:34:D8:09:CF:79:44:31:36:7E:F4:74 | 
| trustcenteruniversalcai |  2018 年 4 月 21 日 | 6B:2F:34:AD:89:58:BE:62:FD:B0:6B:5C:CE:BB:9D:D9:4F:4E:39:F3 | 
| camerfirmachamberscommerceca |  2018 年 4 月 21 日 | 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1 | 
| verisignclass1ca |  2018 年 4 月 21 日 | CE:6A:64:A3:09:E4:2F:BB:D9:85:1C:45:3E:64:09:EA:E8:7D:60:F1 | 

# AWS AppSync 解析程式映射範本變更日誌
<a name="resolver-mapping-template-changelog"></a>

**注意**  
我們現在主要支援 APPSYNC\$1JS 執行期及其文件。請考慮[在此處](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)使用 APPSYNC\$1JS 執行期及其指南。

解析程式和函數映射範本已採取版本控制。映射範本版本，例如 `2018-05-29`) 規定如下：
+ 請求範本所提供資料來源請求組態的預期形狀
+ 請求映射範本和回應映射範本的執行行為

版本呈現格式為 YYYY-MM-DD，較晚日期代表較新版本。此頁面列出目前支援的映射範本版本之間的差異 AWS AppSync。

**Topics**
+ [每種版本陣列的可用資料來源操作](#aws-appsync-resolver-mapping-template-operation-availability-per-version)
+ [變更單位解析程式映射範本的版本](#changing-the-version-on-a-unit-resolver-mapping-template)
+ [變更函數的版本](#changing-the-version-on-a-function)
+ [2018-05-29](#aws-appsync-resolver-mapping-template-version-2018-05-29)
+ [2017-02-28](#aws-appsync-resolver-mapping-template-version-2017-02-28)

## 每種版本陣列的可用資料來源操作
<a name="aws-appsync-resolver-mapping-template-operation-availability-per-version"></a>


| 支援的操作/版本 | 2017-02-28 | 2018-05-29 | 
| --- | --- | --- | 
|  AWS Lambda 叫用  |  是  |  是  | 
|  AWS Lambda BatchInvoke  |  是  |  是  | 
|  None Datasource  |  是  |  是  | 
|  Amazon OpenSearch GET  |  是  |  是  | 
|  Amazon OpenSearch POST  |  是  |  是  | 
|  Amazon OpenSearch PUT  |  是  |  是  | 
|  Amazon OpenSearch DELETE  |  是  |  是  | 
|  Amazon OpenSearch GET  |  是  |  是  | 
|  DynamoDB GetItem  |  是  |  是  | 
|  DynamoDB Scan  |  是  |  是  | 
|  DynamoDB Query  |  是  |  是  | 
|  DynamoDB DeleteItem  |  是  |  是  | 
|  DynamoDB PutItem  |  是  |  是  | 
|  DynamoDB BatchGetItem  |  否  |  是  | 
|  DynamoDB BatchPutItem  |  否  |  是  | 
|  DynamoDB BatchDeleteItem  |  否  |  是  | 
|  HTTP  |  否  |  是  | 
|  Amazon RDS  |  否  |  是  | 

 **注意**：函數目前僅支援 **2018-05-29** 版本。

## 變更單位解析程式映射範本的版本
<a name="changing-the-version-on-a-unit-resolver-mapping-template"></a>

對於單位解析程式，版本會指定為要求映射範本的內容部分。若要更新版本，只要直接將 `version` 欄位更新成新版本。

例如，若要更新 AWS Lambda 範本上的版本：

```
{
    "version": "2017-02-28",
    "operation": "Invoke",
    "payload": {
        "field": "getPost",
        "arguments": $utils.toJson($context.arguments)
    }
}
```

您需要將 `2017-02-28` 的版本欄位更新成 `2018-05-29`，如下所示：

```
{
    "version": "2018-05-29", ## Note the version
    "operation": "Invoke",
    "payload": {
        "field": "getPost",
        "arguments": $utils.toJson($context.arguments)
    }
}
```

## 變更函數的版本
<a name="changing-the-version-on-a-function"></a>

對於函數，版本會透過函數物件上的 `functionVersion` 欄位指定。若要更新版本，可直接更新 `functionVersion`。*注意：*目前只有 `2018-05-29` 支援函數。

下面是可更新現有函數版本的 CLI 命令範例：

```
aws appsync update-function \
--api-id REPLACE_WITH_API_ID \
--function-id REPLACE_WITH_FUNCTION_ID \
--data-source-name "PostTable" \
--function-version "2018-05-29" \
--request-mapping-template "{...}" \
--response-mapping-template "\$util.toJson(\$ctx.result)"
```

 **注意：**建議省略要求映射範本的版本欄位，因為其不會獲得接收。如果您在函數要求映射範本內指定版本，`functionVersion` 欄位的值將覆寫此版本值。

## 2018-05-29
<a name="aws-appsync-resolver-mapping-template-version-2018-05-29"></a>

### 行為變更
<a name="behavior-change"></a>
+ 如果資料來源呼叫結果是 `null`，回應映射範本將會執行。
+ 如果資料來源呼叫產生錯誤，您現在要負責處理錯誤，而回應映射範本評估結果將**一律**置放在 GraphQL 回應 `data` 區塊中。

### 推理
<a name="reasoning"></a>
+ `null` 呼叫結果具有意義，而且在某些應用程式使用案例中，我們可能希望以自訂方式處理 `null` 結果。例如，應用程式可以檢查記錄是否存在於 Amazon DynamoDB 資料表，以便執行一些授權檢查。在這種情況下，`null` 呼叫結果就能表示使用者應未獲得授權。執行回應映射範本現在會提供引發關於未經授權錯誤的能力。這個行為能為 API 設計師提供更好的控制功能。

假設我們使用下列的回應映射範本：

```
$util.toJson($ctx.result)
```

過去使用 `2017-02-28` 時，如果 `$ctx.result` 傳回 Null，回應映射範本將不會執行。現在使用 `2018-05-29` 時，我們可以處理此案例。例如，我們可以選擇引發授權錯誤如下：

```
# throw an unauthorized error if the result is null
#if ( $util.isNull($ctx.result) )
    $util.unauthorized()
#end
$util.toJson($ctx.result)
```

 **注意：**從資料來源發出的錯誤有時並不嚴重，或甚至早有預期，這說明了為什麼回應映射範本應該可靈活處理呼叫錯誤，並決定是否予以忽略、重新引發，或是擲出不同的錯誤。

假設我們使用下列的回應映射範本：

```
$util.toJson($ctx.result)
```

過去使用 `2017-02-28` 時，如果發生呼叫錯誤，回應映射範本將會進行評估，而且結果會自動放置在 GraphQL 回應的 `errors` 區塊。現在使用 `2018-05-29` 時，我們可以選擇如何處理錯誤、重新引發錯誤、引發不同的錯誤，或在傳回資料時附加該錯誤。

### 再次引發呼叫錯誤
<a name="re-raise-an-invocation-error"></a>

使用下列回應範本時，我們會引發資料來源發出的相同錯誤。

```
#if ( $ctx.error )
    $util.error($ctx.error.message, $ctx.error.type)
#end
$util.toJson($ctx.result)
```

如果發生呼叫錯誤 (例如，`$ctx.error` 存在時) 回應看起來將如下所示：

```
{
    "data": {
        "getPost": null
    },
    "errors": [
        {
            "path": [
                "getPost"
            ],
            "errorType": "DynamoDB:ConditionalCheckFailedException",
            "message": "Conditional check failed exception...",
            "locations": [
                {
                    "line": 5,
                    "column": 5
                }
            ]
        }
    ]
}
```

### 引發不同的錯誤
<a name="raise-a-different-error"></a>

使用下列回應範本時，我們會在處理資料來源發出錯誤之後引發自訂的錯誤。

```
#if ( $ctx.error )
    #if ( $ctx.error.type.equals("ConditionalCheckFailedException") )
        ## we choose here to change the type and message of the error for ConditionalCheckFailedExceptions
        $util.error("Error while updating the post, try again. Error: $ctx.error.message", "UpdateError")
    #else
        $util.error($ctx.error.message, $ctx.error.type)
    #end
#end
$util.toJson($ctx.result)
```

如果發生呼叫錯誤 (例如，`$ctx.error` 存在時) 回應看起來將如下所示：

```
{
    "data": {
        "getPost": null
    },
    "errors": [
        {
            "path": [
                "getPost"
            ],
            "errorType": "UpdateError",
            "message": "Error while updating the post, try again. Error: Conditional check failed exception...",
            "locations": [
                {
                    "line": 5,
                    "column": 5
                }
            ]
        }
    ]
}
```

### 附加錯誤至傳回資料
<a name="append-an-error-to-return-data"></a>

使用下列回應範本時，當透過回應傳回資料時，我們會同時附加由資料來源發出的相同錯誤。這也稱為部分回應。

```
#if ( $ctx.error )
    $util.appendError($ctx.error.message, $ctx.error.type)
    #set($defaultPost = {id: "1", title: 'default post'})
    $util.toJson($defaultPost)
#else
    $util.toJson($ctx.result)
#end
```

如果發生呼叫錯誤 (例如，`$ctx.error` 存在時) 回應看起來將如下所示：

```
{
    "data": {
        "getPost": {
            "id": "1",
            "title: "A post"
        }
    },
    "errors": [
        {
            "path": [
                "getPost"
            ],
            "errorType": "ConditionalCheckFailedException",
            "message": "Conditional check failed exception...",
            "locations": [
                {
                    "line": 5,
                    "column": 5
                }
            ]
        }
    ]
}
```

#### 從 *2017-02-28* 遷移到 *2018-05-29*
<a name="migrating-from-2017-02-28-to-2018-05-29"></a>

從 **2017-02-28** 遷移到 **2018-05-29** 的過程相當簡單。變更在解析程式要求映射範本或函數版本物件上的版本欄位。不過，請注意，**2018-05-29** 的執行行為不同於 **2017-02-28**，其中變更已概述於[此處](#aws-appsync-resolver-mapping-template-version-2018-05-29)。

#### 保留 *2017-02-28* 到 *2018-05-29* 的相同執行行為
<a name="preserving-the-same-execution-behavior-from-2017-02-28-to-2018-05-29"></a>

在某些情況下，在執行 **2017-02-28** 版本控制的範本時，可以保留與 **2018-05-29** 版本相同的執行行為。

### 範例：DynamoDB PutItem
<a name="example-dynamodb-putitem"></a>

假設使用下列 **2017-02-28** DynamoDB PutItem 要求範本：

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "foo" : ... typed value,
        "bar" : ... typed value
    },
    "attributeValues" : {
        "baz" : ... typed value
    },
    "condition" : {
       ...
    }
}
```

並使用下列回應範本：

```
$util.toJson($ctx.result)
```

遷移到 **2018-05-29**，這些範本變更如下：

```
{
    "version" : "2018-05-29", ## Note the new 2018-05-29 version
    "operation" : "PutItem",
    "key": {
        "foo" : ... typed value,
        "bar" : ... typed value
    },
    "attributeValues" : {
        "baz" : ... typed value
    },
    "condition" : {
       ...
    }
}
```

而且回應範本變更如下：

```
## If there is a datasource invocation error, we choose to raise the same error
## the field data will be set to null.
#if($ctx.error)
  $util.error($ctx.error.message, $ctx.error.type, $ctx.result)
#end

## If the data source invocation is null, we return null.
#if($util.isNull($ctx.result))
  #return
#end

$util.toJson($ctx.result)
```

現在，錯誤處理將由您負責，我們選擇使用 `$util.error()` 引發從 DynamoDB 傳回的相同錯誤。您可以調整這個片段，將您的映射範本轉換成 **2018-05-29**，請注意，如果您使用不同的回應範本，則您必須處理執行行為變更。

### 範例：DynamoDB GetItem
<a name="example-dynamodb-getitem"></a>

根據下列 **2017-02-28** DynamoDB GetItem 請求範本：

```
{
    "version" : "2017-02-28",
    "operation" : "GetItem",
    "key" : {
        "foo" : ... typed value,
        "bar" : ... typed value
    },
    "consistentRead" : true
}
```

並使用下列回應範本：

```
## map table attribute postId to field Post.id
$util.qr($ctx.result.put("id", $ctx.result.get("postId")))

$util.toJson($ctx.result)
```

遷移到 **2018-05-29**，這些範本變更如下：

```
{
    "version" : "2018-05-29", ## Note the new 2018-05-29 version
    "operation" : "GetItem",
    "key" : {
        "foo" : ... typed value,
        "bar" : ... typed value
    },
    "consistentRead" : true
}
```

而且回應範本變更如下：

```
## If there is a datasource invocation error, we choose to raise the same error
#if($ctx.error)
  $util.error($ctx.error.message, $ctx.error.type)
#end

## If the data source invocation is null, we return null.
#if($util.isNull($ctx.result))
  #return
#end

## map table attribute postId to field Post.id
$util.qr($ctx.result.put("id", $ctx.result.get("postId")))

$util.toJson($ctx.result)
```

使用 **2017-02-28** 版本時，如果資料來源呼叫為 `null`，表示 DynamoDB 資料表中沒有符合索引鍵的項目，而回應映射範本將不會執行。這種做法應該適用於大部分的案例，但是如果您希望 `$ctx.result` 不要是 `null`，現在您必須負責處理該案例。

## 2017-02-28
<a name="aws-appsync-resolver-mapping-template-version-2017-02-28"></a>

### 特性
<a name="characteristics"></a>
+ 如果資料來源呼叫結果是 `null`，回應映射範本將**不會**執行。
+ 如果資料來源呼叫產生錯誤，您現在要負責處理錯誤，而回應映射範本會執行，且評估結果會置放在 GraphQL 回應 `errors.data` 區塊中。