如何在Golang中支持AWS Lambda中的多个触发器?

时间:2018-03-27 15:09:11

标签: amazon-web-services go amazon-s3 aws-lambda aws-sdk-go

我正在Golang中构建一个AWS Lambda函数,将内容从n复制到m个桶。需要支持S3触发以及从存储所有源S3存储桶更改的SQS获取数据。代码可以在这里找到:https://github.com/maknahar/s3copy

我试过以下:

func main() {
    lambda.Start(ProcessIncomingS3Events)
    lambda.Start(ProcessIncomingEvents)
}

func ProcessIncomingS3Events(event events.S3Event) error {
    ...
    log.Println("Got S3 Event")
    return processS3Trigger(config, event)
}

func ProcessIncomingEvents() error {
    ...
    log.Println("Defaulting to SQS")
    return processSQSMessage(config)
}

在这种情况下,每次都会触发第一个事件ProcessIncomingS3Events

我也试过以下

func main() {
    lambda.Start(ProcessIncomingEvents)
}

func ProcessIncomingEvents(event interface{}) error {
    ...
    switch request := event.(type) {
    case events.S3Event:
        log.Println("Got S3 Event")
        return processS3Trigger(config, request)

    case types.Nil:
        log.Println("Defaulting to SQS")
        return processSQSMessage(config)

    default:
        log.Println("Could not find the event type")

    }

    return nil
}

在这种情况下,Lambda无法检测到类型,并且每次触发都会记录Could not find the event type

有没有办法通过AWS SDK支持多个触发功能?

3 个答案:

答案 0 :(得分:1)

我通过实现aws Handler接口实现了监听多个事件,它定义了一个方法

Invoke(ctx context.Context, payload []byte) ([]byte, error)

我实现了如下的多事件处理程序

type Handler struct {
//add global variables or context information that your handler may need
}

func (h Handler) Invoke(ctx context.Context, data []byte) ([]byte, error) {
  //for demonstration purposes, not the best way to handle
  apiGatewayEvent := new(events.APIGatewayProxyRequest)
  if err := json.Unmarshal(data, apiGatewayEvent); err != nil {
    log.Println("Not a api gateway event")
  }
  snsEvent := new(events.SNSEvent)
  if err := json.Unmarshal(data, snsEvent); err != nil {
    log.Println("Not a sns event")
  }
  return nil, nil
}

func main() {
  lambda.StartHandler(Handler{})
}

如您所见,您可以获取任何事件的原始字节并根据需要进行处理,从而使您可以监听具有相同lambda的任何aws事件。但是,在使用此方法之前请仔细考虑,因为如上所述,最好使用lambda来处理一种类型的事件

希望这会有所帮助。

答案 1 :(得分:0)

我不是GoLang的家伙。只是猜测正常的编程思维。

在方法一中,您在第一个语句中直接调用ProcessIncomingS3Events,因此每次调用它时都是如此。

阅读this - Lambda函数处理程序(Go)

在上面的链接中,作者正在解析事件的名称字段。同样,您可以检查S3事件中始终存在的任何字段,例如“eventSource”:“aws:s3”(S3事件结构见here

如果存在,则S3事件为其他。或者您也可以检查SQS事件的字段。

HIH

答案 2 :(得分:0)

您可以配置多个事件源以触发一个或多个Lambda函数。

但是,在Go中lambda.Start调用是阻塞的,因此编写处理多种事件类型的单个函数并不容易。强烈建议您为每个事件源创建单独的Lambda函数。

惯用的Go解决方案是在主包中定义一次函数逻辑,并编写多个带有源事件并调用函数的程序。所以项目布局将是:

  • s3copy / main.go
  • s3copy /处理程序/ S3 / main.go
  • s3copy /处理程序/ SQS / main.go

请参阅我的boilerplate Lambda and Go app以获取示例项目布局和Makefile。