使用 Amazon api 网关使用 REST API 包装 graphQL(appsync)

Wrapping graphQL(appsync) with REST API using Amazon api gateway

我有一个使用 aws appsync 部署的 graphQL 服务器。问题是我们的客户更喜欢标准的 REST API。我正在寻找用 REST API.

包装 graphQL 查询的最简单方法

我正在考虑使用 Amazon api 网关来制作 REST 端点,并在 api 网关后面集成 lambda。这样我就可以让 lambda 函数发送固定的 graphQL query/mutations 并修改响应。

然而,正如您从下图中看到的,我在亚马逊 API 网关中找到了 AWS 服务集成选项。我想知道我是否可以在不使用 lambda 的情况下直接将 appsync 集成到 api 网关。我从aws文档中搜索过,没有找到任何相关信息。

Amazon api 网关设置捕获:

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

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

在方法设置页面中:

  1. 集成类型 = AWS 服务

  2. AWS 服务 = AppSync 数据平面

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

  4. HTTP 方法=POST

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

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

对我来说效果很好。

如果有人使用 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

加入@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发送query/mutation的格式: 假设您的 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} }"
}