Dawid Fieluba
Dawid Fieluba

Reputation: 1301

CloudFormation Transform::Include parameters

I want to use AWS macro Transform::Include with some dynamic parameters for my file.

Resources:
  'Fn::Transform':
    Name: 'AWS::Include'
    Parameters:
      TestMacroVariable: 
        Default: 2
        Type: Number
      Location: !Sub "s3://${InstallBucketName}/test.yaml"

test.yaml:

DataAutoScalingGroup:
  Type: AWS::AutoScaling::AutoScalingGroup
  Properties:
    LaunchConfigurationName: 
      Ref: DataLaunchConfiguration
    MinSize: '1'
    MaxSize: '100'
    DesiredCapacity: 
      Ref: TestMacroVariable
...

After calling: aws cloudformation describe-stack-events --stack-name $stack

I get:

"ResourceStatusReason": "The value of parameter TestMacroVariable under transform Include must resolve to a string, number, boolean or a list of any of these.. Rollback requested by user."


When I try to do it this way:

Resources:
  'Fn::Transform':
    Name: 'AWS::Include'
    Parameters:
      TestMacroVariable: 2
      Location: !Sub "s3://${InstallBucketName}/test.yaml"

I get:

"ResourceStatusReason": "Template format error: Unresolved resource dependencies [TestMacroVariable] in the Resources block of the template"

Error is the same when I don't provide TestMacroVariable at all.


Tried with different types: String, Number, Boolean, List - none of them work.

Upvotes: 8

Views: 3696

Answers (3)

Ghamgui Khaled
Ghamgui Khaled

Reputation: 434

Building on what @BatteryAcid Said you can refer the parameters in your Cloudformation template directly from your file using Sub function:

In your CF template :

Parameters:
  TableName:
    Type: String
    Description: Table Name of the Dynamo DB Users table
    Default: 'Users'

In the file you are including:

     "Resource": [
      {
        "Fn::Sub": [
          "arn:${AWS::Partition}:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${tableName}",
          {
            "tableName": {
              "Ref": "TableName"
            }
          }
        ]
      }

Alternatively doesn't have to be a parameter but any resource from your template :

Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${QueryTelemtryFunction.Arn}/invocations

Upvotes: 0

BatteryAcid
BatteryAcid

Reputation: 8881

As an alternative, you can pass in the whole S3 path as a parameter and reference it in Location:

Parameters:
  MyS3Path:
    Type: String
    Default: 's3://my-cf-templates/my-include.yaml'  

...

'Fn::Transform':
  Name: 'AWS::Include'
  Parameters:
    Location: !Ref MyS3Path

Upvotes: -1

Ntwobike
Ntwobike

Reputation: 2741

As i know you cannot have anything other than Location key in the Parameters section of the AWS::Include. Check here AWS DOC

Upvotes: 2

Related Questions