我正在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)
}
在这种情况下,每次都会触发第一个事件
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处理一种事件
希望这可以帮助。