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

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

我正在 Golang 中构建一个 AWS Lambda 函数,用于将内容从 n 个 S3 存储桶复制到 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)
}

在这种情况下,每次都会触发第一个事件 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 完全支持函数的多个触发器?

最佳答案

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

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 最好只用于处理一种类型的事件

希望这对您有所帮助。

关于amazon-web-services - 如何在 Golang 的 AWS Lambda 中支持多个触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49516525/

相关文章:

go - kubernetes Controller 的单元测试

laravel - 需要安装 League/flysystem-aws-s3-v3 联盟/flysystem ^2.0 但卡在 1.1.3 时出现问题

amazon-web-services - AWS::CloudFormation::Init 是如何工作的?

algorithm - 我应该在代码中更改什么以生成从 0 1 1 开始的斐波那契数列

amazon-web-services - docker容器中的haproxy

go - 错误消息 :protoc-gen-go: Plugin failed with status code 1

django - 在 Heroku 上部署 Django/静态文件的正确方法

python - “s3.Bucket”对象没有属性 'put' : AttributeError

java - 哈希和保护传输中的数据

java - 在特定帐户中创建 s3 存储桶并使用 JAVA 将对象放入其中的最佳实践?