Filtering data events by using advanced event selectors
This section describes how you can use advanced event selectors to create fine-grained selectors for logging data events, which can help you control costs by only logging the specific data events of interest.
For example:
-
You can include or exclude specific API calls by adding a filter on the
eventNamefield. -
You can include or exclude logging for specific resources by adding a filter on the
resources.ARNfield. For example, if you were logging S3 data events, you could exclude logging for the S3 bucket for your trail. -
You can choose to log only write-only events or read-only events by adding a filter on the
readOnlyfield.
The following table describes the supported fields for filtering data events. For a list of supported fields for each CloudTrail event type, see AdvancedEventSelector in the AWS CloudTrail API Reference.
| Field | Required | Valid operators | Description |
|---|---|---|---|
|
|
Yes |
|
This field is set to |
|
|
Yes |
|
This field is used to select the resource type for which you want to log data events. The Data events table shows the possible values. |
|
|
No |
|
This is an optional field used to include or exclude data events based on the |
|
|
No |
|
This is an optional filed used to filter in or filter out any data
event logged to CloudTrail, such as If you're using the AWS CLI, you can specify multiple values by separating each value with a comma. If you're using the console, you can specify multiple values by creating a condition for each |
|
|
No |
|
This is an optional field used to exclude or include data events
for a specific resource by providing the If you're using the AWS CLI, you can specify multiple values by separating each value with a comma. If you're using the console, you can specify multiple values by creating a condition for each |
|
|
No |
|
You can use it to include or exclude specific event sources. The |
|
|
No |
|
The eventType to include or exclude. For example, you can set this field to
|
|
|
No |
|
Include or exclude events originating from an AWS Management Console session.
This field can be set to |
|
|
No |
|
Include or exclude events for actions taken by specific IAM identities. For more information, see CloudTrail userIdentity element. |
To log data events using the CloudTrail console, you choose the Data events option and then select the Resource type of interest when you are creating or updating a trail or event data store. The Data events table shows the possible resource types you can choose on the CloudTrail console.
To log data events with the AWS CLI, configure the
--advanced-event-selector parameter to set the
eventCategory equal to Data and the
resources.type value equal to the resource type value for which you
want to log data events. The Data
events table lists the available resource types.
For example, if you wanted to log data events for all Cognito Identity pools, you’d
configure the --advanced-event-selectors parameter to look like
this:
--advanced-event-selectors '[ { "Name": "Log Cognito data events on Identity pools", "FieldSelectors": [ { "Field": "eventCategory", "Equals": ["Data"] }, { "Field": "resources.type", "Equals": ["AWS::Cognito::IdentityPool"] } ] } ]'
The preceding example logs all Cognito data events on Identity pools. You can further
refine the advanced event selectors to filter on the eventName,
readOnly, and resources.ARN fields to log specific events
of interest or exclude events that aren’t of interest.
You can configure advanced event selectors to filter data events based on multiple
fields. For example, you can configure advanced event selectors to log all Amazon S3
PutObject and DeleteObject API calls
but exclude event logging for a specific S3 bucket as shown in the following example.
Replace amzn-s3-demo-bucket with the name of your 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/"] } ] } ]'
You can also include multiple conditions for a field. For information on how multiple conditions are evaluated, see How CloudTrail evaluates multiple conditions for a field.
You can use advanced event selectors to log both management and data events. To log data events for multiple resource types, add a field selector statement for each resource type that you want to log data events for.
Note
Trails can use either basic event selectors or advanced event selectors, but not both. If you apply advanced event selectors to a trail, any existing basic event selectors are overwritten.
Selectors don't support the use of wildcards like * . To match multiple values with a single condition,
you may use StartsWith, EndsWith, NotStartsWith, or NotEndsWith to explicitly match the beginning or end of the event field.
Topics
How CloudTrail evaluates multiple conditions for a field
For advanced event selectors, CloudTrail evaluates multiple conditions for a field as follows:
-
DESELECT operators are AND'd together. If any of the DESELECT operator conditions are met, the event is not delivered. These are the valid DESELECT operators for advanced event selectors:
-
NotEndsWith -
NotEquals -
NotStartsWith
-
-
SELECT operators are OR'd together. These are the valid SELECT operators for advanced event selectors:
-
EndsWith -
Equals -
StartsWith
-
-
Combinations of SELECT and DESELECT operators follow the above rules and both groups are AND'd together.
Example showing multiple conditions for the resources.ARN field
The following example event selector statement collects data events for the AWS::S3::Object resource type
and applies multiple conditions on the resources.ARN field.
{ "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" ] } ] }
In the preceding example, Amazon S3 data events for the AWS::S3::Object resource will be delivered if:
-
None of these DESELECT operator conditions are met:
-
the
resources.ARNfieldNotStartsWiththe valuearn:aws:s3:::amzn-s3-demo-bucket/deselect -
the
resources.ARNfieldNotEndsWiththe valueobject5 -
the
resources.ARNfieldNotEqualsthe valuearn:aws:s3:::amzn-s3-demo-bucket/object6
-
-
At least one of these SELECT operator conditions is met:
-
the
resources.ARNfieldEqualsthe valuearn:aws:s3:::amzn-s3-demo-bucket/object1 -
the
resources.ARNfieldStartsWiththe valuearn:aws:s3:::amzn-s3-demo-bucket/ -
the
resources.ARNfieldEndsWiththe valueobject3
-
Based on the evaluation logic:
-
Data events for
amzn-s3-demo-bucket/object1will be delivered because it matches the value for theEqualsoperator and doesn’t match any of the values for theNotStartsWith,NotEndsWith, andNotEqualsoperators. -
Data event for
amzn-s3-demo-bucket/object2will be delivered because it matches the value for theStartsWithoperator and doesn’t match any of the values for theNotStartsWith,NotEndsWith, andNotEqualsoperators. -
Data events for
amzn-s3-demo-bucket1/object3will be delivered because it matches theEndsWithoperator and doesn’t match any of the values for theNotStartsWith,NotEndsWith, andNotEqualsoperators. -
Data events for
arn:aws:s3:::amzn-s3-demo-bucket/deselectObject4will not be delivered because it matches the condition for theNotStartsWitheven though it matches the condition for theStartsWithoperator. -
Data events for
arn:aws:s3:::amzn-s3-demo-bucket/object5will not be delivered because it matches the condition for theNotEndsWitheven though it matches the condition for theStartsWithoperator. -
Data events for the
arn:aws:s3:::amzn-s3-demo-bucket/object6will not be delivered because it matches the condition for theNotEqualsoperator even though it matches the condition for theStartsWithoperator.
AWS CLI examples for filtering data events
This section provides AWS CLI examples showing how to filter data events on different fields. For additional AWS CLI examples, see Log data events for trails by using advanced event selectors and Logging data events for event data stores with the AWS CLI.
For information about how to log data events using the console, see Logging data events with the AWS Management Console.
Examples:
Example 1: Filtering on the eventName field
In the first example, the --advanced-event-selectors for a
trail are configured to log only the GetObject,
PutObject, and DeleteObject API calls for Amazon S3
objects in general purpose buckets.
aws cloudtrail put-event-selectors \ --trail-nametrailName\ --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"] } ] } ]'
The next example creates a new event data store that logs data events for EBS
Direct APIs but excludes ListChangedBlocks API calls. You can use
the update-event-data-store command to update an
existing event data store.
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"] } ] } ]'
Example 2: Filtering on the resources.ARN and userIdentity.arn fields
The following example shows how to include all data events for all Amazon S3
objects in a specific general purpose S3 bucket but exclude events generated
by the bucket-scanner-role
userIdentity. The value for S3 events for the
resources.type field is AWS::S3::Object.
Because the ARN values for S3 objects and S3 buckets are slightly different,
you must add the StartsWith operator for
resources.ARN.
aws cloudtrail put-event-selectors \ --trail-nametrailName\ --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"]} ] } ]'
Example 3: Filtering on
the resources.type and eventName fields to exclude
individual objects deleted by an Amazon S3 DeleteObjects event
The following example shows how to include all data events for all Amazon S3
objects in a specific general purpose Amazon S3 bucket but exclude the individual
objects deleted by the DeleteObject operation. The value for S3
events for the resources.type field is
AWS::S3::Object. The value for the event name is
DeleteObject.
aws cloudtrail put-event-selectors \ --trail-nametrailName\ --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)