README
¶
Apex is a small tool for deploying and managing AWS Lambda functions. With shims for languages not yet supported by Lambda, you can use Golang out of the box.
Installation
Download binaries:
curl -sL https://github.com/apex/apex/releases/download/v0.4.1/apex_darwin_amd64 -o /usr/local/bin/apex
chmod +x $_
Or from master:
go get github.com/apex/apex/cmd/apex
Runtimes
Currently supports:
- Nodejs
- Golang
- Python
Features
- Supports languages Lambda does not natively support via shim, such as Go
- Binary install (useful for continuous deployment in CI etc)
- Hook support for running commands (transpile code, lint, etc)
- Project level function and resource management
- Configuration inheritance and overrides
- Command-line function invocation with JSON streams
- Transparently generates a zip for your deploy
- Ignore deploying files with .apexignore
- Function rollback support
- Tail function CloudWatchLogs
- Concurrency for quick deploys
- Dry-run to preview changes
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
├── baz
│ ├── 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": "nodejs",
"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
├── baz
│ └── 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: 'bar' })
}
Or using the Golang Lambda package, Apex supports Golang out of the box with a Node.js shim:
package main
import (
"encoding/json"
"github.com/apex/apex"
)
type Message struct {
Hello string `json:"hello"`
}
func main() {
apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) {
return &Message{"baz"}, nil
})
}
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 '{ "some": "data" }' | apex invoke foo
{ "hello": "foo" }
See the Wiki for more information.
Credentials
Via environment variables:
AWS_ACCESS_KEY
AWS account access keyAWS_SECRET_KEY
AWS account secret keyAWS_REGION
AWS region
Via ~/.aws configuration:
AWS_PROFILE
profile name to useAWS_REGION
AWS region (aws-sdk-go does not read ~/.aws/config)
Links
- Wiki
- Project Examples with source
Contributors
Badges
tjholowaychuk.com · GitHub @tj · Twitter @tjholowaychuk
Documentation
¶
Overview ¶
Package apex provides Lambda support for Go via a Node.js shim and this package for operating over stdio.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func HandleFunc ¶
func HandleFunc(h HandlerFunc)
HandleFunc handles Lambda events with the given handler function.
Types ¶
type Context ¶
type Context struct { InvokeID string `json:"invokeid"` RequestID string `json:"awsRequestId"` FunctionName string `json:"functionName"` FunctionVersion string `json:"functionVersion"` LogGroupName string `json:"logGroupName"` LogStreamName string `json:"logStreamName"` MemoryLimitInMB string `json:"memoryLimitInMB"` IsDefaultFunctionVersion bool `json:"isDefaultFunctionVersion"` ClientContext json.RawMessage `json:"clientContext"` }
Context represents the context data provided by a Lambda invocation.
type Handler ¶
type Handler interface {
Handle(json.RawMessage, *Context) (interface{}, error)
}
Handler handles Lambda events.
type HandlerFunc ¶
type HandlerFunc func(json.RawMessage, *Context) (interface{}, error)
HandlerFunc implements Handler.
func (HandlerFunc) Handle ¶
func (h HandlerFunc) Handle(event json.RawMessage, ctx *Context) (interface{}, error)
Handle Lambda event.
Directories
¶
Path | Synopsis |
---|---|
_examples
|
|
cmd
|
|
Package dryrun implements the Lambda API in order to no-op changes, and display dry-run output.
|
Package dryrun implements the Lambda API in order to no-op changes, and display dry-run output. |
Package function implements function-level operations.
|
Package function implements function-level operations. |
Package kinesis provides structs for working with AWS Kinesis records.
|
Package kinesis provides structs for working with AWS Kinesis records. |
Package logs implements AWS CloudWatchLogs tailing.
|
Package logs implements AWS CloudWatchLogs tailing. |
Package metrics fetches CloudWatch metrics for a function.
|
Package metrics fetches CloudWatch metrics for a function. |
plugins
|
|
env
Package env populates .env.json if the function has any environment variables defined.
|
Package env populates .env.json if the function has any environment variables defined. |
golang
Package golang implements the "golang" runtime.
|
Package golang implements the "golang" runtime. |
hooks
Package hooks implements hook script support.
|
Package hooks implements hook script support. |
inference
Package inference adds file-based inference to detect runtimes when they are not explicitly specified.
|
Package inference adds file-based inference to detect runtimes when they are not explicitly specified. |
nodejs
Package nodejs implements the "nodejs" runtime.
|
Package nodejs implements the "nodejs" runtime. |
python
Package python implements the "python" runtime.
|
Package python implements the "python" runtime. |
shim
Package shim adds a nodejs shim when the shim field is true, this is also used transparently in other plugins such as "golang" which are not directly supported by Lambda.
|
Package shim adds a nodejs shim when the shim field is true, this is also used transparently in other plugins such as "golang" which are not directly supported by Lambda. |
Package project implements multi-function operations.
|
Package project implements multi-function operations. |
Package shim provides a shim for running arbitrary languages on Lambda.
|
Package shim provides a shim for running arbitrary languages on Lambda. |
Package upgrade fetches the latest Apex binary, if any, for the current platform.
|
Package upgrade fetches the latest Apex binary, if any, for the current platform. |
Package wiki implements a simple GitHub wiki miner and output formatter.
|
Package wiki implements a simple GitHub wiki miner and output formatter. |