

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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억)이며 소수점 이하 정확도는 5자리입니다.
+ **필터 정책 복잡도** - 필터 정책 복잡도에서 전체 값 조합이 **150**을 초과해서는 안 됩니다. 전체 조합을 계산하려면 필터 정책에 있는 각 어레이의 값의 개수를 곱합니다.
+ **키 수 제한** - 필터 정책에는 최대 **5**개의 키가 있을 수 있습니다.

****추가 고려 사항****
+ 필터 정책의 JSON에는 다음이 포함될 수 있습니다.
  + 인용 부호로 묶인 문자열
  + 숫자
  + 인용 부호 없는 키워드 `true`, `false` 및 `null`
+ Amazon SNS API를 사용하는 경우 필터 정책의 JSON을 유효한 **UTF-8** 문자열로 전달해야 합니다.
+ 필터 정책의 최대 크기는 **256KB**입니다.
+ 기본적으로 주제당 최대 **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는 데이터 유형이 Binary인 메시지 속성을 무시합니다.

**복잡성에 대한 정책 예제:**

다음 정책 예제에서 첫 번째 키에는 **3개의** 일치 연산자가 있고, 두 번째 키에는 **1개의** 일치 연산자가 있으며, 세 번째 키에는 **2개의** 일치 연산자가 있습니다.

```
{
   "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는 페이로드 기반 필터링을 위한 중첩된 필터 정책을 허용합니다.
+ 중첩된 정책의 경우 **리프 키**만 **5개의** 키 제한에 포함됩니다.

**키 제한에 대한 정책 예제:**

다음은 정책의 예제입니다.
+ 리프 키에는 `key_c` 및 `key_e` 등 두 가지가 있습니다.
+ `key_c`에는 중첩 수준이 **3**인 **4**개의 일치 연산자가 있고, `key_e`에는 중첩 수준이 **2**인 **3**개의 일치 연산자가 있습니다.

```
{
"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점 

   Anything-but: 1점 

  다음은 복잡성 계산의 예제입니다.

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