

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

# Amazon SNS 中的篩選政策限制條件
<a name="subscription-filter-policy-constraints"></a>

當您在 Amazon SNS 中設定篩選政策時，請注意幾個重要規則。這些規則有助於確保有效套用篩選政策，同時維持系統效能和相容性。

## 常見政策限制條件
<a name="subscription-filter-policy-common-constraints"></a>

在 Amazon SNS 中設定篩選政策時，請遵循下列重要規則，以確保它們有效運作，同時維持系統效能和相容性：
+ **字串比對** – 對於篩選政策中的字串比對，比較區分大小寫。
+ **數值比對** – 對於數值比對，值的範圍可以從 -109 到 109 (-10 億到 10 億），在小數點後有五位數的準確性。
+ **篩選政策複雜性** – 篩選政策中值的總組合不得超過 **150**。若要計算總組合，請乘以篩選政策中每個陣列的值數目。
+ **金鑰數量限制** – 篩選政策最多可有**五個**金鑰。

****其他考量事項****
+ 篩選政策的 JSON 可以包含下列項目：
  + 用引號括住的字串
  + 數字
  + 關鍵字 `true`、`false` 和 `null` (不含引號)
+ 使用 Amazon SNS API 時，您必須傳遞篩選條件政策的 JSON，做為有效的 **UTF-8 **字串。
+ 篩選條件政策的大小上限為 **256 KB**。
+ 根據預設，每個主題最多可有 **200 個**篩選政策，每個 AWS 帳戶最多可有 **10，000 個**篩選政策。

  此政策限制不會阻止使用 [https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) API 建立 Amazon SQS 佇列訂閱。但是，當您在 `Subscribe` API 呼叫 (或 [https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html) API 呼叫) 中連接篩選條件政策時，它將會失敗。

  若要提升配額，請使用 [AWS Service Quotas](https://docs.aws.amazon.com/servicequotas/latest/userguide/intro.html)。

## 以屬性為基礎的篩選政策限制條件
<a name="subscription-filter-policy-attribute-constraints"></a>

以屬性為基礎的篩選是預設選項。[https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html#API_SetSubscriptionAttributes_RequestParameters](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html#API_SetSubscriptionAttributes_RequestParameters) 在訂閱中設定為 `MessageAttributes`。
+ Amazon SNS 不接受以屬性為基礎的巢狀篩選政策。
+ Amazon SNS 只將政策屬性與具有下列資料類型的訊息屬性做比較：
  + `String`
  + `String.Array`
**重要**  
在 Amazon SNS 中使用屬性型篩選時，您必須雙逸出某些特殊字元，特別是：  
雙引號 (")
反斜線 ()
如果無法雙逸出這些字元，將導致篩選條件政策與已發佈訊息的屬性不相符，且通知將不會傳送。

**其他考量事項**
+ 不建議在陣列中傳遞物件，因為它可能會因為屬性型篩選不支援的巢狀而產生非預期的結果。為巢狀政策使用以承載為基礎的篩選條件。
+ `Number` 支援數值屬性值。
+ Amazon SNS 會使用二進位資料類型忽略訊息屬性。

**複雜性政策範例：**

在下列政策範例中，第一個索引鍵有**三個**相符運算子，第二個則**有一個**相符運算子，第三個則有兩個****相符運算子。

```
{
   "key_a": ["value_one", "value_two", "value_three"],
   "key_b": ["value_one"],
   "key_c": ["value_one", "value_two"]
}
```

總組合的計算方式為篩選政策中每個索引鍵的相符運算子數目乘積：

```
3(match operators of key_a) 
x 1(match operators of key_b) 
x 2(match operators of key_c) 
= 6
```

## 以承載為基礎的篩選政策限制條件
<a name="subscription-filter-policy-payload-constraints"></a>

若要從以屬性為基礎的篩選 (預設) 切換為以承載為基礎的篩選，您必須在訂閱中將 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamPoolCidr.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamPoolCidr.html) 設為 `MessageBody`。
+ Amazon SNS 接受以承載為基礎的巢狀篩選政策。
+ 對於巢狀政策，只有**分葉索引鍵**會計入**五個**索引鍵限制。

**金鑰限制的政策範例：**

在下列政策範例中：
+ 有兩種分葉索引鍵： `key_c`和 `key_e`。
+ `key_c` 有**四個**巢狀層級為 **3** 的相符運算子，`key_e`以及**三個**巢狀層級為 **2** 的相符運算子。

```
{
"key_a": {
    "key_b": {
        "key_c": ["value_one", "value_two", "value_three", "value_four"]
        }
    },
"key_d": {
    "key_e": ["value_one", "value_two", "value_three"]
    }
}
```

總組合的計算方式為相符運算子數量的乘積，以及篩選政策中每個索引鍵的巢狀層級：

```
4(match operators of key_c) 
x 3(nested level of key_c) 
x 3(match operators of key_e) 
x 2(nested level of key_e) 
= 72
```

## 萬用字元模式使用準則
<a name="filter-policy-constraints-wildcard"></a>

 當您註冊包含萬用字元的篩選政策時，Amazon SQS 會實作 的保護，以確保不會建立過於複雜的篩選政策，因為這會影響您的應用程式效能。

**模式結構**

欄位包含一或多個模式。下列範例顯示使用兩種模式的欄位：

```
{
    "greeting": [
      {"anything-but": {"prefix": "Hello"}},
      {"wildcard": "H*"}
    ] // 2 patterns
  }
```

**複雜性規則**
+  所有欄位的總萬用字元複雜性不得超過 100 點 
+  每個模式最多 3 個萬用字元 

**複雜性計算**
+  欄位複雜性 = `(Sum of pattern points)` × `(Number of patterns)` 
+ 模式點：

   單一萬用字元：1 點 

   多個萬用字元：每個 3 點 

   任何項目：1 點 

  以下是複雜度計算的範例：

  ```
  {
    "filename": [
      {"wildcard": "*.txt"},     // 1 point
      {"wildcard": "log*"}      // 1 point
    ]                           // Total: (1 + 1) × 2 = 4 points
  }
  ```