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

时间:2018-02-05 09:49:56

标签: 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)
}

由于lambda.Start只接受一个处理程序而Go程序的入口点是主函数,这是否意味着一个CodeStar项目只能包含一个处理程序?

我知道lambda函数的大小应该很小,最好处理一个功能,但似乎需要创建很多项目并且很难管理。我能正确理解吗?

2 个答案:

答案 0 :(得分:4)

您的handler func是您的入口点,但由于您可以使用任意json数据调用它,因此您可以根据发送给处理程序的数据在handler内调用多个函数。 / p>

APIGatewayProxyRequestBody字段。你做的是由你决定的。

lambda(AFAIU)的想法是拥有最小的二进制文件,但只做一件事。使用lambda中的请求路由实现复杂的应用程序似乎就像滥用模型一样,但它是可行的。

答案 1 :(得分:4)

这是我到目前为止所提出的内容

项目文件夹结构:

project
  folder1
    main.go
  folder2
    main.go
  buildspec.yml
  template.yml

buildspec.yml:

...

build:
    commands:
      - cd folder1
      - go build -o main
      - cd ../folder2
      - go build -o main
....

template.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   
....

请务必注意,子目录中的所有main.go文件,folder1/main.gofolder2/main.go都需要位于package main,否则无效。