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