Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CodePipeline unable to locate SAM template yaml file

I'm attempting to setup AWS Codepipeline with a Cloudformation SAM stack that deploys to a Lambda and am doing this via the Pipeline console. The pipeline passes the clone from Codecommit process and the build process with Codebuild, however fails on the deploy with Cloudformation.

I get the following error message:

Action execution failed Invalid TemplatePath: MyAppBuild::samTemplate.yml

I've been following the documentation (http://docs.aws.amazon.com/lambda/latest/dg/automating-deployment.html) pretty closely and in field 16 of the codepipeline setup form (Template File) I have been putting samTemplate.yml.

I also have samTemplate.yml in the root of my repo (which is also the root of the project).

I've matched the Codebuild output artifact name with the Cloudformation input artifact name and they match exactly.

Am I missing something here? How do I get the Cloudformation deploy process to recognize the sam template?

EDIT 1 I've switched to using Codestar instead of directly using CodePipeline. Nothing special in my buildspec.yml, but it's below if anyone's interested.

version: 0.2

phases:
  install:
    commands:
      - echo "install"
  pre_build:
    commands:
      - echo "pre_build"
  build:
    commands:
      - aws cloudformation package --template template.yml --s3-bucket $S3_BUCKET --output-template template-export.json
artifacts:
  type: zip
  files:
    - template-export.json

One thing to keep in mind for anyone new to CodeBuild, the zip file that gets created as a result is of the root level directory of your build operations and IS the zip file that gets transferred to final deployment (in my case, Lambda).

like image 440
Brooks Avatar asked May 06 '17 03:05

Brooks


3 Answers

You need to add aws cloudformation package command in you buildspec.yml.

 aws cloudformation package --debug --template-file <YourSamTemplate.yml> --s3-bucket <YourbucketName> --output-template-file <YourOutputSamTemplate.yml>

where YourSamTemplate.yml is the name of samTemplate.yml in your project root. and YourOutputSamTemplate.yml is the new name which you eant to give your output file after cloud formation package command is done.

Then in the next stage you need to define your input-artifact as output of your aws codebuild stage and then use this input-artifact to map your template.

build-output::YourOutputSamTemplate.yml
like image 182
D.Sajwan Avatar answered Nov 07 '22 08:11

D.Sajwan


I believe the output of the build stage is what needs to be passed into the CloudFormation action.

In the tutorial the build output is called NewSamTemplate.yaml

So try updating your TemplatePath to MyAppBuild::NewSamTemplate.yml

like image 27
TimB Avatar answered Nov 07 '22 06:11

TimB


In my case, the error was in the filename. Instead of template.yml the actual file was template.yaml

like image 1
Ivan Hristov Avatar answered Nov 07 '22 08:11

Ivan Hristov