Skip to content

becual/serverless-AWS-lambda-example

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Serverless AWS lambda example

This repository explain how to create a AWS lambda test with serverless framework and deploy with CircleCI

Previous requirements

Install serverless framework via npm or yarn

npm install -g serverless 

Setup AWS credentials via severless command

serverless config credentials --provider aws --key AKIAIOSFODNN7EXAMPLE --secret wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY 

or Setup AWS credentials via aws-cli

$ aws configure AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY Default region name [None]: us-west-2 Default output format [None]: ENTER 

Quick Start

This section explain how to run this project

1.- Install dependencies

Install serverless offline and other dependencies

npm install 

2.- Run serverless in local mode

serverless-offline plugin provide test lambda functions in local mode using sls offline start command

$ sls offline start Serverless: Starting Offline: dev/us-east-1. Serverless: Routes for hello: Serverless: GET /becual/hello Serverless: Routes for bye: Serverless: GET /becual/bye Serverless: Offline listening on http://localhost:3000 

Configuration

This section explain how to create a serverless project

Create a new serverless project

# Create a new Serverless Service/Project $ serverless create --template aws-nodejs --path serverless-example # Change into the newly created directory $ cd serverless-example 

Handler file

handler.js file:

var moment = require('moment'); var cep = require('./cep'); module.exports.hello = (event, context, callback) => { var data = moment(); const response = { statusCode: 200, body: JSON.stringify({ message: 'entregala los enevtos y la fecha!', input: event, context: context, data: data.toDate() }), }; callback(null, response); }; module.exports.bye = async (event, context, callback) => { var data = moment(); const response = { statusCode: 200, body: JSON.stringify({ bye: 'adios amiguito!', cep: await cep() }), }; callback(null, response); };

cep file

cep.js file:

module.exports = () => { return Promise.resolve('CEP'); }

Serverless configuration

With this configuration file (serverless.yml) you can provide a lambda function with node 6.10 and two functions.

  • With serverless-offline plugin you can run you lambda and API Gateway locally
  • With serverless-plugin-optimize plugin you can transpile you code to es5
service: lambda-test # exclude the code coverage files and circle ci files package: exclude: - coverage/** - .circleci/** provider: name: aws runtime: nodejs6.10 functions: hello: handler: handler.hello events: - http: path: becual/hello method: get bye: handler: handler.bye events: - http: path: becual/bye method: get plugins: - serverless-offline - serverless-plugin-optimize

Install dependencies

Install the minimal dependencies to run the project

Create a package.json file

yarn init

Install dependencies

yarn add moment

Install development dependencies

yarn add serverless-offline --dev yarn add serverless-plugin-optimize --dev

CircleCI configuration

The proposal of this configuration file is:

  • Install serverless dependencies in CircleCI
  • Install project dependencies in CircleCI
  • Create tap report
  • Create coverage report
  • Deploy the application en AWS

IMPORTANT: To deploy in circle CI, add your AWS credentials in CircleCi web page to the Project Settings > AWS Permissions page in the CircleCI application. The Access Key ID and Secret Access Key that you entered are automatically available in your primary build container and exposed as AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables.

version: 2 jobs: build: docker: # specify the version you desire here - image: circleci/node:7.10 working_directory: ~/defaultDirectory steps: - checkout # Download and cache dependencies - restore_cache: keys: - v1-dependencies-{{ checksum "package.json" }} # fallback to using the latest cache if no exact match is found - v1-dependencies- - run: name: Install Serverless CLI and dependencies command: |  sudo npm i -g serverless  yarn install   - run: name: Run tests command: |  yarn offline  yarn add ava tap-xunit --dev  mkdir -p ~/reports  yarn test:ci  when: always - store_test_results: path: ~/reports - store_artifacts: path: ~/reports - store_artifacts: path: "./coverage/lcov-report/" destination: ~/reports - run: name: Deploy application command: sls deploy - save_cache: paths: - node_modules key: v1-dependencies-{{ checksum "package.json" }}