Skip to content

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