Conditions allow a template developer to create many scenarios using the same template. cfn-lint does not use parameter values to determine the validaty of a template so cfn-lint will try to validate all the possible scenarios that are created by using conditions.
Conditions are defined in a section of your CloudFormation template. At the lowest level all conditions will equate to a set of Fn::Equals
that compares two values. Advanced condition scenarios can be created using Fn::And
, Fn::Or
, Fn::Not
. Conditions can be nested using Fn::Condition
function.
Parameters:
Environment:
Type: String
Conditions:
IsProduction: !Equals [!Ref Environment, "prod"]
IsDevelopment: !Equals [!Ref Environment, "dev"]
IsProductionAndUsEast1:
!And
- !Condition IsProduction
- !Equals [!Ref AWS::Region, "us-east-1"]
Conditions can be used in two locations. 1/ Is the at the resource or output level defined by the attribute Condition
2/ Using the function Fn::If
under a resources Properties
property. Fn::If
can be used at any layer as long as it is the only key in an object.
Resources:
HTTPSCertificate:
Type: AWS::CertificateManager::Certificate
Condition: HaveTargets
Properties:
DomainName: 'example.com'
ValidationMethod: DNS
CloudFrontAlias:
Type: AWS::Route53::RecordSet
Condition: CreateDNSRecords
Properties:
HostedZoneId: !Ref ServiceHostedZoneId
Name: 'example.com'
Type: A
AliasTarget:
DNSName: !GetAtt Distribution1.DomainName
HostedZoneId: Z2FDTNDATAQYW2
Distribution1:
Type: AWS::CloudFront::Distribution
Condition: HaveTargets
Properties:
DistributionConfig:
Enabled: true
ViewerCertificate:
AcmCertificateArn: !Ref HTTPSCertificate
SslSupportMethod: sni-only
MinimumProtocolVersion: TLSv1.2_2019
DefaultCacheBehavior:
TargetOriginId: Service1
Outputs:
DomainName:
Value: !If [HaveTargets, !GetAtt Distribution1.DomainName, ""]
SymPy is a python package that allows you to build formulas and calculate if a scenario is a legitimate scenario. For instance cfn-lint will build a solver for conditions IsProduction
and IsDevelopment
that will calculate the following possibilites True
/False
, False
/True
, or False
/False
. To build a solver cfn-lint will build formulas accordingly Fn::And
is converted to And
, Fn::Or
is converted to Or
, and Fn::Not
is converted to Not
. It will understand Fn::Equals
that use the same parameter and create a Not(And(...))
formula that will make sure that the equals in the And
are no never True
together.