Go程序的项目结构在AWS Lambda上运行

Mr.*_* 14 8 go aws-lambda

我在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函数的大小应该很小,最好处理一个功能,但似乎需要创建很多项目并且很难管理.我理解正确吗?

Neb*_*ril 5

您的handlerfunc 是您的入口点,但由于您可以使用任意 json 数据调用它,因此您可以handler根据发送到处理程序的数据从您的内部调用多个函数。

APIGatewayProxyRequestBody场。你在此基础上做什么取决于你。

lambda (AFAIU) 的想法是让最少的二进制文件只做一件事。从 lambda 内部实现具有请求路由的复杂应用程序对我来说似乎是在滥用模型,但它是可行的。


Mr.*_* 14 5

这是我到目前为止想出的

项目文件夹结构:

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,否则将无法工作。