Preventing false drift detection results for resource types
When AWS CloudFormation performs drift detection on a resource, it looks up the value for each
resource property as specified in the stack template, and compares that value with the
current resource property value returned by the resource read
handler. A
resource is then considered to have drifted if one or more of its properties have been
deleted, or had their value changed. In some cases, however, the resource may not be
able to return the exact same value in the read
handler as was specified in
the stack template, even though the value is essentially the same and shouldn't be
considered as drifted.
To prevent these cases from being incorrectly reported as drifted resources, you can
specify a property transform in your resource schema. The property
transform provides a way for CloudFormation to accurately compare the resource property
value specified in the template with the value returned from the read
handler. During drift detection, if CloudFormation finds a property where the template
value differs from the value returned by the read
handler, it determines if
a property transform has been defined for that property in the resource schema. If it
has, CloudFormation applies that property transform to the value specified in the
template, and then compares it to the read
handler value again. If these
two values match, the property isn't considered to have drifted, and is marked as
IN_SYNC
.
For more information about drift detection, see Detecting unmanaged configuration changes to stacks and resources in the CloudFormation User Guide.
Defining a property transform for drift detection operations
Use the propertyTransform
element to define a property transform for
a given resource property.
"propertyTransform": { "
property_path
": "transform
" }
Where:
property_path
is the path to the resource property in the resource schema.transform
is the transform to perform on the resource property value specified in the stack template.Property transforms are written in JSONata
, an open-source, lightweight query and transformation language for JSON data.
For example, consider the AWS::Route53::HostedZone resource
. For the Name
property, users can specify a domain name with or
without a trailing .
in their templates. However, assume the Route 53
service always returns the domain name with a trailing .
. This means
that if a user specified a domain name without the trailing .
in their
template, created the stack, and then performed drift detection on the stack,
CloudFormation would erroneously report the AWS::Route53::HostedZone
resource as drifted. To prevent this from happening, the resource developer would
add a propertyTransform
element to the resource schema to enable
CloudFormation to determine if both property values were actually the same:
"propertyTransform": { "/properties/Name": "$join([Name, \".\"])" }
Specifying multiple transforms for a property
You can specify multiple transforms for CloudFormation to attempt by using the
$OR
operator. If you specify multiple transforms,
CloudFormation tries them all, in the order they're specified, until it finds
one that results in the property values matching, or it has tried them
all.
For example, for the following property transform, CloudFormation would attempt two transforms to determine whether the property value has actually drifted:
Append
.
to the template property value, and determine if the updated value now matches the property value returned by the resourceread
handler. If it does, CloudFormation reports the property asIN_SYNC
. If not, CloudFormation performs the next transform.Append the string
test
to the template property value, and determine if the updated value now matches the property value returned by the resourceread
handler. If it does, CloudFormation reports the property asIN_SYNC
. If not, CloudFormation reports the property, and the resource, asMODIFIED
.
"propertyTransform": { "/properties/Name": "$join([Name, \".\"]) $OR $join([Name, \"test\"])" }