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

May*_*tel 6 amazon-s3 go amazon-web-services aws-lambda aws-sdk-go

我正在Golang中构建一个AWS Lambda函数,该函数将内容从n复制到m个S3存储桶。需要支持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)
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,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
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Lambda无法检测到类型,并Could not find the event type在每个触发器中记录。

是否有一种方法可以通过AWS SDK完全支持该功能的多个触发器?

Pab*_*res 6

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

Invoke(ctx context.Context, payload []byte) ([]byte, error)
Run Code Online (Sandbox Code Playgroud)

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

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{})
}
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助。

  • 不起作用。我们收到错误:“json:无法将对象解组为 []uint8 类型的 Go 值:UnmarshalTypeError null”,而 bytes[] 表示正确的对象:S3Event (2认同)

rae*_*man 0

在方法一中,您直接调用ProcessIncomingS3Events,因此每次都被调用。

这个- Lambda 函数处理程序 (Go)

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

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