Skip to content
This repository was archived by the owner on Dec 11, 2023. It is now read-only.

Commit 0a086ec

Browse files
authored
Merge pull request #12 from triggermesh/apigateway
Apigateway
2 parents ac94b2f + 3ffb275 commit 0a086ec

File tree

138 files changed

+7498
-11
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

138 files changed

+7498
-11
lines changed

Gopkg.lock

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[[constraint]]
2+
name = "github.com/aws/aws-lambda-go"
3+
version = "1.6.0"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[![CircleCI](https://circleci.com/gh/triggermesh/aws-custom-runtime.svg?style=shield)](https://circleci.com/gh/triggermesh/aws-custom-runtime)
1+
[![Go Report Card](https://goreportcard.com/badge/github.com/triggermesh/aws-custom-runtime)](https://goreportcard.com/report/github.com/triggermesh/aws-custom-runtime) [![CircleCI](https://circleci.com/gh/triggermesh/aws-custom-runtime.svg?style=shield)](https://circleci.com/gh/triggermesh/aws-custom-runtime)
22

33
## Running AWS Lambda Custom Runtime in Knative
44

main.go

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,8 @@ import (
2525
"strings"
2626
"sync"
2727
"time"
28-
)
2928

30-
const (
31-
numberOfinvokers = 8 // Number of bootstrap processes
32-
requestSizeLimit = 1e+7 // Request bosy size limit, 10Mb
33-
functionTTL = 3e+9 // Funtions deadline, 3 seconds
29+
"github.com/triggermesh/aws-custom-runtime/pkg/events/apiGateway"
3430
)
3531

3632
type message struct {
@@ -39,7 +35,16 @@ type message struct {
3935
data []byte
4036
}
4137

38+
type responseWrapper struct {
39+
http.ResponseWriter
40+
Body []byte
41+
}
42+
4243
var (
44+
numberOfinvokers = 8 // Number of bootstrap processes
45+
requestSizeLimit int64 = 5 // Request body size limit, Mb
46+
functionTTL int64 = 10 // Funtions deadline, seconds
47+
4348
tasks chan message
4449
results map[string]chan message
4550

@@ -60,6 +65,11 @@ var (
6065
}
6166
)
6267

68+
func (rw *responseWrapper) Write(data []byte) (int, error) {
69+
rw.Body = data
70+
return len(data), nil
71+
}
72+
6373
func setupEnv() error {
6474
environment["_HANDLER"], _ = os.LookupEnv("_HANDLER")
6575
environment["LAMBDA_TASK_ROOT"], _ = os.LookupEnv("LAMBDA_TASK_ROOT")
@@ -73,7 +83,9 @@ func setupEnv() error {
7383
}
7484

7585
func newTask(w http.ResponseWriter, r *http.Request) {
76-
body, err := ioutil.ReadAll(http.MaxBytesReader(w, r.Body, requestSizeLimit))
86+
requestSizeLimitInBytes := requestSizeLimit * 1e+6
87+
functionTTLInNanoSeconds := functionTTL * 1e+9
88+
body, err := ioutil.ReadAll(http.MaxBytesReader(w, r.Body, requestSizeLimitInBytes))
7789
if err != nil {
7890
http.Error(w, err.Error(), http.StatusInternalServerError)
7991
return
@@ -83,7 +95,7 @@ func newTask(w http.ResponseWriter, r *http.Request) {
8395
now := time.Now().UnixNano()
8496
task := message{
8597
id: fmt.Sprintf("%d", now),
86-
deadline: now + functionTTL,
98+
deadline: now + functionTTLInNanoSeconds,
8799
data: body,
88100
}
89101
fmt.Printf("<- %s %s\n", task.id, task.data)
@@ -97,7 +109,7 @@ func newTask(w http.ResponseWriter, r *http.Request) {
97109
tasks <- task
98110

99111
select {
100-
case <-time.After(time.Duration(functionTTL)):
112+
case <-time.After(time.Duration(functionTTLInNanoSeconds)):
101113
fmt.Printf("-> ! %s Deadline is reached\n", task.id)
102114
w.WriteHeader(http.StatusGone)
103115
w.Write([]byte(fmt.Sprintf("Deadline is reached, data %s", task.data)))
@@ -187,6 +199,45 @@ func responseHandler(w http.ResponseWriter, r *http.Request) {
187199
return
188200
}
189201

202+
func mapEvent(h http.Handler) http.Handler {
203+
eventType, _ := os.LookupEnv("EVENT")
204+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
205+
rw := responseWrapper{w, []byte{}}
206+
switch eventType {
207+
case "API_GATEWAY":
208+
apiGateway.Request(r)
209+
h.ServeHTTP(&rw, r)
210+
apiGateway.Response(w, rw.Body)
211+
default:
212+
h.ServeHTTP(w, r)
213+
}
214+
})
215+
}
216+
217+
func setLimits() {
218+
if v, ok := os.LookupEnv("INVOKER_COUNT"); ok {
219+
if vv, err := strconv.Atoi(v); err != nil {
220+
fmt.Printf("can't set invokers limit, using default value %d\n", numberOfinvokers)
221+
} else {
222+
numberOfinvokers = vv
223+
}
224+
}
225+
if v, ok := os.LookupEnv("REQUEST_SIZE_LIMIT"); ok {
226+
if vv, err := strconv.Atoi(v); err != nil {
227+
fmt.Printf("can't set request size limit, using default value %d\n", requestSizeLimit)
228+
} else {
229+
requestSizeLimit = int64(vv)
230+
}
231+
}
232+
if v, ok := os.LookupEnv("FUNCTION_TTL"); ok {
233+
if vv, err := strconv.Atoi(v); err != nil {
234+
fmt.Printf("can't set function ttl, using default value %d\n", functionTTL)
235+
} else {
236+
functionTTL = int64(vv)
237+
}
238+
}
239+
}
240+
190241
func api() error {
191242
apiRouter := http.NewServeMux()
192243
apiRouter.HandleFunc(awsEndpoint+"/init/error", initError)
@@ -200,6 +251,9 @@ func main() {
200251
results = make(map[string]chan message)
201252
defer close(tasks)
202253

254+
fmt.Println("Setting limits")
255+
setLimits()
256+
203257
fmt.Println("Setup env")
204258
if err := setupEnv(); err != nil {
205259
log.Fatalln(err)
@@ -210,8 +264,8 @@ func main() {
210264
log.Fatalln(api())
211265
}()
212266

213-
fmt.Println("Starting invokers")
214267
for i := 0; i < numberOfinvokers; i++ {
268+
fmt.Println("Starting bootstrap", i+1)
215269
go func() {
216270
if err := exec.Command("sh", "-c", environment["LAMBDA_TASK_ROOT"]+"/bootstrap").Run(); err != nil {
217271
log.Fatalln(err)
@@ -220,7 +274,8 @@ func main() {
220274
}
221275

222276
taskRouter := http.NewServeMux()
223-
taskRouter.HandleFunc("/", newTask)
277+
taskHandler := http.HandlerFunc(newTask)
278+
taskRouter.Handle("/", mapEvent(taskHandler))
224279
fmt.Println("Listening...")
225280
log.Fatalln(http.ListenAndServe(":8080", taskRouter))
226281
}

pkg/events/apiGateway/mapper.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package apiGateway
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"io/ioutil"
7+
"log"
8+
"net/http"
9+
"strings"
10+
11+
"github.com/aws/aws-lambda-go/events"
12+
)
13+
14+
func Request(r *http.Request) {
15+
event := events.APIGatewayProxyRequest{}
16+
body, err := ioutil.ReadAll(r.Body)
17+
if err != nil {
18+
log.Fatalln(err)
19+
}
20+
21+
event.Body = string(body)
22+
event.Headers = make(map[string]string)
23+
for k, v := range r.Header {
24+
event.Headers[k] = strings.Join(v, ",")
25+
}
26+
event.HTTPMethod = r.Method
27+
event.Path = r.URL.Path
28+
event.QueryStringParameters = make(map[string]string)
29+
for k, v := range r.URL.Query() {
30+
event.QueryStringParameters[k] = strings.Join(v, ",")
31+
}
32+
event.RequestContext = events.APIGatewayProxyRequestContext{}
33+
// event.Resource = ""
34+
// event.QueryStringParameters = make(map[string]string)
35+
// event.IsBase64Encoded = false
36+
js, err := json.Marshal(event)
37+
if err != nil {
38+
log.Fatalln(err)
39+
}
40+
r.Body = ioutil.NopCloser(bytes.NewBuffer(js))
41+
}
42+
43+
func Response(w http.ResponseWriter, data []byte) (int, error) {
44+
var js events.APIGatewayProxyResponse
45+
if err := json.Unmarshal(data, &js); err != nil {
46+
return 0, err
47+
}
48+
for k, v := range js.Headers {
49+
w.Header().Set(k, v)
50+
}
51+
w.WriteHeader(js.StatusCode)
52+
return w.Write([]byte(js.Body))
53+
}

vendor/github.com/aws/aws-lambda-go/.travis.yml

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/aws/aws-lambda-go/Gopkg.lock

Lines changed: 33 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/aws/aws-lambda-go/Gopkg.toml

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)