Intrinsic functions¶
Every intrinsic function in one small template, with the Python that builds it.
def build() -> cfn.Template:
params = cfn.Params()
stage = params.string("Stage", default="dev", allowed_values=["dev", "prod"])
network = params.string("NetworkStack", default="network", description="The stack that exports the VPC")
attribute = params.string("QueueAttribute", default="Arn", allowed_values=["Arn", "QueueName"])
return {
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": params.declarations(),
"Mappings": {"Sizes": {"dev": {"Timeout": "30"}, "prod": {"Timeout": "120"}}},
"Conditions": {
"IsProd": equals(stage, "prod"),
"IsNorthEurope": equals(ref("AWS::Region"), "eu-north-1"),
"ProdInNorthEurope": and_(condition_ref("IsProd"), condition_ref("IsNorthEurope")),
"NotProd": not_(condition_ref("IsProd")),
},
"Resources": {
"Queue": sqs.queue(
QueueName=sub("${Prefix}-${Stage}", {"Prefix": "orders"}), # Fn::Sub with variables
VisibilityTimeout=find_in_map("Sizes", stage, "Timeout"), # Fn::FindInMap
DelaySeconds=if_("IsProd", 5, ref("AWS::NoValue")), # Fn::If, leaving a property out
),
"QueueUrl": ssm.parameter(
Type="String",
Name=join("/", ["", "orders", stage, "queue-url"]), # Fn::Join
Value=ref("Queue"), # Ref
),
"QueueDetail": ssm.parameter(
Type="String", Name="/orders/detail",
Value=get_att("Queue", attribute), # Fn::GetAtt, with a Ref as the attribute
),
"FirstZone": ssm.parameter(Type="String", Name="/orders/first-zone", Value=select(0, get_azs())), # Fn::Select, Fn::GetAZs
"SecondItem": ssm.parameter(Type="String", Name="/orders/second", Value=select(1, split(",", "a,b,c"))), # Fn::Split
"Bootstrap": ssm.parameter(Type="String", Name="/orders/bootstrap", Value=base64(sub("echo ${Stage}"))), # Fn::Base64
"ProdOnly": ssm.parameter(Type="String", Name="/orders/prod-only", Value="yes", condition="ProdInNorthEurope"),
"Group": ec2.security_group(
GroupDescription="orders",
VpcId=import_value(sub("${NetworkStack}-VpcId")), # Fn::ImportValue
SecurityGroupIngress=[{
"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443,
"CidrIp": select(0, cidr("10.0.0.0/16", 4, 8)), # Fn::Cidr
}],
),
},
}
Rendered YAML¶
Committed as intrinsics.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
Stage:
Type: String
Default: dev
AllowedValues:
- dev
- prod
NetworkStack:
Type: String
Default: network
Description: The stack that exports the VPC
QueueAttribute:
Type: String
Default: Arn
AllowedValues:
- Arn
- QueueName
Mappings:
Sizes:
dev:
Timeout: '30'
prod:
Timeout: '120'
Conditions:
IsProd: !Equals
- !Ref Stage
- prod
IsNorthEurope: !Equals
- !Ref AWS::Region
- eu-north-1
ProdInNorthEurope: !And
- Condition: IsProd
- Condition: IsNorthEurope
NotProd: !Not
- Condition: IsProd
Resources:
Queue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub
- ${Prefix}-${Stage}
- Prefix: orders
VisibilityTimeout: !FindInMap
- Sizes
- !Ref Stage
- Timeout
DelaySeconds: !If
- IsProd
- 5
- !Ref AWS::NoValue
QueueUrl:
Type: AWS::SSM::Parameter
Properties:
Type: String
Name: !Join
- /
- - ''
- orders
- !Ref Stage
- queue-url
Value: !Ref Queue
QueueDetail:
Type: AWS::SSM::Parameter
Properties:
Type: String
Name: /orders/detail
Value: !GetAtt
- Queue
- !Ref QueueAttribute
FirstZone:
Type: AWS::SSM::Parameter
Properties:
Type: String
Name: /orders/first-zone
Value: !Select
- 0
- !GetAZs ''
SecondItem:
Type: AWS::SSM::Parameter
Properties:
Type: String
Name: /orders/second
Value: !Select
- 1
- !Split
- ','
- a,b,c
Bootstrap:
Type: AWS::SSM::Parameter
Properties:
Type: String
Name: /orders/bootstrap
Value:
Fn::Base64: !Sub echo ${Stage}
ProdOnly:
Type: AWS::SSM::Parameter
Properties:
Type: String
Name: /orders/prod-only
Value: 'yes'
Condition: ProdInNorthEurope
Group:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: orders
VpcId:
Fn::ImportValue: !Sub ${NetworkStack}-VpcId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: !Select
- 0
- !Cidr
- 10.0.0.0/16
- 4
- 8