gpt4 book ai didi

go - 如何在无服务器 lambda 数据源中捕获 AWS AppSync 事件

转载 作者:行者123 更新时间:2023-12-01 22:25:42 25 4
gpt4 key购买 nike

我正在为 AppSync API 使用无服务器 lambda 数据源

我在我的 lambda 函数中尝试了以下代码

package main

import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"log"
)

func main() {
lambda.Start(Handler)
}
// Handler is your serverless lambda function
func Handler(ctx context.Context, event events.AppSyncResolverTemplate) error {
log.Println(ctx)
log.Println(event)
return nil
}

当我对 API 进行查询时,上下文被正确记录,但事件被记录为 { []}
我尝试更改 lambda 代码以使用一个空接口(interface)的事件
package main

import (
"context"
"github.com/aws/aws-lambda-go/lambda"
"log"
)


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

// Handler is your serverless lambda function
func Handler(ctx context.Context, event interface{}) error {
log.Println(ctx)
log.Println(event)
return nil
}

现在查询API我可以看到日志中有一张 map map[field:getPerson arguments:map[personId:1]]
我的问题是应该在处理程序签名中使用什么有效类型来捕获 AppSync 事件?

最佳答案

如果您使用的是 2020 年 8 月推出的新 Direct Lambda Resolver (https://aws.amazon.com/blogs/mobile/appsync-direct-lambda/),那么直到今天都无法在当前 Golang AWS SDK 中的 Appsync 上找到事件类型。
它们只有 AppSyncResolverTemplate、AppSyncIAMIdentity 和 AppSyncCognitoIdentity 结构(https://github.com/aws/aws-lambda-go/blob/v1.16.0/events/appsync.go),因此如果您要使用直接 lambda 解析器,您必须自己解码传入请求。
到目前为止他们还没有这样做的原因是因为到目前为止,您可以使用模板解析器(在 appsync 内部)设计自己的架构,但现在 Direct Lambda 功能已经推出,我认为他们必须为此创建一个新的 AppSync 事件类型。
在那之前,我将与您分享我编写的代码,该代码是为了这个目的而逐段提取整个事件,希望为下一个遇到我情况的人节省一些时间。
***您会注意到这里没有错误处理,只是解码来自 AppSync 的 AWS 事件所需的代码;-)

package main

import (
"fmt"
"context"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-lambda-go/lambdacontext"
"log"
"encoding/json"
"bytes"
)

type Event struct {
Arguments map[string]string `json:"arguments"`
Identity string `json:"identity"`
Info struct {
FieldName string `json:"fieldName"`
ParentTypeName string `json:"parentTypeName"`
SelectionSetGraphQL string `json:"selectionSetGraphQL"`
SelectionSetList []string `json:"selectionSetList"`
Variables map[string]string `json:"variables"`
}
Prev string `json:"prev"`
Request struct {
Headers struct {
Accept string `json:"accept"`
AcceptEncoding string `json:"accept-encoding"`
AcceptLanguage string `json:"accept-language"`
CloudfrontForwardedProto string `json:"cloudfront-forwarded-proto"`
CloudfrontIsDesktopViewer string `json:"cloudfront-is-desktop-viewer"`
CloudfrontIsMobileViewer string `json:"cloudfront-is-mobile-viewer"`
CloudfrontIsSmarttvViewer string `json:"cloudfront-is-smarttv-viewer"`
CloudfrontViewerCountry string `json:"cloudfront-viewer-country"`
CloudfrontIsTabletViewer string `json:"cloudfront-is-tablet-viewer"`
ContentLength string `json:"content-length"`
ContentType string `json:"content-type"`
Host string `json:"host"`
Hrigin string `json:"origin"`
Referer string `json:"Referer"`
SecFetchDest string `json:"sec-fetch-dest"`
SecFetchMode string `json:"sec-fetch-mode"`
SecFetchSite string `json:"sec-fetch-site"`
UserAgent string `json:"user-agent"`
Via string `json:"via"`
XAmzCfID string `json:"x-amz-cf-id"`
XAmzUserAgent string `json:"x-amz-user-agent"`
XAmznTraceID string `json:"x-amzn-trace-id"`
XApiKey string `json:"x-api-key"`
XForwardedFor string `json:"x-forwarded-for"`
XForwardedPort string `json:"x-forwarded-port"`
XForwardedProto string `json:"x-forwarded-proto"`
}
}
Source string `json:"source"`
Stash map[string]string `json:"stash"`
}


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

func HandleLambdaEvent(ctx context.Context, event interface{}) error {

fmt.Printf("---------------{LAMBDA ctx Start}---------------\n")
// Event context
lc, _ := lambdacontext.FromContext(ctx)
//fmt.Println("Context:",ctx)
fmt.Println("AwsRequestID:",lc.AwsRequestID)
fmt.Println("Identity:",lc.Identity)
fmt.Println("InvokedFunctionArn:",lc.InvokedFunctionArn)
fmt.Println("ClientContext:",lc.ClientContext)
fmt.Println("ClientContext.Client:",lc.ClientContext.Client)
fmt.Println("CognitoIdentityID:",lc.Identity.CognitoIdentityID)
fmt.Println("CognitoIdentityPoolID:",lc.Identity.CognitoIdentityPoolID)
deadline, _ := ctx.Deadline()
fmt.Println("ContextDeadline:",deadline)


fmt.Printf("---------------{LAMBDA AWS Event Start}---------------\n")
log.Println(event)


fmt.Printf("---------------{Marshal Event Start}---------------\n")
//eventJsonm, _ := json.Marshal(event)
eventJsonm, _ := json.MarshalIndent(event, "", " ")
log.Printf("EVENT Marsal: %s", eventJsonm)


fmt.Printf("---------------{Decode Start}---------------\n")
var Event Event
r := bytes.NewReader([]byte(eventJsonm))
json.NewDecoder(r).Decode(&Event)
fmt.Println("Arguments:",Event.Arguments)
fmt.Println("Identity:",Event.Identity)
fmt.Println("Info.FieldName:",Event.Info.FieldName)
fmt.Println("Info.ParentTypeName:",Event.Info.ParentTypeName)
fmt.Println("Info.SelectionSetGraphQL:",Event.Info.SelectionSetGraphQL)
fmt.Println("Info.SelectionSetList:",Event.Info.SelectionSetList)
fmt.Println("Info.Variables:",Event.Info.Variables)
fmt.Println("Prev:",Event.Prev)
// fmt.Println("Event.Request.Headers:",Event.Request.Headers)
// fmt.Println("Event.Request.Headers.Accept:",Event.Request.Headers.Accept)
// fmt.Println("Event.Request.Headers.AcceptEncoding:",Event.Request.Headers.AcceptEncoding)
// fmt.Println("Event.Request.Headers.AcceptLanguage:",Event.Request.Headers.AcceptLanguage)
// ...

fmt.Println("Source:",Event.Source)
fmt.Println("Stash:",Event.Stash)


return nil
}
享受 ;-)

关于go - 如何在无服务器 lambda 数据源中捕获 AWS AppSync 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60039002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com