Deploying AWS Lambda function using GitLab CI/CD

GitLab allows users to easily deploy AWS Lambda functions and create rich serverless applications.

GitLab supports deployment of functions to AWS Lambda using a combination of:

Example

In the following example, you will:

  1. Create a basic AWS Lambda Node.js function.
  2. Link the function to an API Gateway GET endpoint.

Steps

The example consists of the following steps:

  1. Creating a Lambda handler function
  2. Creating a serverless.yml file
  3. Crafting the .gitlab-ci.yml file
  4. Setting up your AWS credentials with your GitLab account
  5. Deploying your function
  6. Testing your function

Lets take it step by step.

Creating a Lambda handler function

Your Lambda function will be the primary handler of requests. In this case we will create a very simple Node.js "Hello" function:

'use strict';

module.exports.hello = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Your function executed successfully!'
      },
      null,
      2
    ),
  };
};

Place this code in the file src/handler.js.

src is the standard location for serverless functions, but is customizable should you desire that.

In our case, module.exports.hello defines the hello handler that will be referenced later in the serverless.yml

You can learn more about the AWS Lambda Node.js function handler and all its various options here: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

Creating a serverless.yml file

In the root of your project, create a serverless.yml file that will contain configuration specifics for the Serverless Framework.

Put the following code in the file:

service: gitlab-example
provider:
  name: aws
  runtime: nodejs10.x

functions:
  hello:
    handler: src/handler.hello
    events:
      - http: GET hello

Our function contains a handler and a event.

The handler definition will provision the Lambda function using the source code located src/handler.hello.

The events declaration will create a AWS API Gateway GET endpoint to receive external requests and hand them over to the Lambda function via a service integration.

You can read more about the available properties and additional configuration possibilities of the Serverless Framework here: https://serverless.com/framework/docs/providers/aws/guide/serverless.yml/

Crafting the .gitlab-ci.yml file

In a .gitlab-ci.yml file, place the following code:

image: node:latest

stages:
  - deploy

production:
  stage: deploy
  before_script:
    - npm config set prefix /usr/local
    - npm install -g serverless
  script:
    - serverless deploy --stage production --verbose
  environment: production

This example code does the following:

  1. Uses the node:latest image for all GitLab CI builds
  2. The deploy stage:
  • Installs the serverless framework.
  • Deploys the serverless function to your AWS account using the AWS credentials defined above.

Setting up your AWS credentials with your GitLab account

In order to interact with your AWS account, the .gitlab-ci.yml requires both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY be defined in your GitLab settings under Settings > CI/CD > Variables. For more information please see: https://docs.gitlab.com/ee/ci/variables/README.html#via-the-ui

NOTE: Note: The AWS credentials you provide must include IAM policies that provision correct access control to AWS Lambda, API Gateway, and CloudFormation resources.

Deploying your function

Deploying your function is very simple, just git push to your GitLab repository and the GitLab build pipeline will automatically deploy your function.

In your GitLab deploy stage log, there will be output containing your AWS Lambda endpoint URL. The log line will look similar to this:

endpoints:
  GET - https://u768nzby1j.execute-api.us-east-1.amazonaws.com/production/hello

Testing your function

Running the following curl command should trigger your function.

NOTE: Note: Your url should be the one retrieved from the GitLab deploy stage log.

curl https://u768nzby1j.execute-api.us-east-1.amazonaws.com/production/hello

Should output:

{
  "message": "Your function executed successfully!"
}

Hooray! You now have a AWS Lambda function deployed via GitLab CI.

Nice work!

Example code

To see the example code for this example please follow the link below:

  • Node.js example: Deploy a AWS Lambda Javascript function + API Gateway using Serverless Framework and GitLab CI/CD