【问题标题】:Wrapping graphQL(appsync) with REST API using Amazon api gateway使用 Amazon api 网关用 REST API 包装 graphQL(appsync)
【发布时间】:2020-07-04 17:10:43
【问题描述】:

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

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

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

Amazon api 网关设置捕获:

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

【问题讨论】:

    标签: amazon-web-services graphql aws-appsync amazon-api-gateway


    【解决方案1】:

    添加到@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} }"
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我似乎无法弄清楚如何为 OpenAPI Spec 构建 uri。有没有办法在 terraform 中动态获取它?例如aws_appsync_graphql_api.mygraphql.arn 不起作用
      【解决方案3】:

      我发现了如何将 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

      对我来说效果很好。

      【讨论】:

      • 嗨@BSD,你能分享你创建的执行角色吗?我尝试了您的步骤并创建了一个执行角色(来自另一篇 Medium 帖子 - medium.com/@aswinkumar4018/…),如下所示 - { "Version": "2012-10-17", "Statement": [ { "Action": [ "appsync:GraphQL " ], "资源": [ "arn:aws:appsync:us-east-1:{AWS-Account-Number}:apis/{AppSync-API-ID}/*" ], "效果": "允许" } ] }
      • 但我收到错误 - 由于配置错误,执行失败:API Gateway 无权承担提供的角色
      • @csharpnewbie 确保角色有足够的权限来调用 appsync
      • @BSD 如何格式化其余 api 的请求?正文不会与 graphql 查询相同吗?如果是这样,创建代理而不是仅仅公开 appsync 有什么意义
      猜你喜欢
      • 2018-03-19
      • 2021-11-23
      • 2020-01-21
      • 1970-01-01
      • 2017-02-17
      • 2020-09-10
      • 1970-01-01
      • 2020-11-12
      • 2023-01-22
      相关资源
      最近更新 更多