Build, deploy, and manage AWS Lambda functions with ease.
Go JavaScript Shell Java Clojure Python Other
Clone or download
Latest commit 38c6dc5 Jul 26, 2018
Permalink
Failed to load latest commit information.
.github add -ldebug to ISSUE_TEMPLATE Jun 19, 2016
_examples Add dependency for go example (#878) Apr 12, 2018
archive fix symlink support. Closes #401 #288 (#404) May 11, 2016
assets add title.png Dec 14, 2016
boot re-build for updated mocks May 23, 2018
cmd/apex add `region` field to project configuration (#889) Jun 6, 2018
colors add colors package Jan 29, 2016
cost Add metric price (#368) Apr 17, 2016
docs docs: fix medium link Jul 26, 2018
dryrun remove deadcode Mar 17, 2016
exec ocd Dec 29, 2016
function fix support for >50 lambda versions. Closes #846 (#882) May 8, 2018
hooks add deploy hook Jan 24, 2016
infra fix a missing pointer dereference May 8, 2017
internal add utils from Up which are necessary for upgrade Jan 18, 2018
logs fix missing logs. Closes #393 May 5, 2016
metrics Add metric price (#368) Apr 17, 2016
mock re-build for updated mocks May 23, 2018
plugins fix native golang inference and go example Jan 16, 2018
project refactor: add error wrapping to Open() Oct 13, 2017
shim re-build for updated mocks May 23, 2018
upgrade add new upgrade mechanism to match Up Jan 18, 2018
utils add `region` field to project configuration (#889) Jun 6, 2018
vpc add VPC support. Closes #242 Feb 15, 2016
.gitignore add .envrc to .gitignore Jan 18, 2018
.goreleaser.yml update AWS SDK versions for assuming roles. Closes #886 May 23, 2018
CODE_OF_CONDUCT.md add CODE_OF_CONDUCT.md Feb 16, 2016
CONTRIBUTING.md Adds Testing & Linting Information to Contribution Page (#768) Jun 16, 2017
Gopkg.lock update AWS SDK versions for assuming roles. Closes #886 May 23, 2018
Gopkg.toml add ./vendor Oct 13, 2017
History.md Release v1.0.0-rc3 May 8, 2018
LICENSE change license to Apex contributors Jan 17, 2016
Makefile refactor makefile so build is still the default target May 23, 2018
Readme.md fix medium link. Closes #895 Jul 26, 2018
install.sh change install.sh to godownloader Jan 17, 2018

Readme.md

Apex Serverless Architecture

Apex lets you build, deploy, and manage AWS Lambda functions with ease. With Apex you can use languages that are not natively supported by AWS Lambda through the use of a Node.js shim injected into the build. A variety of workflow related tooling is provided for testing functions, rolling back deploys, viewing metrics, tailing logs, hooking into the build system and more.

This project is designed for event-driven pipelines as it does not abstract away FaaS (functions as a service). If you are building web applications, APIs, or sites, consider using Apex Up, which provides a more out-of-the-box experience for these use-cases.

Installation

On macOS, Linux, or OpenBSD run the following:

curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh

Note that you may need to run the sudo version below, or alternatively chown /usr/local:

curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sudo sh

On Windows download binary.

After downloading, rename binary file 'apex.exe', then add to PATH.

If already installed, upgrade with:

apex upgrade

Runtimes

Currently supports:

  • Node.js
  • Golang
  • Python
  • Java
  • Rust
  • Clojure

Example projects for all supported runtimes can be found in _examples directory.

Features

  • Supports languages Lambda does not natively support via shim
  • Binary install (install apex quickly for continuous deployment in CI etc)
  • Hook support for running commands (transpile code, lint, dependency management , etc)
  • Batteries included but optional (opt-in to higher level abstractions)
  • Environment variable population via command-line, file, or inline config
  • Idempotent deployments (checksums skip already-deployed code)
  • Multiple environments via project.ENV.json and function.ENV.json files
  • Configuration inheritance and overrides
  • Command-line function invocation with JSON streams
  • Command & function name autocompletion
  • Function name globbing (ex: apex deploy api_*)
  • Transparently generates a zip for your deploy
  • Project bootstrapping with optional Terraform support
  • Function metrics and cost analysis
  • Ignore deploying files with .apexignore
  • Function rollback support
  • Tail function logs
  • Concurrency for quick deploys
  • Dry-run to preview changes
  • VPC support

Sponsors

Does your company use Apex? Help keep the project bug-free and feature rich by sponsoring the project.

Backers

Love our work and community? Become a backer.

Example

Apex projects are made up of a project.json configuration file, and zero or more Lambda functions defined in the "functions" directory. Here's an example file structure:

project.json
functions
├── bar
│   ├── function.json
│   └── index.js
└── foo
    ├── function.json
    └── index.js

The project.json file defines project level configuration that applies to all functions, and defines dependencies. For this simple example the following will do:

{
  "name": "example",
  "description": "Example project"
}

Each function uses a function.json configuration file to define function-specific properties such as the runtime, amount of memory allocated, and timeout. This file is completely optional, as you can specify defaults in your project.json file. For example:

{
  "name": "bar",
  "description": "Node.js example function",
  "runtime": "nodejs4.3",
  "memory": 128,
  "timeout": 5,
  "role": "arn:aws:iam::293503197324:role/lambda"
}

Now the directory structure for your project would be:

project.json
functions
├── bar
│   └── index.js
└── foo
    └── index.js

Finally the source for the functions themselves look like this in Node.js:

console.log('start bar')
exports.handle = function(e, ctx) {
  ctx.succeed({ hello: e.name })
}

Apex operates at the project level, but many commands allow you to specify specific functions. For example you may deploy the entire project with a single command:

$ apex deploy

Or whitelist functions to deploy:

$ apex deploy foo bar

Invoke it!

$ echo '{ "name": "Tobi" }' | apex invoke bar
{ "hello": "Tobi" }

See the Documentation for more information.

Links


Build Status Slack Status GoDoc OpenCollective OpenCollective