Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 使用Golang从Lambda调用AppSync突变_Amazon Web Services_Go_Aws Lambda_Aws Appsync - Fatal编程技术网

Amazon web services 使用Golang从Lambda调用AppSync突变

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对来自

我试图调用lambda的一个突变(特别是使用golang)。我使用了
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)