我在AWS Compute Blog中找到了以下代码示例:
package main
import (
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
return events.APIGatewayProxyResponse{
StatusCode: 200,
Body: "Hello World",
}, nil
}
func main() {
lambda.Start(handler)
}
Run Code Online (Sandbox Code Playgroud)
由于lambda.Start只接受一个处理程序而Go程序的入口点是主函数,这是否意味着一个CodeStar项目只能由一个处理程序组成?
我理解lambda函数的大小应该很小,最好处理一个功能,但似乎需要创建很多项目并且很难管理.我理解正确吗?
您的handlerfunc 是您的入口点,但由于您可以使用任意 json 数据调用它,因此您可以handler根据发送到处理程序的数据从您的内部调用多个函数。
APIGatewayProxyRequest有Body场。你在此基础上做什么取决于你。
lambda (AFAIU) 的想法是让最少的二进制文件只做一件事。从 lambda 内部实现具有请求路由的复杂应用程序对我来说似乎是在滥用模型,但它是可行的。
这是我到目前为止想出的
项目文件夹结构:
project
folder1
main.go
folder2
main.go
buildspec.yml
template.yml
Run Code Online (Sandbox Code Playgroud)
构建规范.yml:
...
build:
commands:
- cd folder1
- go build -o main
- cd ../folder2
- go build -o main
....
Run Code Online (Sandbox Code Playgroud)
模板.yml:
....
Resources:
GetTest1:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./folder1
Handler: main
Runtime: go1.x
Role:
Fn::ImportValue:
!Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
Events:
GetEvent:
Type: Api
Properties:
Path: /test1
Method: get
GetTest2:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./folder2
Handler: main
Runtime: go1.x
Role:
Fn::ImportValue:
!Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
Events:
GetEvent:
Type: Api
Properties:
Path: /test2
Method: get
....
Run Code Online (Sandbox Code Playgroud)
需要注意的是,子目录中的所有 main.go 文件,即folder1/main.go, folder2/main.go,都需要在 中package main,否则将无法工作。