apex

package module
v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 24, 2016 License: MIT Imports: 6 Imported by: 0

README

Apex Serverless Architecture

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 key
  • AWS_SECRET_KEY AWS account secret key
  • AWS_REGION AWS region

Via ~/.aws configuration:

  • AWS_PROFILE profile name to use
  • AWS_REGION AWS region (aws-sdk-go does not read ~/.aws/config)

Contributors

Badges

Build Status Slack Status GoDoc


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.

Example
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{"world"}, nil
	})
}
Output:

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Handle

func Handle(h Handler)

Handle Lambda events with the given handler.

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL