我正在使用API Gateway和Lambda Functions部署一些REST API。由于某些体系结构限制,API 必须仅由 REST 终结点可用。在 API 之上,我需要实现一个 GraphQL 接口,以允许我们的部分用户查询这些数据。为了部署 GraphQL 终端节点,我使用的是 AWS AppSync。基于该限制,我创建了指向 API 网关阶段网址 (https://api-gateway-api-id.execute-api.eu-central-1.amazonaws.com( 的 AppSync HTTP 数据源。它工作正常。然后,我保护了 API 网关 REST 终端节点以使用AWS_IAM,为数据源创建了一个角色,该角色有权在选定的 api inovocation arn 上调用 api,并使用 aws cli 配置 HTTP 数据源。
例如,这是我的角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "appsync.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
以下是附加到此角色的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:eu-central-1:9999999999:api-gateway-api-id/*/*/*"
}
]
}
在所有这些之后,我使用以下配置从 aws cli 更新了我的数据源:
{
"dataSource": {
"dataSourceArn": "arn:aws:appsync:eu-central-1:99999999999:apis/appsync-pi-id/datasources/Echo",
"name": "Echo",
"type": "HTTP",
"serviceRoleArn": "arn:aws:iam::99999999999:role/roleName",
"httpConfig": {
"endpoint": "https://api-gateway-api-id.execute-api.eu-central-1.amazonaws.com",
"authorizationConfig": {
"authorizationType": "AWS_IAM",
"awsIamConfig": {
"signingRegion": "eu-central-1",
"signingServiceName": "appsync"
}
}
}
}
}
现在,当我尝试进行查询时,出现以下错误:
Credential should be scoped to correct service: 'execute-api'
据我了解,用于制定签名的正确服务是执行 api。我有一些创建 AWSV4 签名的经验,并且知道在这种情况下就是这种情况。
有人知道我哪里犯了错误吗?
在Ionut Trestian的帮助下,我发现了错误。我更改了配置以使用不同的签名服务,如下所示:
{
"dataSource": {
"dataSourceArn": "arn:aws:appsync:eu-central-1:99999999999:apis/appsync-pi-id/datasources/Echo",
"name": "Echo",
"type": "HTTP",
"serviceRoleArn": "arn:aws:iam::99999999999:role/roleName",
"httpConfig": {
"endpoint": "https://api-gateway-api-id.execute-api.eu-central-1.amazonaws.com",
"authorizationConfig": {
"authorizationType": "AWS_IAM",
"awsIamConfig": {
"signingRegion": "eu-central-1",
"signingServiceName": "execute-api"
}
}
}
}
}
显然我没有正确理解配置值。在我的辩护中,我没有找到任何关于此选项的文档,只有一些分散在网络上的例子。:-)
万一其他人最终来到这里,因为我想知道还有什么可以作为signingServiceName
放置(我专门在寻找 s3(,我发现这篇有用的博客文章 https://blog.iamjkahn.com/2019/12/invoking-even-more-aws-services-directly-from-aws-appsync.html