This project contains source code and supporting files for the serverless application that powers the MealMatch mobile application.
- API Gateway resources for each endpoint
- Lambda functions to handle the processing of requests
- Infrastructure as Code using CloudFormation
- AWS Lambda Layers for:
config-utilsto retrieve secrets (i.e. API keys) from AWS Systems Manager (SSM) Parameter Storefoursquare-utilsservice for consuming the Foursquare API for restaurant discovery.loggerusing winston for logging logs to CloudWatchaws-xrayfor tracing requests through each service
- CI/CD using GitHub Actions
- Separate CloudFormation Stacks For Each Environment
The Serverless Application Model Command Line Interface (SAM CLI) is an extension of the AWS CLI that adds functionality for building and testing Lambda applications. It uses Docker to run your functions in an Amazon Linux environment that matches Lambda. It can also emulate your application's build environment and API.
Prerequisites:
- SAM CLI - Install the SAM CLI
- Node.js - Install Node.js 12 or above, including the NPM package management tool.
- Docker - Install Docker community edition
- S3 bucket to store build artifacts for AWS SAM.
- Create the bucket, and set the value of
s3_bucketin samconfig.toml to the name of the bucket for each environment
- Create the bucket, and set the value of
- IAM User with Programmatic Access to AWS
- The IAM User will need the following permissions on the Resource
arn:aws:iam::[your AWS account ID]:role/*:- "iam:TagRole"
- "iam:CreateRole"
- "iam:DeleteRole"
- "iam:AttachRolePolicy"
- "iam:DetachRolePolicy"
- "iam:TagUser"
- When deploying manually, you will need to configure your AWS CLI with the profile of the user, and update the package.json's
deployStackcommand to use the profile. - When deploying via CI/CD, you will need to update the GitHub Actions Secrets with your
AWS_ACCESS_KEY_IDandAWS_SECRET_ACCESS_KEYfor the user.
- The IAM User will need the following permissions on the Resource
To build and deploy your application for the first time, run the following in your shell:
npm run deployDev
or
npm run deployStaging
or
npm run deployProdThe command will build the source of your application, package, and deploy your application to AWS, with a series of prompts:
You can find your API Gateway Endpoint URL in the output values displayed after deployment.
To start API Gateway locally, use the npm run dev command.
$ npm run devTest a single function by invoking it directly with a test event. An event is a JSON document that represents the input that the function receives from the event source. Test events are included in the events folder in this project.
Run functions locally and invoke them with the npm run local command.
$ npm run localThe SAM CLI reads the application template to determine the API's routes and the functions that they invoke. The Events property on each function's definition includes the route and method for each path.
Events:
Sample:
Type: Api
Properties:
Path: /sample
Method: getThe application uses several AWS resources, including Lambda functions and an API Gateway API. These resources are defined in the template.yaml file in this project. You can update the template to add AWS resources through the same deployment process that updates your application code.
Each folder inside ./src represents a Lambda that handles the requests from API Gateway.
To delete the sample application that you created, use the AWS CLI. Assuming you used your project name for the stack name, you can run the following:
aws cloudformation delete-stack --stack-name kickstarter-apiLooking to contribute? Visit the Trello board to see what is prioritized, in the backlog, in progress, etc. Feel free to shoot me an email at gary.gc.chiu@gmail.com or open a PR if you're interested!
See the AWS SAM developer guide for an introduction to SAM specification, the SAM CLI, and serverless application concepts.
Next, you can use AWS Serverless Application Repository to deploy ready to use Apps that go beyond hello world samples and learn how authors developed their applications: AWS Serverless Application Repository main page