When adding a AWS::Serverless::Api specifying multiple reference variables causes the message "Number of errors found: 1. Resource with id [TestUploadtestStage] is invalid. Type of property 'Variables' is invalid." when deploying with "aws cloudformation deploy".
I can add either of the variables but cannot add both
TestUpload:
Type: AWS::Serverless::Api
Properties:
StageName: test
DefinitionUri: swagger.json
Variables:
DeleteFunctionArn: !Ref DeleteFunction
PutFunctionArn: !Ref PutFunction
Have I just got the syntax incorrect?
I also experienced the same thing with above syntax.
This could be related to #19. It seems that the way Transform processes references for the API resource may be incorrect. Perhaps it doesn't expand all of them before trying to create the resource, or something along those lines.
This is a bug in the transform, which fails when validating the structure of Variables property. We are working on fixing it.
Good to know. Any eta on when a fix will be available?
No concrete ETA yet. It is in the order of a few days. Will reply back once it done
Sorry to keep you folks waiting
@sanathkr Hi, any news in there. Thank you for the extended example with swagger.
Yeah, early next week we should have this fixed
This should be fixed now. Can you verify it works?
It no longer has the "Type of property 'Variables' is invalid." error, but now variables are not expanded at all, which I describe in #34 .
Yeah it works perfectly for me, thanks.
It works for me now, thanks.
@sanathkr this is still failing for me. Is there something special that I need to do in order to realize the fix? I'm currently using AWS::Serverless-2016-10-31 which looks like it's the latest.
Although, it may be possible that my issue is not the same as just multi environment variables, as I seem to be experiencing it even with just a single environment variable. When I attempt to do aws cloudformation validate-template --template-body ./sam.yaml I get the following error:
An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: unsupported structure.
But no clue what the unsupported structure may be
validate-template API currently does NOT support SAM. Are you able to deploy using aws cloudformation deploy?
Ah, I see. I came to that realization myself after going backwards in my changes quite a lot to a known good SAM template. It would be fantastic if I could validate more quickly than going through a full deploy.
I'm currently attempting to do this all through CodePipeline, which worked previously until my SAM template started getting more complex (added an AWS::Serverless::SimpleTable resource, then added an AWS::DynamoDB::Table resource for a more complex table, then added some environment variables to my functions to reference these table names). So, now I'm attempting to peel everything back one at a time since I can't seem to get an error message that can give me a hint at what may be the problem.
Thanks for the quick reply @sanathkr! Any other suggestions on debugging SAM templates?
At the moment, quickest way to validate is to call aws cloudformation create-change-set on the SAM template. This will trigger SAM -> CloudFormation translation that does syntactical validation. If you have a bug your resource definition, like a bad permission configuration, you have to deploy to get it validated.
I understand this isn't the easiest approach, but it is the quickest at the moment. I am planning on writing a DEBUGGING guide to share this knowledge
Awesome, a debugging guide would be fantastic! And thanks for all the hard work on this, SAM coupled with CodePipeline and the new CodeBuild functionality fills a huge gap for me! It's great stuff!
Also, for what it's worth (and just in case anyone else runs into my same issue), I found what the issue was by small re-additions. It turns out I was thinking I could cleverly name the table in the AWS::Serverless::SimpleTable resource like I can in the AWS::DynamoDB::Table resource, however, removing the TableName definition from the AWS::Serverless::SimpleTable resource seems to have fixed my deployment issue and everything seems to be humming along now!
Hi,
I'm trying to set the stage from outside with a cli parameter:
--parameter-overrides DeployStage=prod
Doing this the deployment ends up with a transformation error (similar as dinvlad described) if the parameter is used in the scope of AWS::Serverless::Api:
AddonApi:
Type: AWS::Serverless::Api
Properties:
StageName: !Ref DeployStage
The deployment works if I enter the stage name directly (no by using !Ref).
Should this work now or is a fix in progress? Currently, I'm using the following versions for Cloudformation:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
This won't work now. #22 will fix the problem.
Most helpful comment
This is a bug in the transform, which fails when validating the structure of Variables property. We are working on fixing it.