AWS Appsync + HTTP 数据源 + AWS IAM
AWS Appsync + HTTP DataSources + AWS IAM
我正在使用 API 网关和 Lambda 函数部署一些 REST api。由于某些架构限制,API 必须仅可由 REST 端点使用。在 API 之上,我需要实现一个 GraphQL 接口,以允许我们的部分用户查询此数据。我使用 AWS AppSync 部署 GraphQL 端点。基于该限制,我创建了指向 API 网关阶段 url (https://api-gateway-api-id.execute-api.eu-central-1.amazonaws.com) 的 AppSync HTTP 数据源。它运作良好。然后我保护 API 网关 REST 端点以使用 AWS_IAM,为数据源创建一个角色,有权在选定的 api 调用 arn 上调用-api 并配置 HTTP使用 aws cli 的数据源。
例如,这是我的角色:
{
"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'
据我了解,用于制定签名的正确服务是 execute-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),我发现这个有用的博客 post https://blog.iamjkahn.com/2019/12/invoking-even-more-aws-services-directly-from-aws-appsync.html
我正在使用 API 网关和 Lambda 函数部署一些 REST api。由于某些架构限制,API 必须仅可由 REST 端点使用。在 API 之上,我需要实现一个 GraphQL 接口,以允许我们的部分用户查询此数据。我使用 AWS AppSync 部署 GraphQL 端点。基于该限制,我创建了指向 API 网关阶段 url (https://api-gateway-api-id.execute-api.eu-central-1.amazonaws.com) 的 AppSync HTTP 数据源。它运作良好。然后我保护 API 网关 REST 端点以使用 AWS_IAM,为数据源创建一个角色,有权在选定的 api 调用 arn 上调用-api 并配置 HTTP使用 aws cli 的数据源。
例如,这是我的角色:
{
"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'
据我了解,用于制定签名的正确服务是 execute-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),我发现这个有用的博客 post https://blog.iamjkahn.com/2019/12/invoking-even-more-aws-services-directly-from-aws-appsync.html