3

我有一个使用 aws appsync 部署的 graphQL 服务器。问题是我们的客户更喜欢标准的 REST API。我正在寻找使用 REST API 包装 graphQL 查询的最简单方法。

我正在考虑使用 Amazon api 网关制作一个 REST 端点,并将 lambda 集成在 api 网关后面。这样,我可以让 lambda 函数发送固定的 graphQL 查询/突变并修改响应。

但是,如下图所示,我在 Amazon API 网关中找到了 AWS 服务集成选项。我想知道是否可以在不使用 lambda 的情况下直接将 appsync 集成到 api 网关。我从 aws 文档中搜索了它,但找不到任何相关信息。

Amazon api 网关设置捕获:

Amazon api 网关设置捕获

  1. 是否可以通过在不使用 lambda 的情况下将 appsync 集成到 api 网关来将 graphQL API 与 REST API 包装起来?就像我从捕获的图像中发现的一样?
  2. 如果是,是否有任何示例或教程?
  3. 如果没有,我应该只集成 lambda 吗?有没有更好的想法或技巧?
4

3 回答 3

2

我发现了如何将 appsync 集成到 API 网关。您可以通过将 AWS 服务集成设置为 AppSync 数据平面来实现此目的。

在方法设置页面中:

  1. 集成类型 = AWS 服务

  2. AWS 服务 = AppSync 数据平面

  3. AWS 子域 = 从您的 appsync 端点获取它(例如: https ://YOUR_AWS_Subdomain.appsync-api.your-region.amazonaws.com/graphql )

  4. HTTP 方法 = POST

  5. 操作类型 = 使用路径覆盖

  6. 路径覆盖(可选)= graphql

它对我来说效果很好。

于 2020-03-31T02:27:32.377 回答
1

如果有人使用 OpenAPI 规范来定义 APIGW,请使用以下内容:

/graphql:
  post:
    x-amazon-apigateway-integration:
      type: "AWS"
      httpMethod: "POST"
      uri: arn:aws:apigateway:<APIGW_REGION>:<APPSYNC_URL_ID>.appsync-api:path/graphql
      credentials: <INVOCATION_ROLE_ARN>

https://docs.aws.amazon.com/general/latest/gr/appsync.html#appsync_region_data_plane https://docs.aws.amazon.com/apigateway/api-reference/resource/integration/#type

于 2020-07-27T08:52:57.687 回答
0

添加到@BSD的解决方案:

  • IAM 角色:

    • 应该向 ApiGateway 授予信任关系
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "apigateway.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
          }
        ]
      }
      
    • 应该有允许访问 AppSync 端点的策略
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Action": [
                      "appsync:GraphQL"
                  ],
                  "Resource": [
                      "arn:aws:appsync:us-east-1:{AWS-Account-Number}:apis/{AppSync-API-ID}/*"
                  ],
                  "Effect": "Allow"
              }
          ]
      }
      
  • 通过 APIGW 发送查询/变异的格式:假设您的 AppSync 查询是:

query MyQuery {
  foo(request: {bar: "abc123", baz: "xyz"}) {
    a
    b
    c
  }
}

此查询将转换为以下 JSON:

{
  "query": "query MyQuery {foo(request: {bar: \"abc123\", baz: \"xyz\"}) {a b c} }"
}
于 2021-08-02T21:46:59.620 回答