PutAccountPolicy
Creates an account-level data protection policy, subscription filter policy, field index policy, transformer policy, or metric extraction policy that applies to all log groups, a subset of log groups, or a data source name and type combination in the account.
For field index policies, you can configure indexed fields as facets to enable interactive exploration of your logs. Facets provide value distributions and counts for indexed fields in the CloudWatch Logs Insights console without requiring query execution. For more information, see Use facets to group and explore logs.
To use this operation, you must be signed on with the correct permissions depending on the type of policy that you are creating.
-
To create a data protection policy, you must have the
logs:PutDataProtectionPolicyandlogs:PutAccountPolicypermissions. -
To create a subscription filter policy, you must have the
logs:PutSubscriptionFilterandlogs:PutAccountPolicypermissions. -
To create a transformer policy, you must have the
logs:PutTransformerandlogs:PutAccountPolicypermissions. -
To create a field index policy, you must have the
logs:PutIndexPolicyandlogs:PutAccountPolicypermissions. -
To configure facets for field index policies, you must have the
logs:PutIndexPolicyandlogs:PutAccountPolicypermissions. -
To create a metric extraction policy, you must have the
logs:PutMetricExtractionPolicyandlogs:PutAccountPolicypermissions.
Data protection policy
A data protection policy can help safeguard sensitive data that's ingested by your log groups by auditing and masking the sensitive log data. Each account can have only one account-level data protection policy.
Important
Sensitive data is detected and masked when it is ingested into a log group. When you set a data protection policy, log events ingested into the log groups before that time are not masked.
If you use PutAccountPolicy to create a data protection policy for your whole
account, it applies to both existing log groups and all log groups that are created later in
this account. The account-level policy is applied to existing log groups with eventual
consistency. It might take up to 5 minutes before sensitive data in existing log groups begins
to be masked.
By default, when a user views a log event that includes masked data, the sensitive data is
replaced by asterisks. A user who has the logs:Unmask permission can use a GetLogEvents or FilterLogEvents operation with the unmask parameter set to
true to view the unmasked log events. Users with the logs:Unmask
can also view unmasked data in the CloudWatch Logs console by running a CloudWatch Logs
Insights query with the unmask query command.
For more information, including a list of types of data that can be audited and masked, see Protect sensitive log data with masking.
To use the PutAccountPolicy operation for a data protection policy, you must
be signed on with the logs:PutDataProtectionPolicy and
logs:PutAccountPolicy permissions.
The PutAccountPolicy operation applies to all log groups in the account. You
can use PutDataProtectionPolicy to create a data protection policy that applies to just one
log group. If a log group has its own data protection policy and the account also has an
account-level data protection policy, then the two policies are cumulative. Any sensitive term
specified in either policy is masked.
Subscription filter policy
A subscription filter policy sets up a real-time feed of log events from CloudWatch Logs to other AWS services. Account-level subscription filter policies apply to both existing log groups and log groups that are created later in this account. Supported destinations are Kinesis Data Streams, Firehose, and Lambda. When log events are sent to the receiving service, they are Base64 encoded and compressed with the GZIP format.
The following destinations are supported for subscription filters:
-
An Kinesis Data Streams data stream in the same account as the subscription policy, for same-account delivery.
-
An Firehose data stream in the same account as the subscription policy, for same-account delivery.
-
A Lambda function in the same account as the subscription policy, for same-account delivery.
-
A logical destination in a different account created with PutDestination, for cross-account delivery. Kinesis Data Streams and Firehose are supported as logical destinations.
Each account can have one account-level subscription filter policy per Region. If you are
updating an existing filter, you must specify the correct name in PolicyName. To
perform a PutAccountPolicy subscription filter operation for any destination
except a Lambda function, you must also have the iam:PassRole
permission.
Transformer policy
Creates or updates a log transformer policy for your account. You use log transformers to transform log events into a different format, making them easier for you to process and analyze. You can also transform logs from different sources into standardized formats that contain relevant, source-specific information. After you have created a transformer, CloudWatch Logs performs this transformation at the time of log ingestion. You can then refer to the transformed versions of the logs during operations such as querying with CloudWatch Logs Insights or creating metric filters or subscription filters.
You can also use a transformer to copy metadata from metadata keys into the log events themselves. This metadata can include log group name, log stream name, account ID and Region.
A transformer for a log group is a series of processors, where each processor applies one type of transformation to the log events ingested into this log group. For more information about the available processors to use in a transformer, see Processors that you can use.
Having log events in standardized format enables visibility across your applications for your log analysis, reporting, and alarming needs. CloudWatch Logs provides transformation for common log types with out-of-the-box transformation templates for major AWS log sources such as VPC flow logs, Lambda, and Amazon RDS. You can use pre-built transformation templates or create custom transformation policies.
You can create transformers only for the log groups in the Standard log class.
You can have one account-level transformer policy that applies to all log groups in the
account. Or you can create as many as 20 account-level transformer policies that are each
scoped to a subset of log groups with the selectionCriteria parameter. If you
have multiple account-level transformer policies with selection criteria, no two of them can
use the same or overlapping log group name prefixes. For example, if you have one policy
filtered to log groups that start with my-log, you can't have another transformer
policy filtered to my-logpprod or my-logging.
You can also set up a transformer at the log-group level. For more information, see PutTransformer. If there is both a log-group level transformer created with
PutTransformer and an account-level transformer that could apply to the same
log group, the log group uses only the log-group level transformer. It ignores the
account-level transformer.
Field index policy
You can use field index policies to create indexes on fields found in log events for a log group or data source name and type combination. Creating field indexes can help lower the scan volume for CloudWatch Logs Insights queries that reference those fields, because these queries attempt to skip the processing of log events that are known to not match the indexed field. Good fields to index are fields that you often need to query for and fields or values that match only a small fraction of the total log events. Common examples of indexes include request ID, session ID, user IDs, or instance IDs. For more information, see Create field indexes to improve query performance and reduce costs
To find the fields that are in your log group events, use the GetLogGroupFields operation. To find the fields for a data source use the GetLogFields operation.
For example, suppose you have created a field index for requestId. Then, any
CloudWatch Logs Insights query on that log group that includes requestId =
value
or requestId in [value,
value, ...] will attempt to process only the log events where
the indexed field matches the specified value.
Matches of log events to the names of indexed fields are case-sensitive. For example, an
indexed field of RequestId won't match a log event containing
requestId.
You can have one account-level field index policy that applies to all log groups in the
account. Or you can create as many as 20 account-level field index policies that are each
scoped to a subset of log groups using LogGroupNamePrefix with the
selectionCriteria parameter. You can have another 20 account-level field index
policies using DataSourceName and DataSourceType for the
selectionCriteria parameter. If you have multiple account-level index policies
with LogGroupNamePrefix selection criteria, no two of them can use the same or
overlapping log group name prefixes. For example, if you have one policy filtered to log
groups that start with my-log, you can't have another field index policy
filtered to my-logpprod or my-logging. Similarly, if
you have multiple account-level index policies with DataSourceName and
DataSourceType selection criteria, no two of them can use the same data source
name and type combination. For example, if you have one policy filtered to the data source
name amazon_vpc and data source type flow you cannot create another
policy with this combination.
If you create an account-level field index policy in a monitoring account in cross-account observability, the policy is applied only to the monitoring account and not to any source accounts.
CloudWatch Logs provides default field indexes for all log groups in the Standard log class. Default field indexes are automatically available for the following fields:
-
@logStream -
@aws.region -
@aws.account -
@source.log -
@data_source_name -
@data_source_type -
@data_format -
traceId -
severityText -
attributes.session.id
CloudWatch Logs provides default field indexes for certain data source name and type combinations as well. Default field indexes are automatically available for the following data source name and type combinations as identified in the following list:
amazon_vpc.flow
-
action -
logStatus -
region -
flowDirection -
type
amazon_route53.resolver_query
-
transport -
rcode
aws_waf.access
-
action -
httpRequest.country
aws_cloudtrail.data, aws_cloudtrail.management
-
eventSource -
eventName -
awsRegion -
userAgent -
errorCode -
eventType -
managementEvent -
readOnly -
eventCategory -
requestId
Default field indexes are in addition to any custom field indexes you define within your policy. Default field indexes are not counted towards your field index quota.
If you want to create a field index policy for a single log group, you can use PutIndexPolicy instead of PutAccountPolicy. If you do so, that log
group will use that log-group level policy and any account-level policies that match at the
data source level; any account-level policy that matches at the log group level (for example,
no selection criteria or log group name prefix selection criteria) will be ignored.
Metric extraction policy
A metric extraction policy controls whether CloudWatch Metrics can be created through the Embedded Metrics Format (EMF) for log groups in your account. By default, EMF metric creation is enabled for all log groups. You can use metric extraction policies to disable EMF metric creation for your entire account or specific log groups.
When a policy disables EMF metric creation for a log group, log events in the EMF format are still ingested, but no CloudWatch Metrics are created from them.
Important
Creating a policy disables metrics for AWS features that use EMF to create metrics, such
as CloudWatch Container Insights and CloudWatch Application Signals. To prevent turning off
those features by accident, we recommend that you exclude the underlying log-groups through
a selection-criteria such as LogGroupNamePrefix NOT IN ["/aws/containerinsights",
"/aws/ecs/containerinsights", "/aws/application-signals/data"].
Each account can have either one account-level metric extraction policy that applies to
all log groups, or up to 5 policies that are each scoped to a subset of log groups with the
selectionCriteria parameter. The selection criteria supports filtering by
LogGroupName and LogGroupNamePrefix using the operators
IN and NOT IN. You can specify up to 50 values in each
IN or NOT IN list.
The selection criteria can be specified in these formats:
LogGroupName IN ["log-group-1", "log-group-2"]
LogGroupNamePrefix NOT IN ["/aws/prefix1", "/aws/prefix2"]
If you have multiple account-level metric extraction policies with selection criteria, no
two of them can have overlapping criteria. For example, if you have one policy with selection
criteria LogGroupNamePrefix IN ["my-log"], you can't have another metric
extraction policy with selection criteria LogGroupNamePrefix IN ["/my-log-prod"]
or LogGroupNamePrefix IN ["/my-logging"], as the set of log groups matching these
prefixes would be a subset of the log groups matching the first policy's prefix, creating an
overlap.
When using NOT IN, only one policy with this operator is allowed per
account.
When combining policies with IN and NOT IN operators, the
overlap check ensures that policies don't have conflicting effects. Two policies with
IN and NOT IN operators do not overlap if and only if every value
in the IN policy is completely contained within some value in the NOT
IN policy. For example:
-
If you have a
NOT INpolicy for prefix"/aws/lambda", you can create anINpolicy for the exact log group name"/aws/lambda/function1"because the set of log groups matching"/aws/lambda/function1"is a subset of the log groups matching"/aws/lambda". -
If you have a
NOT INpolicy for prefix"/aws/lambda", you cannot create anINpolicy for prefix"/aws"because the set of log groups matching"/aws"is not a subset of the log groups matching"/aws/lambda".
Request Syntax
{
"policyDocument": "string",
"policyName": "string",
"policyType": "string",
"scope": "string",
"selectionCriteria": "string"
}
Request Parameters
For information about the parameters that are common to all actions, see Common Parameters.
The request accepts the following data in JSON format.
- policyDocument
-
Specify the policy, in JSON.
Data protection policy
A data protection policy must include two JSON blocks:
-
The first block must include both a
DataIdentiferarray and anOperationproperty with anAuditaction. TheDataIdentiferarray lists the types of sensitive data that you want to mask. For more information about the available options, see Types of data that you can mask.The
Operationproperty with anAuditaction is required to find the sensitive data terms. ThisAuditaction must contain aFindingsDestinationobject. You can optionally use thatFindingsDestinationobject to list one or more destinations to send audit findings to. If you specify destinations such as log groups, Firehose streams, and S3 buckets, they must already exist. -
The second block must include both a
DataIdentiferarray and anOperationproperty with anDeidentifyaction. TheDataIdentiferarray must exactly match theDataIdentiferarray in the first block of the policy.The
Operationproperty with theDeidentifyaction is what actually masks the data, and it must contain the"MaskConfig": {}object. The"MaskConfig": {}object must be empty.
For an example data protection policy, see the Examples section on this page.
Important
The contents of the two
DataIdentiferarrays must match exactly.In addition to the two JSON blocks, the
policyDocumentcan also includeName,Description, andVersionfields. TheNameis different than the operation'spolicyNameparameter, and is used as a dimension when CloudWatch Logs reports audit findings metrics to CloudWatch.The JSON specified in
policyDocumentcan be up to 30,720 characters long.Subscription filter policy
A subscription filter policy can include the following attributes in a JSON block:
-
DestinationArn The ARN of the destination to deliver log events to. Supported destinations are:
-
An Kinesis Data Streams data stream in the same account as the subscription policy, for same-account delivery.
-
An Firehose data stream in the same account as the subscription policy, for same-account delivery.
-
A Lambda function in the same account as the subscription policy, for same-account delivery.
-
A logical destination in a different account created with PutDestination, for cross-account delivery. Kinesis Data Streams and Firehose are supported as logical destinations.
-
-
RoleArn The ARN of an IAM role that grants CloudWatch Logs permissions to deliver ingested log events to the destination stream. You don't need to provide the ARN when you are working with a logical destination for cross-account delivery.
-
FilterPattern A filter pattern for subscribing to a filtered stream of log events.
-
Distribution The method used to distribute log data to the destination. By default, log data is grouped by log stream, but the grouping can be set to
Randomfor a more even distribution. This property is only applicable when the destination is an Kinesis Data Streams data stream.
Transformer policy
A transformer policy must include one JSON block with the array of processors and their configurations. For more information about available processors, see Processors that you can use.
Field index policy
A field index filter policy can include the following attribute in a JSON block:
-
Fields The array of field indexes to create.
-
FieldsV2 The object of field indexes to create along with it's type.
It must contain at least one field index.
The following is an example of an index policy document that creates indexes with different types.
"policyDocument": "{ \"Fields\": [ \"TransactionId\" ], \"FieldsV2\": {\"RequestId\": {\"type\": \"FIELD_INDEX\"}, \"APIName\": {\"type\": \"FACET\"}, \"StatusCode\": {\"type\": \"FACET\"}}}"You can use
FieldsV2to specify the type for each field. Supported types areFIELD_INDEXandFACET. Field names withinFieldsandFieldsV2must be mutually exclusive.Type: String
Required: Yes
-
- policyName
-
A name for the policy. This must be unique within the account and cannot start with
aws/.Type: String
Required: Yes
- policyType
-
The type of policy that you're creating or updating.
Type: String
Valid Values:
DATA_PROTECTION_POLICY | SUBSCRIPTION_FILTER_POLICY | FIELD_INDEX_POLICY | TRANSFORMER_POLICY | METRIC_EXTRACTION_POLICYRequired: Yes
- scope
-
Currently the only valid value for this parameter is
ALL, which specifies that the data protection policy applies to all log groups in the account. If you omit this parameter, the default ofALLis used.Type: String
Valid Values:
ALLRequired: No
- selectionCriteria
-
Use this parameter to apply the new policy to a subset of log groups in the account or a data source name and type combination.
Specifying
selectionCriteriais valid only when you specifySUBSCRIPTION_FILTER_POLICY,FIELD_INDEX_POLICYorTRANSFORMER_POLICYforpolicyType.-
If
policyTypeisSUBSCRIPTION_FILTER_POLICY, the only supportedselectionCriteriafilter isLogGroupName NOT IN [] -
If
policyTypeisTRANSFORMER_POLICY, the only supportedselectionCriteriafilter isLogGroupNamePrefix -
If
policyTypeisFIELD_INDEX_POLICY, the supportedselectionCriteriafilters are:-
LogGroupNamePrefix -
DataSourceNameANDDataSourceType
When you specify
selectionCriteriafor a field index policy you can use eitherLogGroupNamePrefixby itself orDataSourceNameandDataSourceTypetogether. -
The
selectionCriteriastring can be up to 25KB in length. The length is determined by using its UTF-8 bytes.Using the
selectionCriteriaparameter withSUBSCRIPTION_FILTER_POLICYis useful to help prevent infinite loops. For more information, see Log recursion prevention.Type: String
Required: No
-
Response Syntax
{
"accountPolicy": {
"accountId": "string",
"lastUpdatedTime": number,
"policyDocument": "string",
"policyName": "string",
"policyType": "string",
"scope": "string",
"selectionCriteria": "string"
}
}
Response Elements
If the action is successful, the service sends back an HTTP 200 response.
The following data is returned in JSON format by the service.
- accountPolicy
-
The account policy that you created.
Type: AccountPolicy object
Errors
For information about the errors that are common to all actions, see Common Errors.
- InvalidParameterException
-
A parameter is specified incorrectly.
HTTP Status Code: 400
- LimitExceededException
-
You have reached the maximum number of resources that can be created.
HTTP Status Code: 400
- OperationAbortedException
-
Multiple concurrent requests to update the same resource were in conflict.
HTTP Status Code: 400
- ServiceUnavailableException
-
The service cannot complete the request.
HTTP Status Code: 500
Examples
To create a log transformer policy
The following example creates a log transformer that applies to log groups have
names that start with test-
Sample Request
POST / HTTP/1.1
[... existing transformer policy example content ...]
To create a metric extraction policy
The following example creates a metric extraction policy that disables EMF metric creation for all log groups except Container Insights log groups.
Sample Request
POST / HTTP/1.1
Host: logs.<region>.<domain>
X-Amz-Date: <DATE>
Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=content-type;date;host;user-agent;x-amz-date;x-amz-target;x-amzn-requestid, Signature=<Signature>
User-Agent: <UserAgentString>
Accept: application/json
Content-Type: application/x-amz-json-1.1
Content-Length: <PayloadSizeBytes>
Connection: Keep-Alive
X-Amz-Target: Logs_20140328.PutAccountPolicy
{
"policyName": "DisableEMFMetrics",
"policyType": "METRIC_EXTRACTION_POLICY",
"policyDocument": {
"EmbeddedMetricFormat": {
"Status": "Disabled"
}
},
"selectionCriteria": 'LogGroupNamePrefix NOT IN ["/aws/containerinsights", "/aws/ecs/containerinsights"]'
}
To create an account-wide data protection policy
The following example creates an account-wide log group data protection policy.
Sample Request
POST / HTTP/1.1
[... existing data protection policy example content ...]
To create an account-wide subscription filter policy
The following example creates an account-wide subscription filter policy that
forwards log events containing the string ERROR to a Kinesis Data Streams
stream. The policy applies to all log groups in the account except for
LogGroupToExclude1 and LogGroupToExclude12.
Sample Request
POST / HTTP/1.1
[... existing subscription filter policy example content ...]
To create an account-wide field index policy
The following example creates an account-wide field index policy for log groups
with names that start with lambda.
Sample Request
POST / HTTP/1.1
[... existing field index policy example content ...]
See Also
For more information about using this API in one of the language-specific AWS SDKs, see the following: