Serverless Architecture Boilerplate
CI / CD Pipeline
Need a Codepipeline Structure to deploy your Serverless Project with Quality? See this repo!
Serverless Archictecture Boilerplate with Go?
Looking for boilerplates to organize big projects using AWS Lambda with Go? See this repo
Structure
.├── modules (modules folder)│ └── books (module / context)│ ├── endpoints (API endpoints)│ │ ├── create.js│ │ ├── delete.js│ │ ├── read.js│ │ └── update.js│ └── functions (workers / background functions)│ └── worker│ └── handler.js├── package.json├── serverless.yml (serverless config)├── handlers (functions config)│ ├── books-endpoints.yml (endpoints config)│ └── books-workers.yml (workers config)├── shared (shared components)│ └── lib (shared libraries)│ ├── dynamo.js│ ├── kinesis.js│ ├── lambda.js│ ├── parsers.js│ ├── sqs.js│ └── uuid.js└── test (tests folder) └── unit (unit tests folder) ├── modules (unit tests for modules) │ └── books └── shared (unit tests for shared components) └── lib (unit tests for libraries) ├── dynamo.test.js ├── kinesis.test.js ├── parsers.test.js ├── sqs.test.js └── uuid.test.js
Functions
HTTP Trigger Function (API Gateway)
functions: # API Endpoints books-register: handler: modules/books/endpoints/create.create #Path to function memorySize: 128 # Lambda Memory Limit timeout: 60 # Lambda Timeout events: - http: # HTTP Trigger path: services/books # API Endpoint method: post # HTTP Method
Cloudwatch Events Functions (Cron)
# Background Function books-consumer: handler: modules/books/functions/worker/handler.worker #Path to function events: - schedule: #Cloudwatch Event Trigger rate: cron(* * * * * *) # Cron Syntax enabled: true # Trigger Enabled
Development environment
This boilerplate uses serverless-local
plugin and some containers and plugins to emulate the AWS Resources
docker-compose up
The applications will start on http://localhost:3000
Dev Plugins
This boilerplate contains following plugins for local development:
- serverless-offline - For run API Gateway local and manage plugins
- serverless-offline-scheduler - CloudWatch Schedule Adapter
- serverless-offline-sqs-esmq - SQS Adapter
- serverless-dynamodb-local - DynamoDB Adapter
- serverless-plugin-split-stacks - Split Cloudformation Templates
Production environment
Deploy full services
serverless deploy -v
Deploy a function
serverless deploy function -f books-consumer
Get function logs
serverless books-consumer -f bananinha -t
Clean All
serverless remove
Testing
Create Book
curl -X POST \ -H "Content-Type: application/json" \ -d '{"title": "American Gods", "author": "Neil Gaiman", "price": 10.00 }' \ https://yur25zhqo0.execute-api.us-east-1.amazonaws.com/production/services/books -i
List Books
curl -X GET \ https://yur25zhqo0.execute-api.us-east-1.amazonaws.com/production/services/books
Detail Book
curl -X GET \ https://yur25zhqo0.execute-api.us-east-1.amazonaws.com/production/services/books/456c9e8f-6c50-d656-dc69-dc828c42af65
Delete Book
curl -X DELETE \ https://yur25zhqo0.execute-api.us-east-1.amazonaws.com/production/services/books/456c9e8f-6c50-d656-dc69-dc828c42af65 -i
Update Book
curl -X PUT \ -d '{"title": "updated modafoca"}' -H "Content-type: application/json" \ https://eusrv4mci5.execute-api.us-east-1.amazonaws.com/production/services/books/bbafdb0c-ee6e-fca0-f224-ed534f5b7766 -i
Custom and Environment Variables
Custom Items
Creating and Using custom variables to build dynamic name
custom: region: ${self:provider.region} stage: ${opt:stage, self:provider.stage} prefix: ${self:custom.stage}-${self:service} process: ${self:custom.prefix}-process config: ${self:custom.prefix}-config dynamo-books: ${self:custom.prefix}-BooksCatalog sns-logs: ${self:custom.prefix}-trigger-logs sqs-logs: ${self:custom.prefix}-messages-logs
Environment Variables
Building URL Resources using CloudFormation parameters and Custom Variables
environment: # Global Environment variables DYNAMO_TABLE_BOOKS: ${self:custom.dynamo-books} # Reference to Custom Env SQS_QUEUE_URL: 'https://sqs.${self:provider.region}.amazonaws.com/#{AWS::AccountId}/${self:custom.sqs-logs}' REGION: ${self:custom.region}
Manage AWS Cloudformation with Serverless
IAM Roles
iamRoleStatements: # Permissions for all of your functions can be set here - Effect: Allow Action: # Gives permission to DynamoDB tables in a specific region - dynamodb:DescribeTable - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem Resource: "arn:aws:dynamodb:us-east-1:*:*" - Effect: Allow Action: # Gives permission to Lambda execution - lambda:InvokeFunction - lambda:InvokeAsync Resource: "*"
Manage Infrastructure Components - Docs
# Infrastrucure - Cloud Formationresources: # CloudFormation template syntax Resources: #DynamoDB Books Table BooksCatalog: Type: AWS::DynamoDB::Table # CloudFormation Pseudo Parameter Example Properties: TableName: ${self:custom.dynamo-books} AttributeDefinitions: - AttributeName: hashkey AttributeType: S KeySchema: - AttributeName: hashkey KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 2 WriteCapacityUnits: 1 # SQS Queue to Update DynamoDB BooksQueueExample: Type: AWS::SQS::Queue Properties: QueueName: ${self:custom.sqs-logs} MessageRetentionPeriod: 1209600 VisibilityTimeout: 60