2

I tried to use Code Pipeline to automate the code deployment. It uses Git Hub -> Code Build -> Cloud Formation as mentioned in wiki

AWS Automation of Lambda

I managed to get the pipeline run after few changes suggested by this thread

However whenever I am using the code pipeline, the Lambda test fails saying the class is not found.

In order to verify, I uploaded the jar directly in AWS lambda console and it worked fine.

I also verified the jar which is built by aws code build in the S3 "MyAppBuild" folder and it contains jar file in target/app-1.0-SNAPSHOT.jar in a zip file along with my SamTemplate.yml.

This is the SamTemplate.yml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Outputs the time

Parameters:
  SourceBucket:
    Type: String
    Description: S3 bucket name for the CodeBuild artifact
  SourceArtifact:
    Type: String
    Description: S3 object key for the CodeBuild artifact

Resources:
  TimeFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: com.xxx.Hello::handleRequest
      Runtime: java8
      CodeUri:
         Bucket: !Ref SourceBucket
         Key: !Ref SourceArtifact
      Events:
        MyTimeApi:
          Type: Api
          Properties:
            Path: /TimeResource
            Method: GET

Here is the buildSpec.yaml

version: 0.2
phases:
  build:
    commands:
      - echo Build started on `date`
      - mvn test
  post_build:
    commands:
      - echo Build completed on `date`
      - mvn package
  install:
    commands:
      - aws cloudformation package --template-file SamTemplate.yaml --s3-bucket codepipeline-us-east-1-xxxx
                                       --output-template-file NewSamTemplate.yaml
artifacts:
  type: zip
  files:
    - SamTemplate.yaml
    - target/app-1.0-SNAPSHOT.jar

Any suggestions to try on? I use maven.

Carlos Macasaet
  • 1,176
  • 7
  • 23
Idicula
  • 203
  • 1
  • 2
  • 7

1 Answers1

0

Finally, after a few tries I found a probable solution for the packaging with aws code build, cloud formation, and lambda.

The whole point is that code build creates a wrapper zip of all files mentioned in artifacts:

This is the same zip file which must be given to aws lambda. In order for aws lambda to accept a zip as valid, classes should be root folder, dependent libs should be in libs folder.

So I managed to do this as my build spec.

version: 0.2

phases:
  install:
    commands:
      - aws cloudformation package --template-file SamTemplate.yaml --s3-bucket codepipeline-us-east-1-XXXXXXXX
                                   --output-template-file NewSamTemplate.yaml
  build:
    commands:
      - echo Build started on `date`
      - gradle build clean
      - gradle test

  post_build:
    commands:
      - echo Build started on `date`
      - gradle build
      - mkdir -p deploy
      - cp -r build/classes/main/* deploy/
      - cp NewSamTemplate.yaml deploy/
      - cp -r build/libs deploy/
      - ls -ltr deploy
      - ls -ltr build
      - echo Build completed on `date`
      - echo Build is complete

artifacts:
  type : zip
  files:
    - '**/*'
  base-directory : 'deploy'
Idicula
  • 203
  • 1
  • 2
  • 7