CodeDeploy can't find my AWS Lambda Function

David Gatti picture David Gatti · Jan 28, 2018 · Viewed 7.3k times · Source

I have an Issue with CodeDeploy and AWS Lambda when they work inside AWS CodePipeline. This is my setup:

  1. Source GitHub
  2. AWS CodeBuild
  3. AWS CodeDeploy

The Issue

Step 1. and 2. work without a problem, but when it comes to CodeDeploy I get the following error:

Action execution failed BundleType must be either YAML or JSON

If I unzip the Artifact generated by CodeBuild all the files are in place.

If I try to manually deploy to AWS Lambda from CodeDeploy I then get a different message...

Deployment Failed The deployment failed because either the target Lambda function FUNCTION_NAME does not exist or the specified function version or alias cannot be found

This is very confusion as to which Error message is valid, or if they are the same but have a different Error message.

The Setup

The ARN of the function is:

arn:aws:lambda:us-east-1:239748505547:function:email_submition

The ARN for the Alias is:

arn:aws:lambda:us-east-1:239748505547:function:email_submition:default

And my appspec.yml file has the following content

version: 0.0
Resources:
  - email_submition:
      Type: AWS::Lambda::Function
      Properties:
        Name: "email_submition"
        Alias: "default"
        CurrentVersion: "1"
        TargetVersion: "2"

And the folder structure of the project is:

.gitignore
appspec.yml
buildspec.yml
index.js
README.md

Question

What am I missing in this configuration?

Answer

StoneyD picture StoneyD · Feb 6, 2018

So really this should be a comment not an answer. I do not have 50 rep yet so it's here.

I am having the same issues as you. I'm not sure if you found a solution or not. I was able to successfully execute a deployment with the following appspec.yml:

version: 0.0
Resources:
    - mylambdafunction:
        Type: AWS::Lambda::Function
        Properties:
            Name: "mylambdafunction"
            Alias: "staging"
            CurrentVersion: "2"
            TargetVersion: "3"

Both the current version and target version had to exist before CodeDeploy would work. Of course I've tested this by doing a manual deployment.

I think what is needed here is something that actually updates the code and creates a new version. Which is what I would have thought CodeDeploy would do.

Edit: Further research has yielded information about CodePipeline I hadn't realized.

Per here it looks like to run through the Pipeline you need your buildspec, appspec, and a cft. The reason the pipeline fails is because you need to include a CloudFormation Template for the lambda function, this is what deploys the actual code. The appspec.yml is there to migrate traffic from the old version to the new version but the cft is what does the deployment of new code.

Edit2: This example app got me squared away. Use CodeBuild to build your app but also to generate your CFT for doing actual deployment. This means you build your CFT with the lambda resource. This removes appspec completely from the resources and instead you use a CFT to define the Lambda function. Here is a link to the SAM docs.