awslabs / goformation

GoFormation is a Go library for working with CloudFormation templates.
Apache License 2.0
841 stars 197 forks source link

Parse fails when using a number as a Lambda environment value #639

Open jpeach opened 7 months ago

jpeach commented 7 months ago

I used goformation.ParseYAML() to parse a working CloudFormation template that has some Lambda resources. The parse files with the following error:

json: cannot unmarshal number into Go struct field Template.Resources of type string

In general, the parser seems to be more sensitive to the YAML types that the real CloudFormation service is, which I guess is reasonable. However, I tracked this down to a parsing issue in AWSLambdaFunction_Environment. AWSLambdaFunction_Environment defines Variables as map[string]string, but the CloudFormation docs imply that any type is allowed as a value, https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-environment.html

In my case, I have something like this:

Parameters:
  DataVolSize:
    Type: Number
    Description: >-
      Minimum: 100 GB
    Default: 100
    MinValue: 100
Resources:
  Initializer:
    Type: 'AWS::Lambda::Function'
    Properties:
      Environment:
        Variables:
          data_volume_size: !Ref DataVolSize
      Code:
        ZipFile: |-

So the JSON parsing that is done via goformation.ParseYAML() requires me to convert the value of data_volume_size to a string, but there doesn't seem to be a way to do that.

lexhuismans commented 3 weeks ago

Similarly I encountered the following error

json: cannot unmarshal string into Go struct field Template.Resources of type int

When running goformation.Open()

_, err := goformation.Open(path)
if err != nil {
    fmt.Println(err.Error())
}

On this Yaml

AWSTemplateFormatVersion: '2010-09-09'
Description: Lambda with timeout as string
Resources:
  LambdaWithTimeout:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: lambda-with-timeout
      Timeout: '60'
      Runtime: python3.12

Removing the quotes for Timeout ('60' > 60) resolves this issue. However, I believe both are valid Cloudformation templates.