Amazon web services 使用Golang从Lambda调用AppSync突变
我试图调用lambda的一个突变(特别是使用golang)。我使用了Amazon web services 使用Golang从Lambda调用AppSync突变,amazon-web-services,go,aws-lambda,aws-appsync,Amazon Web Services,Go,Aws Lambda,Aws Appsync,我试图调用lambda的一个突变(特别是使用golang)。我使用了AWS\u IAM作为AppSync API的身份验证方法。我还向lambda授予appsync:GraphQL权限 但是,在查看此处的文档后: 我找不到任何关于如何从库中调用appsync的文档。有人能给我指一下这里的正确方向吗 另外,我不想向lambda查询或订阅任何其他内容。这只是一个突变 谢谢 ------更新------- 感谢@thomasmichaelwallace通知我使用 现在的问题是如何使用aws v4对来自
AWS\u IAM
作为AppSync API的身份验证方法。我还向lambda授予appsync:GraphQL
权限
但是,在查看此处的文档后:
我找不到任何关于如何从库中调用appsync的文档。有人能给我指一下这里的正确方向吗
另外,我不想向lambda查询或订阅任何其他内容。这只是一个突变
谢谢
------更新-------
感谢@thomasmichaelwallace通知我使用
现在的问题是如何使用aws v4对来自该软件包的请求进行签名?问题在于API/库旨在帮助您创建/更新应用程序同步实例 如果您想要实际调用它们,那么您需要发布到GraphQL端点 最简单的测试方法是登录AWS AppSync控制台,按下侧栏中的“查询”按钮,然后输入并运行您的应用程序 我对go不太在行,但从我所看到的情况来看,golang中有GraphQL的客户端库(例如)
如果您使用的是IAM,那么您需要使用v4签名对请求进行签名(有关详细信息,请参阅本文:)我找到了一种使用普通
http.request
和AWS v4签名的方法。(感谢@thomasmichaelwallace指出这种方法)
除此之外,您可以从Lambda获取或发布到AppSync GraphQL端点,并且您需要按照上面提到的答案对请求进行sigv4签名。您提到的go客户端是大多数AWS服务的go控制平面客户端(对于AppSync,它为您的AppSync实体提供CRUD操作)。您能否提供一个示例,说明如何从中签署请求?我一直在尝试,但没有成功谢谢你给我指明了正确的方向(http请求而不是使用aws库)!我找到了一种使用普通http请求的方法(虽然不优雅)。如果你想让你的答案被接受(或不被接受……这取决于你),请举例说明如何使用这些库,这样人们就可以直接看到你的答案,而不是我的:)我看了看(正如我所说,围棋不是一种我非常熟悉的语言),似乎是因为你必须知道要签名的主体,你必须在提出请求之前签名,你不能使用那个库,你必须自己做成形。是的,我也意识到你必须包括身体。我查看了其他graphql库,它似乎也遵循相同的模式(您看不到主体)。但是非常感谢!我知道从现在开始该怎么办:)我正在创建一个专门用于appsync的库(它仅供内部使用)。我会更新这个问题,如果我发现另一个库,可以用于此!它的工作就像一个迷人的兄弟,谢谢你救了我一天。我使用了与Firebase令牌关联的OpenID连接,然后我只设置了到我的Firebase应用程序的颁发者URL链接,而不使用aws v4签名者
client := new(http.Client)
// construct the query
query := AppSyncPublish{
Query: `
mutation ($userid: ID!) {
publishMessage(
userid: $userid
){
userid
}
}
`,
Variables: PublishInput{
UserID: "wow",
},
}
b, err := json.Marshal(&query)
if err != nil {
fmt.Println(err)
}
// construct the request object
req, err := http.NewRequest("POST", os.Getenv("APPSYNC_URL"), bytes.NewReader(b))
if err != nil {
fmt.Println(err)
}
req.Header.Set("Content-Type", "application/json")
// get aws credential
config := aws.Config{
Region: aws.String(os.Getenv("AWS_REGION")),
}
sess := session.Must(session.NewSession(&config))
//sign the request
signer := v4.NewSigner(sess.Config.Credentials)
signer.Sign(req, bytes.NewReader(b), "appsync", "ap-southeast-1", time.Now())
//FIRE!!
response, _ := client.Do(req)
//print the response
buf := new(bytes.Buffer)
buf.ReadFrom(response.Body)
newStr := buf.String()
fmt.Printf(newStr)