From 35677aa0da01dea277ec3fda95d0b77b9360bafd Mon Sep 17 00:00:00 2001 From: Yunspace Date: Sat, 8 Apr 2017 21:29:38 +1000 Subject: [PATCH 1/6] refactoring to include back golang shim based event handling --- Makefile | 2 -- handler.go | 25 +++++++++---------------- net/http_handler.go | 25 +++++++++++++++++++++++++ serverless.yml | 10 +++++++--- shim/event_handler.go | 12 ++++++++++++ shim/models.go | 1 + 6 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 net/http_handler.go create mode 100644 shim/event_handler.go create mode 100644 shim/models.go diff --git a/Makefile b/Makefile index d782b46..737ad07 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,4 @@ IMAGE_LAMBDA_GO=eawsy/aws-lambda-go-shim -# we can't use .serverless folder because it gets wiped by sls deploy -OUTPUT_DIR=bin # serverless.yml env vars ENV ?= dev diff --git a/handler.go b/handler.go index 61e9d68..cee0662 100644 --- a/handler.go +++ b/handler.go @@ -1,27 +1,20 @@ package main import ( - "net/http" - - "github.com/eawsy/aws-lambda-go-net/service/lambda/runtime/net" "github.com/eawsy/aws-lambda-go-net/service/lambda/runtime/net/apigatewayproxy" + "encoding/json" + "github.com/eawsy/aws-lambda-go-core/service/lambda/runtime" + "github.com/yunspace/serverless-golang/net" + "github.com/yunspace/serverless-golang/shim" ) // Handle is the exported handler called by AWS Lambda. -var Handle apigatewayproxy.Handler +var NetHandle apigatewayproxy.Handler func init() { - ln := net.Listen() - - // Amazon API Gateway Binary support out of the box. - Handle = apigatewayproxy.New(ln, nil).Handle - - // Any Go framework complying with the Go http.Handler interface can be used. - // This includes, but is not limited to, Vanilla Go, Gin, Echo, Gorrila, Goa, etc. - go http.Serve(ln, http.HandlerFunc(handle)) + NetHandle = net.NewHTTPHandler() } -func handle(w http.ResponseWriter, r *http.Request) { - w.Header().Set("X-Powered-By", "serverless-golang") - w.Write([]byte("Hello, serverless-golang!")) -} +func EventHandle(evt json.RawMessage, ctx *runtime.Context) (interface{}, error) { + return shim.HandleEvent(evt, ctx) +} \ No newline at end of file diff --git a/net/http_handler.go b/net/http_handler.go new file mode 100644 index 0000000..1dde381 --- /dev/null +++ b/net/http_handler.go @@ -0,0 +1,25 @@ +package net + +import ( + "net/http" + "github.com/eawsy/aws-lambda-go-net/service/lambda/runtime/net/apigatewayproxy" + "github.com/eawsy/aws-lambda-go-net/service/lambda/runtime/net" +) + +func NewHTTPHandler() apigatewayproxy.Handler { + ln := net.Listen() + + // Amazon API Gateway Binary support out of the box. + handle := apigatewayproxy.New(ln, nil).Handle + + // Any Go framework complying with the Go http.Handler interface can be used. + // This includes, but is not limited to, Vanilla Go, Gin, Echo, Gorrila, Goa, etc. + go http.Serve(ln, http.HandlerFunc(handleHTTP)) + + return handle +} + +func handleHTTP(w http.ResponseWriter, r *http.Request) { + w.Header().Set("X-Powered-By", "serverless-golang") + w.Write([]byte("Hello, serverless-golang!")) +} \ No newline at end of file diff --git a/serverless.yml b/serverless.yml index 6163df8..73539e9 100644 --- a/serverless.yml +++ b/serverless.yml @@ -8,7 +8,11 @@ provider: region: ${env:AWS_DEFAULT_REGION} profile: ${env:AWS_PROFILE} functions: - hello: - handler: handler.Handle + hello-net: + handler: handler.NetHandle events: - - http: GET hello \ No newline at end of file + - http: GET hello-net + hello-events: + handler: handler.EventHandle + events: + - http: GET hello-events \ No newline at end of file diff --git a/shim/event_handler.go b/shim/event_handler.go new file mode 100644 index 0000000..846645e --- /dev/null +++ b/shim/event_handler.go @@ -0,0 +1,12 @@ +package shim + +import ( + "encoding/json" + + "github.com/eawsy/aws-lambda-go/service/lambda/runtime" +) + +func HandleEvent(evt json.RawMessage, ctx *runtime.Context) (interface{}, error) { + return nil, nil +} + diff --git a/shim/models.go b/shim/models.go new file mode 100644 index 0000000..826208a --- /dev/null +++ b/shim/models.go @@ -0,0 +1 @@ +package shim From b6f2a2898457db64b73941589e05b056b2bfa958 Mon Sep 17 00:00:00 2001 From: Yunspace Date: Sat, 8 Apr 2017 23:28:01 +1000 Subject: [PATCH 2/6] renamed packages --- aws/event/event_handler.go | 18 ++++++++++++++++++ aws/event/models.go | 16 ++++++++++++++++ net/http_handler.go => aws/net/net_handler.go | 6 +++--- aws/net/net_handler_test.go | 11 +++++++++++ handler.go | 12 ++++++------ shim/event_handler.go | 12 ------------ shim/models.go | 1 - 7 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 aws/event/event_handler.go create mode 100644 aws/event/models.go rename net/http_handler.go => aws/net/net_handler.go (79%) create mode 100644 aws/net/net_handler_test.go delete mode 100644 shim/event_handler.go delete mode 100644 shim/models.go diff --git a/aws/event/event_handler.go b/aws/event/event_handler.go new file mode 100644 index 0000000..8bb12a7 --- /dev/null +++ b/aws/event/event_handler.go @@ -0,0 +1,18 @@ +package event + +import ( + "github.com/eawsy/aws-lambda-go-core/service/lambda/runtime" + "github.com/eawsy/aws-lambda-go-event/service/lambda/runtime/event/apigatewayproxyevt" +) + +func HandlHTTPEvent(evt *apigatewayproxyevt.Event, ctx *runtime.Context) (interface{}, error) { + + response := &Response { + StatusCode: 200, + Body: "Hello, serverless-golang!", + } + response.Headers["X-Powered-By"] = "serverless-golang" + + return response, nil +} + diff --git a/aws/event/models.go b/aws/event/models.go new file mode 100644 index 0000000..88c6af3 --- /dev/null +++ b/aws/event/models.go @@ -0,0 +1,16 @@ +package event + +type Body struct { + Message string `json:"message"` + Input string `json:"input"` +} + +func NewBody(m string, e string) *Body { + return &Body{Message: m, Input: e} +} + +type Response struct { + StatusCode int `json:"statusCode"` + Headers map[string]string `json:"headers"` + Body string `json:"body"` +} \ No newline at end of file diff --git a/net/http_handler.go b/aws/net/net_handler.go similarity index 79% rename from net/http_handler.go rename to aws/net/net_handler.go index 1dde381..5de9661 100644 --- a/net/http_handler.go +++ b/aws/net/net_handler.go @@ -6,7 +6,7 @@ import ( "github.com/eawsy/aws-lambda-go-net/service/lambda/runtime/net" ) -func NewHTTPHandler() apigatewayproxy.Handler { +func NewNetHandler() apigatewayproxy.Handler { ln := net.Listen() // Amazon API Gateway Binary support out of the box. @@ -14,12 +14,12 @@ func NewHTTPHandler() apigatewayproxy.Handler { // Any Go framework complying with the Go http.Handler interface can be used. // This includes, but is not limited to, Vanilla Go, Gin, Echo, Gorrila, Goa, etc. - go http.Serve(ln, http.HandlerFunc(handleHTTP)) + go http.Serve(ln, http.HandlerFunc(hello)) return handle } -func handleHTTP(w http.ResponseWriter, r *http.Request) { +func hello(w http.ResponseWriter, r *http.Request) { w.Header().Set("X-Powered-By", "serverless-golang") w.Write([]byte("Hello, serverless-golang!")) } \ No newline at end of file diff --git a/aws/net/net_handler_test.go b/aws/net/net_handler_test.go new file mode 100644 index 0000000..0fe2262 --- /dev/null +++ b/aws/net/net_handler_test.go @@ -0,0 +1,11 @@ +package net + +import "testing" + +func TestNewNetHandler(t *testing.T) { + +} + +func TestCustomHeader(t *testing.T) { + +} \ No newline at end of file diff --git a/handler.go b/handler.go index cee0662..9c9eb86 100644 --- a/handler.go +++ b/handler.go @@ -2,19 +2,19 @@ package main import ( "github.com/eawsy/aws-lambda-go-net/service/lambda/runtime/net/apigatewayproxy" - "encoding/json" "github.com/eawsy/aws-lambda-go-core/service/lambda/runtime" - "github.com/yunspace/serverless-golang/net" - "github.com/yunspace/serverless-golang/shim" + "github.com/yunspace/serverless-golang/aws/net" + "github.com/yunspace/serverless-golang/aws/event" + "github.com/eawsy/aws-lambda-go-event/service/lambda/runtime/event/apigatewayproxyevt" ) // Handle is the exported handler called by AWS Lambda. var NetHandle apigatewayproxy.Handler func init() { - NetHandle = net.NewHTTPHandler() + NetHandle = net.NewNetHandler() } -func EventHandle(evt json.RawMessage, ctx *runtime.Context) (interface{}, error) { - return shim.HandleEvent(evt, ctx) +func EventHandle(evt *apigatewayproxyevt.Event, ctx *runtime.Context) (interface{}, error) { + return event.HandlHTTPEvent(evt, ctx) } \ No newline at end of file diff --git a/shim/event_handler.go b/shim/event_handler.go deleted file mode 100644 index 846645e..0000000 --- a/shim/event_handler.go +++ /dev/null @@ -1,12 +0,0 @@ -package shim - -import ( - "encoding/json" - - "github.com/eawsy/aws-lambda-go/service/lambda/runtime" -) - -func HandleEvent(evt json.RawMessage, ctx *runtime.Context) (interface{}, error) { - return nil, nil -} - diff --git a/shim/models.go b/shim/models.go deleted file mode 100644 index 826208a..0000000 --- a/shim/models.go +++ /dev/null @@ -1 +0,0 @@ -package shim From 2b81416716897012e62585ed9049ebeb70fad714 Mon Sep 17 00:00:00 2001 From: Yunspace Date: Sun, 23 Apr 2017 21:59:04 +1000 Subject: [PATCH 3/6] #5 working version of go-lambda-net --- .gitignore | 1 + Makefile | 34 ------------- Makefile.shim | 62 ------------------------ README.md | 12 +++-- aws/net/.gitignore | 3 ++ aws/net/Makefile | 60 +++++++++++++++++++++++ aws/net/handler.go | 12 +++++ aws/net/net_handler.go | 2 +- aws/net/net_handler_test.go | 6 +-- serverless.yml => aws/net/serverless.yml | 6 +-- handler.go | 20 -------- 11 files changed, 88 insertions(+), 130 deletions(-) delete mode 100644 Makefile delete mode 100644 Makefile.shim create mode 100644 aws/net/.gitignore create mode 100644 aws/net/Makefile create mode 100644 aws/net/handler.go rename serverless.yml => aws/net/serverless.yml (68%) delete mode 100644 handler.go diff --git a/.gitignore b/.gitignore index 3ad564a..14d0040 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .idea/ handler.so handler.zip +.env \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index 737ad07..0000000 --- a/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -IMAGE_LAMBDA_GO=eawsy/aws-lambda-go-shim - -# serverless.yml env vars -ENV ?= dev -AWS_DEFAULT_REGION ?= ap-southeast-2 -AWS_PROFILE ?= default - -all: clean dist deploy invoke -.PHONY: all - -deps: - go get -u -d github.com/eawsy/aws-lambda-go-core/... - docker pull eawsy/aws-lambda-go-shim -.PHONY: deps - -clean: - make -f Makefile.shim clean -.PHONY: clean - -dist: - make -f Makefile.shim docker - -# serverless targets -deploy: - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} ENV=${ENV} sls deploy -.PHONY: deploy - -invoke: - curl -v $(shell AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} ENV=${ENV} sls info | grep GET | cut -f5 -d" ") -.PHONY: invoke - -delete: - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} ENV=${ENV} sls remove -v -.PHONY: delete diff --git a/Makefile.shim b/Makefile.shim deleted file mode 100644 index ab6830e..0000000 --- a/Makefile.shim +++ /dev/null @@ -1,62 +0,0 @@ -# -# This is free and unencumbered software released into the public domain. -# -# Anyone is free to copy, modify, publish, use, compile, sell, or -# distribute this software, either in source code form or as a compiled -# binary, for any purpose, commercial or non-commercial, and by any -# means. -# -# In jurisdictions that recognize copyright laws, the author or authors -# of this software dedicate any and all copyright interest in the -# software to the public domain. We make this dedication for the benefit -# of the public at large and to the detriment of our heirs and -# successors. We intend this dedication to be an overt act of -# relinquishment in perpetuity of all present and future rights to this -# software under copyright law. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -# For more information, please refer to -# - -SHELL := /bin/bash - -HANDLER ?= handler -PACKAGE ?= $(HANDLER) -GOPATH ?= $(HOME)/go - -WORKDIR = $(CURDIR:$(GOPATH)%=/go%) -ifeq ($(WORKDIR),$(CURDIR)) - WORKDIR = /tmp -endif - -docker: - docker run --rm \ - -e HANDLER=$(HANDLER) \ - -e PACKAGE=$(PACKAGE) \ - -v $(GOPATH):/go \ - -v $(CURDIR):/tmp \ - -w $(WORKDIR) \ - eawsy/aws-lambda-go-shim:latest make -f Makefile.shim all - -all: build pack perm - -build: - @go build -buildmode=plugin -ldflags='-w -s' -o $(HANDLER).so - -pack: - @pack $(HANDLER) $(HANDLER).so $(PACKAGE).zip - -perm: - @chown $(shell stat -c '%u:%g' .) $(HANDLER).so $(PACKAGE).zip - -clean: - @rm -rf $(HANDLER) $(HANDLER).so $(PACKAGE).zip - -.PHONY: docker all build pack perm clean diff --git a/README.md b/README.md index 38e67c7..d963c85 100644 --- a/README.md +++ b/README.md @@ -48,11 +48,17 @@ strategic Microservices. Serving 1M+ customers with up to 500CCU. ## Usage -Clone locally into your own Serverless project: +Install locally into your own Serverless project. For a generic event driven service, use: serverless install \ - -u https://github.com/yunspace/serverless-golang \ - -n my-golang-project + -u https://github.com/yunspace/serverless-golang/aws/event \ + -n my-golang-event-project + +For a `go/net` driven project, use: + + serverless install \ + -u https://github.com/yunspace/serverless-golang/net/event \ + -n my-golang-net-project Prior to running, you should have `go`, `make` and `docker` installed. Then once in your project directory run this to get all the build dependencies: diff --git a/aws/net/.gitignore b/aws/net/.gitignore new file mode 100644 index 0000000..3678432 --- /dev/null +++ b/aws/net/.gitignore @@ -0,0 +1,3 @@ +.serverless +handler.so +handler.zip diff --git a/aws/net/Makefile b/aws/net/Makefile new file mode 100644 index 0000000..7df4eaa --- /dev/null +++ b/aws/net/Makefile @@ -0,0 +1,60 @@ +IMAGE_LAMBDA_GO=eawsy/aws-lambda-go-shim:latest + +# serverless.yml env vars +ENV ?= dev +AWS_DEFAULT_REGION ?= ap-southeast-2 +AWS_PROFILE ?= default + +HANDLER ?= handler +PACKAGE ?= $(HANDLER) +GOPATH ?= $(HOME)/go + +all: clean dist deploy +.PHONY: all + +# lambda shim targets +clean: + @rm -rf $(HANDLER) $(HANDLER).so $(PACKAGE).zip +.PHONY: clean + +deps: + @go get -u -d github.com/eawsy/aws-lambda-go-core/... + @docker pull $(IMAGE_LAMBDA_GO) +.PHONY: deps + +dist: build pack + +build: + @go build -buildmode=plugin -ldflags='-w -s' -o $(HANDLER).so + +pack: + @pack $(HANDLER) $(HANDLER).so $(PACKAGE).zip + @chown $(shell stat -c '%u:%g' .) $(HANDLER).so $(PACKAGE).zip + +# serverless targets +deploy: + AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} ENV=${ENV} sls deploy +.PHONY: deploy + +remove: + AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} ENV=${ENV} sls remove -v +.PHONY: delete + +# dockerised target +dockerDist: + $(call docker, make dist) +.PHONY: dockerAll + +dockerShell: + $(call docker, bash) +.PHONY: dockerShell + +define docker + docker run --rm -ti \ + -e HANDLER=$(HANDLER) \ + -e PACKAGE=$(PACKAGE) \ + -v $(GOPATH):/go \ + -v $(CURDIR):/tmp \ + -w /tmp \ + $(IMAGE_LAMBDA_GO) $1 +endef \ No newline at end of file diff --git a/aws/net/handler.go b/aws/net/handler.go new file mode 100644 index 0000000..f2588c7 --- /dev/null +++ b/aws/net/handler.go @@ -0,0 +1,12 @@ +package main + +import ( + "github.com/eawsy/aws-lambda-go-net/service/lambda/runtime/net/apigatewayproxy" +) + +// Handle is the exported handler called by AWS Lambda. +var NetHandle apigatewayproxy.Handler + +func init() { + NetHandle = NewNetHandler() +} diff --git a/aws/net/net_handler.go b/aws/net/net_handler.go index 5de9661..ec10475 100644 --- a/aws/net/net_handler.go +++ b/aws/net/net_handler.go @@ -1,4 +1,4 @@ -package net +package main import ( "net/http" diff --git a/aws/net/net_handler_test.go b/aws/net/net_handler_test.go index 0fe2262..0a01373 100644 --- a/aws/net/net_handler_test.go +++ b/aws/net/net_handler_test.go @@ -1,11 +1,7 @@ -package net +package main import "testing" -func TestNewNetHandler(t *testing.T) { - -} - func TestCustomHeader(t *testing.T) { } \ No newline at end of file diff --git a/serverless.yml b/aws/net/serverless.yml similarity index 68% rename from serverless.yml rename to aws/net/serverless.yml index 73539e9..b8566a9 100644 --- a/serverless.yml +++ b/aws/net/serverless.yml @@ -11,8 +11,4 @@ functions: hello-net: handler: handler.NetHandle events: - - http: GET hello-net - hello-events: - handler: handler.EventHandle - events: - - http: GET hello-events \ No newline at end of file + - http: GET hello-net \ No newline at end of file diff --git a/handler.go b/handler.go deleted file mode 100644 index 9c9eb86..0000000 --- a/handler.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import ( - "github.com/eawsy/aws-lambda-go-net/service/lambda/runtime/net/apigatewayproxy" - "github.com/eawsy/aws-lambda-go-core/service/lambda/runtime" - "github.com/yunspace/serverless-golang/aws/net" - "github.com/yunspace/serverless-golang/aws/event" - "github.com/eawsy/aws-lambda-go-event/service/lambda/runtime/event/apigatewayproxyevt" -) - -// Handle is the exported handler called by AWS Lambda. -var NetHandle apigatewayproxy.Handler - -func init() { - NetHandle = net.NewNetHandler() -} - -func EventHandle(evt *apigatewayproxyevt.Event, ctx *runtime.Context) (interface{}, error) { - return event.HandlHTTPEvent(evt, ctx) -} \ No newline at end of file From 0b7da26dfbe722b6ed66bae83a169ad419f46f7c Mon Sep 17 00:00:00 2001 From: Yunspace Date: Sun, 23 Apr 2017 23:00:08 +1000 Subject: [PATCH 4/6] #5 working event function without API Gateway --- aws/event/.gitignore | 3 ++ aws/event/Makefile | 60 +++++++++++++++++++++++++++++++++ aws/event/event_handler.go | 10 +++--- aws/event/event_handler_test.go | 28 +++++++++++++++ aws/event/handler.go | 10 ++++++ aws/event/models.go | 11 +++--- aws/event/serverless.yml | 14 ++++++++ aws/net/serverless.yml | 2 +- 8 files changed, 126 insertions(+), 12 deletions(-) create mode 100644 aws/event/.gitignore create mode 100644 aws/event/Makefile create mode 100644 aws/event/event_handler_test.go create mode 100644 aws/event/handler.go create mode 100644 aws/event/serverless.yml diff --git a/aws/event/.gitignore b/aws/event/.gitignore new file mode 100644 index 0000000..3678432 --- /dev/null +++ b/aws/event/.gitignore @@ -0,0 +1,3 @@ +.serverless +handler.so +handler.zip diff --git a/aws/event/Makefile b/aws/event/Makefile new file mode 100644 index 0000000..7df4eaa --- /dev/null +++ b/aws/event/Makefile @@ -0,0 +1,60 @@ +IMAGE_LAMBDA_GO=eawsy/aws-lambda-go-shim:latest + +# serverless.yml env vars +ENV ?= dev +AWS_DEFAULT_REGION ?= ap-southeast-2 +AWS_PROFILE ?= default + +HANDLER ?= handler +PACKAGE ?= $(HANDLER) +GOPATH ?= $(HOME)/go + +all: clean dist deploy +.PHONY: all + +# lambda shim targets +clean: + @rm -rf $(HANDLER) $(HANDLER).so $(PACKAGE).zip +.PHONY: clean + +deps: + @go get -u -d github.com/eawsy/aws-lambda-go-core/... + @docker pull $(IMAGE_LAMBDA_GO) +.PHONY: deps + +dist: build pack + +build: + @go build -buildmode=plugin -ldflags='-w -s' -o $(HANDLER).so + +pack: + @pack $(HANDLER) $(HANDLER).so $(PACKAGE).zip + @chown $(shell stat -c '%u:%g' .) $(HANDLER).so $(PACKAGE).zip + +# serverless targets +deploy: + AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} ENV=${ENV} sls deploy +.PHONY: deploy + +remove: + AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} ENV=${ENV} sls remove -v +.PHONY: delete + +# dockerised target +dockerDist: + $(call docker, make dist) +.PHONY: dockerAll + +dockerShell: + $(call docker, bash) +.PHONY: dockerShell + +define docker + docker run --rm -ti \ + -e HANDLER=$(HANDLER) \ + -e PACKAGE=$(PACKAGE) \ + -v $(GOPATH):/go \ + -v $(CURDIR):/tmp \ + -w /tmp \ + $(IMAGE_LAMBDA_GO) $1 +endef \ No newline at end of file diff --git a/aws/event/event_handler.go b/aws/event/event_handler.go index 8bb12a7..791247d 100644 --- a/aws/event/event_handler.go +++ b/aws/event/event_handler.go @@ -1,15 +1,17 @@ -package event +package main import ( "github.com/eawsy/aws-lambda-go-core/service/lambda/runtime" "github.com/eawsy/aws-lambda-go-event/service/lambda/runtime/event/apigatewayproxyevt" + "log" ) -func HandlHTTPEvent(evt *apigatewayproxyevt.Event, ctx *runtime.Context) (interface{}, error) { - +func handlAPIEvent(evt *apigatewayproxyevt.Event, ctx *runtime.Context) (*Response, error) { + log.Println(evt) response := &Response { StatusCode: 200, - Body: "Hello, serverless-golang!", + Body: &APIBody{"Hello, serverless-golang!", evt.Body}, + Headers: make(map[string]string), } response.Headers["X-Powered-By"] = "serverless-golang" diff --git a/aws/event/event_handler_test.go b/aws/event/event_handler_test.go new file mode 100644 index 0000000..880a7d5 --- /dev/null +++ b/aws/event/event_handler_test.go @@ -0,0 +1,28 @@ +package main + +import ( + "testing" + "github.com/eawsy/aws-lambda-go-event/service/lambda/runtime/event/apigatewayproxyevt" + "github.com/eawsy/aws-lambda-go-core/service/lambda/runtime" + "github.com/stretchr/testify/assert" +) + +func TestCustomHeader(t *testing.T) { + // when + r, err := handlAPIEvent(&apigatewayproxyevt.Event{}, &runtime.Context{}) + + // then + assert.NoError(t, err) + assert.Equal(t, "serverless-golang", r.Headers["X-Powered-By"]) +} + +func TestAPIBody(t *testing.T) { + // when + r, err := handlAPIEvent(&apigatewayproxyevt.Event{Body: "input"}, &runtime.Context{}) + + // then + assert.NoError(t, err) + assert.IsType(t, &Response{}, r) + //response, _ := r.(*Response) + assert.Equal(t, &APIBody{"Hello, serverless-golang!", "input"}, r.Body) +} diff --git a/aws/event/handler.go b/aws/event/handler.go new file mode 100644 index 0000000..5ce7049 --- /dev/null +++ b/aws/event/handler.go @@ -0,0 +1,10 @@ +package main + +import ( + "github.com/eawsy/aws-lambda-go-event/service/lambda/runtime/event/apigatewayproxyevt" + "github.com/eawsy/aws-lambda-go-core/service/lambda/runtime" +) + +func EventHandle(evt *apigatewayproxyevt.Event, ctx *runtime.Context) (interface{}, error) { + return handlAPIEvent(evt, ctx) +} diff --git a/aws/event/models.go b/aws/event/models.go index 88c6af3..63b67fb 100644 --- a/aws/event/models.go +++ b/aws/event/models.go @@ -1,16 +1,13 @@ -package event +package main -type Body struct { +// special format need by API Gateway response body +type APIBody struct { Message string `json:"message"` Input string `json:"input"` } -func NewBody(m string, e string) *Body { - return &Body{Message: m, Input: e} -} - type Response struct { StatusCode int `json:"statusCode"` Headers map[string]string `json:"headers"` - Body string `json:"body"` + Body *APIBody `json:"body"` } \ No newline at end of file diff --git a/aws/event/serverless.yml b/aws/event/serverless.yml new file mode 100644 index 0000000..4b2fae1 --- /dev/null +++ b/aws/event/serverless.yml @@ -0,0 +1,14 @@ +service: serverless-golang-event +package: + artifact: handler.zip +provider: + name: aws + runtime: python2.7 + stage: ${env:ENV} + region: ${env:AWS_DEFAULT_REGION} + profile: ${env:AWS_PROFILE} +functions: + hello-event: + handler: handler.EventHandle + events: + - http: GET hello-event \ No newline at end of file diff --git a/aws/net/serverless.yml b/aws/net/serverless.yml index b8566a9..c647696 100644 --- a/aws/net/serverless.yml +++ b/aws/net/serverless.yml @@ -1,4 +1,4 @@ -service: serverless-golang +service: serverless-golang-net package: artifact: handler.zip provider: From 72c79abeded7688d70c4282099d6ea55fe1b6a76 Mon Sep 17 00:00:00 2001 From: Yunspace Date: Sun, 23 Apr 2017 23:16:12 +1000 Subject: [PATCH 5/6] #5 working event function with API Gateway --- aws/event/event_handler.go | 7 +++---- aws/event/event_handler_test.go | 4 ++-- aws/event/models.go | 10 +++++++++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/aws/event/event_handler.go b/aws/event/event_handler.go index 791247d..ea0a9ee 100644 --- a/aws/event/event_handler.go +++ b/aws/event/event_handler.go @@ -8,13 +8,12 @@ import ( func handlAPIEvent(evt *apigatewayproxyevt.Event, ctx *runtime.Context) (*Response, error) { log.Println(evt) - response := &Response { + response := &Response{ StatusCode: 200, - Body: &APIBody{"Hello, serverless-golang!", evt.Body}, - Headers: make(map[string]string), + Headers: make(map[string]string), } + response.SetBody(&APIBody{"Hello, serverless-golang!", evt.Body}) response.Headers["X-Powered-By"] = "serverless-golang" return response, nil } - diff --git a/aws/event/event_handler_test.go b/aws/event/event_handler_test.go index 880a7d5..e24290e 100644 --- a/aws/event/event_handler_test.go +++ b/aws/event/event_handler_test.go @@ -18,11 +18,11 @@ func TestCustomHeader(t *testing.T) { func TestAPIBody(t *testing.T) { // when - r, err := handlAPIEvent(&apigatewayproxyevt.Event{Body: "input"}, &runtime.Context{}) + r, err := handlAPIEvent(&apigatewayproxyevt.Event{Body: "GET"}, &runtime.Context{}) // then assert.NoError(t, err) assert.IsType(t, &Response{}, r) //response, _ := r.(*Response) - assert.Equal(t, &APIBody{"Hello, serverless-golang!", "input"}, r.Body) + assert.Equal(t, "{\"message\":\"Hello, serverless-golang!\",\"input\":\"GET\"}", r.Body) } diff --git a/aws/event/models.go b/aws/event/models.go index 63b67fb..1b0cdbc 100644 --- a/aws/event/models.go +++ b/aws/event/models.go @@ -1,5 +1,7 @@ package main +import "encoding/json" + // special format need by API Gateway response body type APIBody struct { Message string `json:"message"` @@ -9,5 +11,11 @@ type APIBody struct { type Response struct { StatusCode int `json:"statusCode"` Headers map[string]string `json:"headers"` - Body *APIBody `json:"body"` + Body string `json:"body"` +} + +// inspired by serverless-java +func (r *Response) SetBody(b *APIBody) { + bytes, _ := json.Marshal(b) + r.Body = string(bytes) } \ No newline at end of file From 43f670abef9045d001b17a3c7915ac95dc7da2cc Mon Sep 17 00:00:00 2001 From: Yunspace Date: Sun, 23 Apr 2017 23:19:43 +1000 Subject: [PATCH 6/6] #5 updated README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d963c85..2e97f70 100644 --- a/README.md +++ b/README.md @@ -71,9 +71,9 @@ used for authentication on AWS. Then deploy the function by running this command: - make + make clean dockerDist deploy To uninstall and clean up everything you just need to run: - make clean delete + make clean remove