使用 Golang 从 Lambda 调用 AppSync Mutation
Calling AppSync Mutation from Lambda with Golang
我正在尝试从 lambda 调用一个突变(特别是使用 golang)。我使用 AWS_IAM
作为 AppSync API 的身份验证方法。我还向我的 lambda 授予 appsync:GraphQL
权限。
但是,在查看此处的文档后:https://docs.aws.amazon.com/sdk-for-go/api/service/appsync/
我找不到任何关于如何从库中调用 appsync 的文档。谁能给我指出正确的方向?
P.S。我不想从 lambda 查询或订阅或其他任何东西。这只是一个突变
谢谢!
------更新------
感谢@thomasmichaelwallace 通知我使用 https://godoc.org/github.com/machinebox/graphql
现在的问题是如何使用 aws v4 签署来自该包的请求?
问题是 API/library 旨在帮助您 create/update 应用程序同步实例。
如果您想实际调用它们,则需要 POST 到 GraphQL 端点。
最简单的测试方法是登录 AWS AppSync 控制台,按边栏中的 'Queries' 按钮,然后输入 运行 您的变更。
我不太擅长 go,但据我所知,golang 中有 GraphQL 的客户端库(例如 https://godoc.org/github.com/machinebox/graphql)。
如果您使用的是 IAM,则需要使用 v4 签名签署您的请求(有关详细信息,请参阅本文:https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)
我找到了一种使用普通 http.Request
和 AWS v4 签名的方法。 (感谢@thomasmichaelwallace 指出了这个方法)
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)
我正在尝试从 lambda 调用一个突变(特别是使用 golang)。我使用 AWS_IAM
作为 AppSync API 的身份验证方法。我还向我的 lambda 授予 appsync:GraphQL
权限。
但是,在查看此处的文档后:https://docs.aws.amazon.com/sdk-for-go/api/service/appsync/
我找不到任何关于如何从库中调用 appsync 的文档。谁能给我指出正确的方向?
P.S。我不想从 lambda 查询或订阅或其他任何东西。这只是一个突变
谢谢!
------更新------
感谢@thomasmichaelwallace 通知我使用 https://godoc.org/github.com/machinebox/graphql
现在的问题是如何使用 aws v4 签署来自该包的请求?
问题是 API/library 旨在帮助您 create/update 应用程序同步实例。
如果您想实际调用它们,则需要 POST 到 GraphQL 端点。
最简单的测试方法是登录 AWS AppSync 控制台,按边栏中的 'Queries' 按钮,然后输入 运行 您的变更。
我不太擅长 go,但据我所知,golang 中有 GraphQL 的客户端库(例如 https://godoc.org/github.com/machinebox/graphql)。
如果您使用的是 IAM,则需要使用 v4 签名签署您的请求(有关详细信息,请参阅本文:https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)
我找到了一种使用普通 http.Request
和 AWS v4 签名的方法。 (感谢@thomasmichaelwallace 指出了这个方法)
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)