

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用高级事件选择器筛选数据事件
<a name="filtering-data-events"></a>

本节介绍如何使用高级事件选择器来创建细粒度选择器以记录数据事件，从而通过仅记录感兴趣的特定数据事件来帮助您控制成本。

例如：
+ 您可以通过在 `eventName` 字段上添加筛选条件器来包含或排除特定 API 调用。
+ 您可以通过在 `resources.ARN` 字段上添加筛选条件来包含或排除特定资源的日志记录。例如，如果您正在记录 S3 数据事件，则可以对跟踪排除 S3 存储桶的日志记录。
+ 通过在 `readOnly` 字段上添加筛选条件，您可以选择仅记录只写事件或只读事件。

下表描述了筛选数据事件时支持的字段。有关每种 CloudTrail 事件类型支持的字段列表，请参阅 *Amazon CloudTrail API 参考[AdvancedEventSelector](https://docs.amazonaws.cn/awscloudtrail/latest/APIReference/API_AdvancedEventSelector.html)*中的。


| 字段 | 必需 | 有效运算符 | Description | 
| --- | --- | --- | --- | 
| **`eventCategory` ** | 是 | `Equals` | 此字段设置为 `Data` 以记录数据事件。 | 
| **`resources.type`** | 是 | `Equals` | 此字段用于选择要为其记录数据事件的资源类型。[数据事件](logging-data-events-with-cloudtrail.md#logging-data-events)表显示了可能值。 | 
| **`readOnly`** | 否 | `Equals` | 这是一个可选字段，用于根据 `readOnly` 值包含或排除数据事件。`true` 的值仅记录读取事件。`false` 的值仅记录写入事件。如果不添加此字段，则会同时 CloudTrail 记录读取和写入事件。 | 
| **`eventName`** | 否 | `EndsWith`<br />`Equals`<br />`NotEndsWith`<br />`NotEquals`<br />`NotStartsWith`<br />`StartsWith` | 这是一个可选字段，用于筛选或筛选出记录到的任何数据事件 CloudTrail，例如或。`PutBucket` `GetSnapshotBlock`<br />如果您使用的是 Amazon CLI，则可以通过用逗号分隔每个值来指定多个值。<br />如果您使用的是控制台，则可以通过为要筛选的每个 `eventName` 值创建一个条件来指定多个值。 | 
| **`resources.ARN`** | 否 | `EndsWith`<br />`Equals`<br />`NotEndsWith`<br />`NotEquals`<br />`NotStartsWith`<br />`StartsWith` | 这是一个可选字段，用于通过提供 `resources.ARN` 来排除或包含特定资源的数据事件。您可以将任意运算符与 `resources.ARN` 结合使用，但是如果使用 `Equals` 或 `NotEquals`，则值必须与您指定的 `resources.type` 的有效资源的 ARN 完全匹配。要记录特定 S3 桶中所有对象的所有数据事件，请使用 `StartsWith` 运算符，并且仅包含存储桶 ARN 作为匹配值。<br />如果您使用的是 Amazon CLI，则可以通过用逗号分隔每个值来指定多个值。<br />如果您使用的是控制台，则可以通过为要筛选的每个 `resources.ARN` 值创建一个条件来指定多个值。 | 
| **`eventSource`** | 否 | `EndsWith`<br />`Equals`<br />`NotEndsWith`<br />`NotEquals`<br />`NotStartsWith`<br />`StartsWith` | 可以使用它来包含或排除特定的事件源。`eventSource` 通常为服务名称的简短形式，不含空格但会加上 `.amazonaws.com`。例如，可以设置 `eventSource` `Equals` `ec2.amazonaws.com`，以便仅记录 Amazon EC2 数据事件。 | 
| **`eventType`** | 否 | `EndsWith`<br />`Equals`<br />`NotEndsWith`<br />`NotEquals`<br />`NotStartsWith`<br />`StartsWith` | 要包括或排除的 [eventType](cloudtrail-event-reference-record-contents.md#ct-event-type)。例如，可以将此字段设置为 `NotEquals` `AwsServiceEvent`，以排除 [Amazon Web Services 服务 事件](non-api-aws-service-events.md)。 | 
| **`sessionCredentialFromConsole`** | 否 | `Equals`<br />`NotEquals` | 包括或排除源自 Amazon Web Services 管理控制台 会话的事件。可以将此字段设置为 `Equals` 或 `NotEquals` 且值为 `true`。 | 
| **`userIdentity.arn`** | 否 | `EndsWith`<br />`Equals`<br />`NotEndsWith`<br />`NotEquals`<br />`NotStartsWith`<br />`StartsWith` | 包含或排除特定 IAM 身份所采取操作的事件。有关更多信息，请参阅 [CloudTrail userIdentity 元素](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)。 | 

要使用 CloudTrail 控制台记录数据事件，请在创建或更新跟踪时选择**数据事件**选项，然后选择感兴趣的**资源类型**。[数据事件](logging-data-events-with-cloudtrail.md#logging-data-events)表显示了您可以在 CloudTrail 控制台上选择的可能资源类型。

要使用记录数据事件 Amazon CLI，请将`--advanced-event-selector`参数配置为将`eventCategory`等于，将`resources.type`值设置为等于`Data`且值等于您要记录数据事件的资源类型值。[数据事件](logging-data-events-with-cloudtrail.md#logging-data-events)表列出了可用的资源类型。

例如，如果您想记录所有 Cognito 身份池的数据事件，则可以将 `--advanced-event-selectors` 参数配置为如下所示：

```
--advanced-event-selectors '[
    {
       "Name": "Log Cognito data events on Identity pools",
       "FieldSelectors": [
         { "Field": "eventCategory", "Equals": ["Data"] },
         { "Field": "resources.type", "Equals": ["AWS::Cognito::IdentityPool"] }
       ]
     }
]'
```

上述示例记录了身份池上的所有 Cognito 数据事件。您可以进一步优化高级事件选择器来筛选 `eventName`、`readOnly` 和 `resources.ARN` 字段，以记录感兴趣的特定事件或排除不感兴趣的事件。

您可以配置高级事件选择器来根据多个字段筛选数据事件。例如，您可以将高级事件选择器配置为记录所有 Amazon S3 `PutObject` 和 `DeleteObject` API 调用，但排除特定 S3 存储桶的事件日志记录，如以下示例所示。将 {{amzn-s3-demo-bucket}} 替换为您的存储桶的名称。

```
--advanced-event-selectors
'[
  {
    "Name": "Log PutObject and DeleteObject events for all but one bucket",
    "FieldSelectors": [
      { "Field": "eventCategory", "Equals": ["Data"] },
      { "Field": "resources.type", "Equals": ["AWS::S3::Object"] },
      { "Field": "eventName", "Equals": ["PutObject","DeleteObject"] },
      { "Field": "resources.ARN", "NotStartsWith": ["arn:aws:s3:::{{amzn-s3-demo-bucket}}/"] }
    ]
  }
]'
```

您还可以为一个字段包含多个条件。有关如何评估多个条件的信息，请参阅[如何 CloudTrail 评估一个字段的多个条件](#filtering-data-events-conditions)。

您可以使用高级事件选择器来同时记录管理事件和数据事件。要记录多种资源类型的数据事件，请为要记录数据事件的每种资源类型添加一个字段选择器语句。

**注意**  
跟踪可以使用基本事件选择器或高级事件选择器，但不能同时使用两者。如果将高级事件选择器应用于跟踪，则所有现有的基本事件选择器都将被覆盖。  
选择器不支持使用通配符，例如 `*`。要将多个值与单个条件匹配，可以使用 `StartsWith`、`EndsWith`、`NotStartsWith` 或 `NotEndsWith` 明确匹配事件字段的开头或结尾。

**Topics**
+ [如何 CloudTrail 评估一个字段的多个条件](#filtering-data-events-conditions)
+ [Amazon CLI 筛选数据事件的示例](#filtering-data-events-examples)

## 如何 CloudTrail 评估一个字段的多个条件
<a name="filtering-data-events-conditions"></a>

对于高级事件选择器，按 CloudTrail 如下方式计算字段的多个条件：
+ DESELECT 运算符用 AND 连接在一起。如果满足任何 DESELECT 运算符条件，则不会传递事件。这些是高级事件选择器的有效 DESELECT 运算符：
  + `NotEndsWith`
  + `NotEquals`
  + `NotStartsWith`
+ SELECT 运算符用 OR 连接在一起。这些是高级事件选择器的有效 SELECT 运算符：
  + `EndsWith`
  + `Equals`
  + `StartsWith`
+ SELECT 和 DESELECT 运算符的组合遵循上述规则，并且两组以 AND 连接在一起。

### 显示 `resources.ARN` 字段的多个条件的示例
<a name="filtering-data-events-conditions-ex"></a>

以下示例事件选择器语句收集 `AWS::S3::Object` 资源类型的数据事件，并对 `resources.ARN` 字段应用多个条件。

```
{
    "Name": "S3Select",
    "FieldSelectors": [
      {
        "Field": "eventCategory",
        "Equals": [
          "Data"
        ]
      },
      {
        "Field": "resources.type",
        "Equals": [
          "AWS::S3::Object"
        ]
      },
      {
        "Field": "resources.ARN",
        "Equals": [
          "arn:aws:s3:::amzn-s3-demo-bucket/object1"
        ],
        "StartsWith": [
          "arn:aws:s3:::amzn-s3-demo-bucket/"
        ],
        "EndsWith": [
          "object3"
        ],
        "NotStartsWith": [
          "arn:aws:s3:::amzn-s3-demo-bucket/deselect"
        ],
        "NotEndsWith": [
          "object5"
        ],
        "NotEquals": [
          "arn:aws:s3:::amzn-s3-demo-bucket/object6"
        ]
      }
    ]
  }
```

在前面的示例中，在以下情况下，将传输 `AWS::S3::Object` 资源的 Amazon S3 数据事件：

1. 这些 DESELECT 运算符条件均不满足：
   + `resources.ARN` 字段 `NotStartsWith` 的值为 `arn:aws:s3:::amzn-s3-demo-bucket/deselect`
   + `resources.ARN` 字段 `NotEndsWith` 的值为 `object5`
   + `resources.ARN` 字段 `NotEquals` 的值为 `arn:aws:s3:::amzn-s3-demo-bucket/object6`

1. 至少满足以下 SELECT 运算符条件之一：
   + `resources.ARN` 字段 `Equals` 的值为 `arn:aws:s3:::amzn-s3-demo-bucket/object1`
   + `resources.ARN` 字段 `StartsWith` 的值为 `arn:aws:s3:::amzn-s3-demo-bucket/`
   + `resources.ARN` 字段 `EndsWith` 的值为 `object3`

基于评估逻辑：

1. 之所以传输 `amzn-s3-demo-bucket/object1` 的数据事件，是因为它与 `Equals` 运算符的值匹配，而与 `NotStartsWith`、`NotEndsWith` 和 `NotEquals` 运算符的任何值都不匹配。

1. 之所以传输 `amzn-s3-demo-bucket/object2` 的数据事件，是因为它与 `StartsWith` 运算符的值匹配，而与 `NotStartsWith`、`NotEndsWith` 和 `NotEquals` 运算符的任何值都不匹配。

1. 之所以传输 `amzn-s3-demo-bucket1/object3` 的数据事件，是因为它与 `EndsWith` 运算符匹配，而与 `NotStartsWith`、`NotEndsWith` 和 `NotEquals` 运算符的任何值都不匹配。

1. 之所以传输 `arn:aws:s3:::amzn-s3-demo-bucket/deselectObject4` 的数据事件，是因为它与 `NotStartsWith` 的条件匹配，也与 `StartsWith` 运算符的条件匹配。

1. 之所以传输 `arn:aws:s3:::amzn-s3-demo-bucket/object5` 的数据事件，是因为它与 `NotEndsWith` 的条件匹配，也与 `StartsWith` 运算符的条件匹配。

1. 之所以不传输 `arn:aws:s3:::amzn-s3-demo-bucket/object6` 的数据事件，是因为它与 `NotEquals` 运算符的条件匹配，也与 `StartsWith` 运算符的条件匹配。

## Amazon CLI 筛选数据事件的示例
<a name="filtering-data-events-examples"></a>

本节提供了 Amazon CLI 一些示例，说明如何筛选不同字段上的数据事件。有关其他 Amazon CLI 示例，请参见[使用高级事件选择器记录跟踪的数据事件](logging-data-events-with-cloudtrail.md#creating-data-event-selectors-advanced)和。

有关如何使用控制台记录数据事件的信息，请参阅[使用记录数据事件 Amazon Web Services 管理控制台](logging-data-events-with-cloudtrail.md#logging-data-events-console)。

**Topics**
+ [示例 1：根据 `eventName` 字段进行筛选](#filtering-data-events-eventname)
+ [示例 2：根据 `resources.ARN` 和 `userIdentity.arn` 字段进行筛选](#filtering-data-events-useridentityarn)
+ [示例 3：筛选`resources.type`和`eventName`字段以排除由 Amazon S3 DeleteObjects 事件删除的单个对象](#filtering-data-events-deleteobjects)

### 示例 1：根据 `eventName` 字段进行筛选
<a name="filtering-data-events-eventname"></a>

在第一个示例中，跟踪的 `--advanced-event-selectors` 配置为仅针对通用存储桶中的 Amazon S3 对象记录 `GetObject`、`PutObject` 和 `DeleteObject` API 调用。

```
aws cloudtrail put-event-selectors \
--trail-name {{trailName}} \
--advanced-event-selectors '[
  {
    "Name": "Log GetObject, PutObject and DeleteObject S3 data events",
    "FieldSelectors": [
      { "Field": "eventCategory", "Equals": ["Data"] },
      { "Field": "resources.type", "Equals": ["AWS::S3::Object"] },
      { "Field": "eventName", "Equals": ["GetObject","PutObject","DeleteObject"] }
    ]
  }
]'
```

下一个示例创建了一个新的事件数据存储，用于记录 EBS Direct 的数据事件， APIs 但不包括 `ListChangedBlocks` API 调用。您可以使用 [https://docs.amazonaws.cn/cli/latest/reference/cloudtrail/update-event-data-store.html](https://docs.amazonaws.cn/cli/latest/reference/cloudtrail/update-event-data-store.html) 命令来更新现有事件数据存储库。

```
aws cloudtrail create-event-data-store \
--name "{{eventDataStoreName}}"
--advanced-event-selectors '[
    {
        "Name": "Log all EBS Direct API data events except ListChangedBlocks",
        "FieldSelectors": [
            { "Field": "eventCategory", "Equals": ["Data"] },
            { "Field": "resources.type", "Equals": ["AWS::EC2::Snapshot"] },
            { "Field": "eventName", "NotEquals": ["ListChangedBlocks"] }
         ]
    }
]'
```

### 示例 2：根据 `resources.ARN` 和 `userIdentity.arn` 字段进行筛选
<a name="filtering-data-events-useridentityarn"></a>

以下示例展示了如何包含特定通用 S3 存储桶中所有 Amazon S3 对象的所有数据事件，并排除 `bucket-scanner-role` `userIdentity` 生成的事件。S3 事件在 `resources.type` 字段中的值为 `AWS::S3::Object`。由于 S3 对象和 S3 存储桶的 ARN 值略有不同，因此必须为 `resources.ARN` 添加 `StartsWith` 运算符。

```
aws cloudtrail put-event-selectors \
--trail-name {{trailName}} \
--advanced-event-selectors \
'[
    {
        "Name": "S3EventSelector",
        "FieldSelectors": [
            { "Field": "eventCategory", "Equals": ["Data"] },
            { "Field": "resources.type", "Equals": ["AWS::S3::Object"] },
            { "Field": "resources.ARN", "StartsWith": ["arn:{{partition}}:s3:::{{amzn-s3-demo-bucket}}/"] },
            { "Field": "userIdentity.arn", "NotStartsWith": ["arn:aws:sts::123456789012:assumed-role/bucket-scanner-role"]}
        ]
    }
]'
```

### 示例 3：筛选`resources.type`和`eventName`字段以排除由 Amazon S3 DeleteObjects 事件删除的单个对象
<a name="filtering-data-events-deleteobjects"></a>

以下示例展示了如何包含特定通用 Amazon S3 存储桶中所有 Amazon S3 对象的所有数据事件，并排除 `DeleteObject` 操作删除的各个事件。S3 事件在 `resources.type` 字段中的值为 `AWS::S3::Object`。事件名称的值是 `DeleteObject`。

```
aws cloudtrail put-event-selectors \
--trail-name {{trailName}} \
--advanced-event-selectors \

{
    "Name": "Exclude Events for DeleteObject operation",
    "FieldSelectors": [
      {
        "Field": "eventCategory",
        "Equals": [
          "Data"
        ]
      },
      {
        "Field": "resources.type",
        "Equals": [
          "AWS::S3::Object"
        ]
      },
      {
        "Field": "eventName",
        "NotEquals": [
          "DeleteObject"
        ]
      }
    ]
  },
  {
    "Name": "Exclude DeleteObject Events for individual objects deleted by DeleteObjects Operation",
    "FieldSelectors": [
      {
        "Field": "eventCategory",
        "Equals": [
          "Data"
        ]
      },
      {
        "Field": "resources.type",
        "Equals": [
          "AWS::S3::Object"
        ]
      },
      {
        "Field": "eventName",
        "Equals": [
          "DeleteObject"
        ]
      },
      {
        "Field": "eventType",
        "NotEquals": [
          "AwsServiceEvent"
        ]
      }
    ]
  }
] (edited)
```