通常,Go (使用无服务器框架)中的AWS Lambda事件处理程序代码编码为:
package main
import (
"fmt"
"context"
"github.com/aws/aws-lambda-go/lambda"
)
type MyEvent struct {
Name string `json:"name"`
}
func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
return fmt.Sprintf("Hello %s!", name.Name ), nil
}
func main() {
lambda.Start(HandleRequest)
}
然后,serverless.yml
文件包含一个类似以下内容的部分:
skeleton-go-get:
name: skeleton-go-get
runtime: go1.x
handler: go-handler # <- This specifies a file, not a function.
events:
- http:
path: skeleton/go
method: get
^创建一个请求处理程序...但是现在我希望我的one Go脚本/程序包含HTTP GET和POST请求的事件处理程序,而不是为每个无服务器函数使用一个Go程序文件。
这在像Node.js,Ruby,Python这样的语言中是完全可能的,使用serverless.yml
指定处理程序文件中的哪个函数将用于哪个无服务器函数。例如(对于Python函数):
[...]
functions:
skeleton-python-get:
name: skeleton-python-get
handler: python-handler.handle_get # <- Specifies the HTTP GET handler.
events:
- http:
path: skeleton/python
method: get
skeleton-python-post:
name: skeleton-python-post
handler: python-handler.handle_post # <- Specifies the HTTP POST handler.
events:
- http:
path: skeleton/python
method: post
我不能把同样的技巧用在Go上。我尝试在main()
中包含适当的请求,但无济于事:
func HandleGetRequest(ctx context.Context, name MyEvent) (string, error) {
return fmt.Sprintf("Hello %s!", name.Name ), nil
}
func HandlePostRequest(ctx context.Context, name MyEvent) (string, error) {
return fmt.Sprintf("Hello %s!", name.Name ), nil
}
func main() {
lambda.Start(HandleGetRequest)
lambda.Start(HandlePostRequest) // <- Attempt to add another handler.
}
在serverless.yml
文件中为Go处理程序指定多个事件处理程序函数也不起作用:该函数不是处理程序声明的有效部分。
skeleton-go-get:
name: skeleton-go-get
runtime: go1.x
handler: go-handler.HandleGet # <- Attempt to specify a function.
events:
- http:
path: skeleton/go
method: get
skeleton-go-post:
name: skeleton-go-post
runtime: go1.x
handler: go-handler.HandlePost # <- Attempt to specify a function.
events:
- http:
path: skeleton/go
method: post
问:如何在一个Go程序中包含多个AWS Lambda事件处理程序(使用无服务器框架)?
发布于 2019-09-10 23:17:00
您可以对get
和post
使用相同的函数(和处理程序
skeleton-go:
name: skeleton-go
runtime: go1.x
handler: go-handler
events:
- http:
path: skeleton/go
method: get
- http:
path: skeleton/go
method: post
使用Go的built-in HTTP router或第三方的Gorilla Mux或Chi,如下面的示例代码所示(因为这是我手头上的东西)。从本质上讲,您正在构建一个Go HTTP服务器,但使用的是Lambda。因此,请遵循设置Go web服务器的详细信息,并查看AWS's API Gateway Proxy。
package main
import (
"context"
"net/http"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/go-chi/chi"
chiproxy "github.com/awslabs/aws-lambda-go-api-proxy/chi"
)
var adapter *chiproxy.ChiLambda
func GetSkeleton(w http.ResponseWriter, r *http.Request) {
...
}
func PostSkeletonToMom(w http.ResponseWriter, r *http.Request) {
...
}
func init() {
r := chi.NewRouter()
r.Get("/skeleton/go", GetSkeleton)
r.Post("/skeleton/go", PostSkeletonToMom)
adapter = chiproxy.New(r)
}
func lambdaHandler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
c, err := adapter.ProxyWithContext(ctx, req)
return c, err
}
func main() {
lambda.Start(lambdaHandler)
}
https://stackoverflow.com/questions/57872576
复制相似问题