

# 使用对象键名筛选配置事件通知
<a name="notification-how-to-filtering"></a>

配置 Amazon S3 事件通知时，您必须指定哪些受支持的 Amazon S3 事件类型会导致 Amazon S3 发送通知。如果 S3 存储桶中发生了您未指定的事件类型，Amazon S3 不会发送通知。

您可以将通知配置为按对象的键名的前缀和后缀进行筛选。例如，您可以设置一个配置，以便仅在带有 "`.jpg`" 文件扩展名的图像文件添加到存储桶时收到通知。或者，您也可以设置一个配置，该配置仅在将带有前缀“`images/`”的对象添加到存储桶时将通知发送到 Amazon SNS 主题，同时将同一存储桶中带有前缀“`logs/`”的对象的通知发送到 AWS Lambda 函数。

**注意**  
通配符（"\$1"）不能在筛选条件中用作前缀或后缀。如果您的前缀或后缀包含空格，则必须将其替换为“\$1”字符。如果您在前缀或后缀的值中使用任何其他特殊字符，您必须以 [URL 编码（百分比编码）格式](https://en.wikipedia.org/wiki/Percent-encoding)输入它们。有关在事件通知的前缀或后缀中使用时必须转换为 URL 编码格式的特殊字符的完整列表，请参阅[安全字符](object-keys.md#object-key-guidelines-safe-characters)。

您可以在 Amazon S3 控制台中设置使用对象密钥名称过滤的通知配置。您可以直接通过 AWS SDK 或 REST API 使用 Amazon S3 API 来实现该操作。有关使用控制台 UI 在存储桶上设置通知配置的信息，请参阅[使用 Amazon S3 控制台启用和配置事件通知](enable-event-notifications.md)。

Amazon S3 在与存储桶关联的*通知*子资源中以 XML 形式存储通知配置，如 [使用 Amazon SQS、Amazon SNS 和 Lambda](how-to-enable-disable-notification-intro.md) 中所述。您使用 `Filter` XML 结构定义要按对象键名的前缀和后缀进行筛选的通知的规则。有关 `Filter` XML 结构的信息，请参阅 *Amazon Simple Storage Service API 参考*中的 [PUT Bucket 通知](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTnotification.html)。

使用 `Filter` 的通知配置无法定义采用重叠前缀、重叠后缀或前缀和后缀重叠的筛选规则。以下部分提供了使用对象键名称筛选的有效通知配置的示例。它们还包含由于前缀和后缀重叠而无效的通知配置的示例。

**Topics**
+ [采用对象键名筛选的有效通知配置的示例](#notification-how-to-filtering-example-valid)
+ [采用无效前缀和后缀重叠的通知配置的示例](#notification-how-to-filtering-examples-invalid)

## 采用对象键名筛选的有效通知配置的示例
<a name="notification-how-to-filtering-example-valid"></a>

以下通知配置包含用于标识 Amazon S3 的 Amazon SQS 队列以发布 `s3:ObjectCreated:Put` 类型的事件的队列配置。每当具有前缀 `images/` 和后缀 `jpg` 的对象被放置（PUT）到存储桶时，就会发布这些事件。

```
<NotificationConfiguration>
  <QueueConfiguration>
      <Id>1</Id>
      <Filter>
          <S3Key>
              <FilterRule>
                  <Name>prefix</Name>
                  <Value>images/</Value>
              </FilterRule>
              <FilterRule>
                  <Name>suffix</Name>
                  <Value>jpg</Value>
              </FilterRule>
          </S3Key>
     </Filter>
     <Queue>arn:aws:sqs:us-west-2:444455556666:s3notificationqueue</Queue>
     <Event>s3:ObjectCreated:Put</Event>
  </QueueConfiguration>
</NotificationConfiguration>
```

以下通知配置有多个非重叠前缀。该配置作出以下定义：`images/` 文件夹中针对 PUT 请求的通知进入队列 A，`logs/` 文件夹中针对 PUT 请求的通知进入队列 B。

```
<NotificationConfiguration>
  <QueueConfiguration>
     <Id>1</Id>
     <Filter>
            <S3Key>
                <FilterRule>
                    <Name>prefix</Name>
                    <Value>images/</Value>
                </FilterRule>
            </S3Key>
     </Filter>
     <Queue>arn:aws:sqs:us-west-2:444455556666:sqs-queue-A</Queue>
     <Event>s3:ObjectCreated:Put</Event>
  </QueueConfiguration>
  <QueueConfiguration>
     <Id>2</Id>
     <Filter>
            <S3Key>
                <FilterRule>
                    <Name>prefix</Name>
                    <Value>logs/</Value>
                </FilterRule>
            </S3Key>
     </Filter>
     <Queue>arn:aws:sqs:us-west-2:444455556666:sqs-queue-B</Queue>
     <Event>s3:ObjectCreated:Put</Event>
  </QueueConfiguration>
</NotificationConfiguration>
```

以下通知配置有多个非重叠后缀。该配置作出以下定义：所有新添加到存储桶的 `.jpg` 映像都由 Lambda cloud-function-A 处理，所有新添加的 `.png` 映像都由云函数 B 处理。`.png` 和 `.jpg` 后缀不重叠，即使它们有相同的最后一个字母也是如此。如果某个给定的字符串能够以这两个后缀结尾，则将它们视为重叠。一个字符串无法同时以 `.png` 和 `.jpg` 结尾，因此示例配置中的后缀不是重叠后缀。

```
<NotificationConfiguration>
  <CloudFunctionConfiguration>
     <Id>1</Id>
     <Filter>
            <S3Key>
                <FilterRule>
                    <Name>suffix</Name>
                    <Value>.jpg</Value>
                </FilterRule>
            </S3Key>
     </Filter>
     <CloudFunction>arn:aws:lambda:us-west-2:444455556666:cloud-function-A</CloudFunction>
     <Event>s3:ObjectCreated:Put</Event>
  </CloudFunctionConfiguration>
  <CloudFunctionConfiguration>
     <Id>2</Id>
     <Filter>
            <S3Key>
                <FilterRule>
                    <Name>suffix</Name>
                    <Value>.png</Value>
                </FilterRule>
            </S3Key>
     </Filter>
     <CloudFunction>arn:aws:lambda:us-west-2:444455556666:cloud-function-B</CloudFunction>
     <Event>s3:ObjectCreated:Put</Event>
  </CloudFunctionConfiguration>
</NotificationConfiguration>
```

使用 `Filter` 的通知配置不能使用重叠前缀为相同的事件类型定义筛选规则。只有在与后缀不重叠一起使用的重叠前缀时，他们才能这样做。以下示例配置显示了如何将使用通用前缀和非重叠后缀创建的对象传递到其他目标。

```
<NotificationConfiguration>
  <CloudFunctionConfiguration>
     <Id>1</Id>
     <Filter>
            <S3Key>
                <FilterRule>
                    <Name>prefix</Name>
                    <Value>images</Value>
                </FilterRule>
                <FilterRule>
                    <Name>suffix</Name>
                    <Value>.jpg</Value>
                </FilterRule>
            </S3Key>
     </Filter>
     <CloudFunction>arn:aws:lambda:us-west-2:444455556666:cloud-function-A</CloudFunction>
     <Event>s3:ObjectCreated:Put</Event>
  </CloudFunctionConfiguration>
  <CloudFunctionConfiguration>
     <Id>2</Id>
     <Filter>
            <S3Key>
                <FilterRule>
                    <Name>prefix</Name>
                    <Value>images</Value>
                </FilterRule>
                <FilterRule>
                    <Name>suffix</Name>
                    <Value>.png</Value>
                </FilterRule>
            </S3Key>
     </Filter>
     <CloudFunction>arn:aws:lambda:us-west-2:444455556666:cloud-function-B</CloudFunction>
     <Event>s3:ObjectCreated:Put</Event>
  </CloudFunctionConfiguration>
</NotificationConfiguration>
```

## 采用无效前缀和后缀重叠的通知配置的示例
<a name="notification-how-to-filtering-examples-invalid"></a>

大多数情况下，使用 `Filter` 的通知配置无法使用重叠前缀、重叠后缀或前缀和后缀的重叠组合为相同的事件类型定义筛选规则。只要后缀不重叠，您就可以采用重叠前缀。有关示例，请参阅 [使用对象键名筛选配置事件通知](#notification-how-to-filtering)。

您可以将重叠对象键名筛选用于不同的事件类型。例如，您可以创建一个通知配置，该配置将前缀 `image/` 用于 `ObjectCreated:Put` 事件类型并将前缀 `image/` 用于 `ObjectRemoved:*` 事件类型。

在使用 Amazon S3 控制台或 API 时，如果您尝试保存具有对相同的活动类型无效的重叠名称筛选的通知配置，则会出现错误。此部分显示了因重叠名称筛选而无效的通知配置的示例。

任何现有通知配置规则都被假定为具有与任何其他前缀和后缀分别匹配的默认前缀和后缀。由于具有重叠前缀，以下通知配置无效。具体来说，根前缀与任何其他前缀重叠。（如果在此示例中使用后缀而不是前缀，则会发生同样的情况。根后缀与任何其他后缀重叠。）

```
<NotificationConfiguration>
     <TopicConfiguration>
         <Topic>arn:aws:sns:us-west-2:444455556666:sns-notification-one</Topic>
         <Event>s3:ObjectCreated:*</Event>
    </TopicConfiguration>
    <TopicConfiguration>
         <Topic>arn:aws:sns:us-west-2:444455556666:sns-notification-two</Topic>
         <Event>s3:ObjectCreated:*</Event>
         <Filter>
             <S3Key>
                 <FilterRule>
                     <Name>prefix</Name>
                     <Value>images</Value>
                 </FilterRule>
            </S3Key>
        </Filter>
    </TopicConfiguration>             
</NotificationConfiguration>
```

由于具有重叠后缀，以下通知配置无效。如果某个给定的字符串能够以这两个后缀结尾，则将它们视为重叠。字符串可以用 `jpg` 和 `pg` 结尾。因此，后缀会重叠。（前缀也是如此。如果给定字符串能够以两个前缀开头，则认为这两个前缀是重叠的。

```
 <NotificationConfiguration>
     <TopicConfiguration>
         <Topic>arn:aws:sns:us-west-2:444455556666:sns-topic-one</Topic>
         <Event>s3:ObjectCreated:*</Event>
         <Filter>
             <S3Key>
                 <FilterRule>
                     <Name>suffix</Name>
                     <Value>jpg</Value>
                 </FilterRule>
            </S3Key>
        </Filter>
    </TopicConfiguration>
    <TopicConfiguration>
         <Topic>arn:aws:sns:us-west-2:444455556666:sns-topic-two</Topic>
         <Event>s3:ObjectCreated:Put</Event>
         <Filter>
             <S3Key>
                 <FilterRule>
                     <Name>suffix</Name>
                     <Value>pg</Value>
                 </FilterRule>
            </S3Key>
        </Filter>
    </TopicConfiguration>
</NotificationConfiguration
```

由于具有重叠前缀和后缀，以下通知配置无效。

```
<NotificationConfiguration>
     <TopicConfiguration>
         <Topic>arn:aws:sns:us-west-2:444455556666:sns-topic-one</Topic>
         <Event>s3:ObjectCreated:*</Event>
         <Filter>
             <S3Key>
                 <FilterRule>
                     <Name>prefix</Name>
                     <Value>images</Value>
                 </FilterRule>
                 <FilterRule>
                     <Name>suffix</Name>
                     <Value>jpg</Value>
                 </FilterRule>
            </S3Key>
        </Filter>
    </TopicConfiguration>
    <TopicConfiguration>
         <Topic>arn:aws:sns:us-west-2:444455556666:sns-topic-two</Topic>
         <Event>s3:ObjectCreated:Put</Event>
         <Filter>
             <S3Key>
                 <FilterRule>
                     <Name>suffix</Name>
                     <Value>jpg</Value>
                 </FilterRule>
            </S3Key>
        </Filter>
    </TopicConfiguration>
</NotificationConfiguration>
```