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

Posted

技术标签:

【中文标题】使用 Amazon api 网关用 REST API 包装 graphQL(appsync)【英文标题】:Wrapping graphQL(appsync) with REST API using Amazon api gateway 【发布时间】: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 网关设置捕获:

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

【问题讨论】:

【参考方案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 数据平面来实现。

在方法设置页面中:

    集成类型 = AWS 服务

    AWS 服务 = AppSync 数据平面

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

    HTTP 方法 = POST

    操作类型 = 使用路径覆盖

    路径覆盖(可选)= 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 有什么意义

以上是关于使用 Amazon api 网关用 REST API 包装 graphQL(appsync)的主要内容,如果未能解决你的问题,请参考以下文章

我使用啥 Amazon REST API 来获取图书信息? [关闭]

适用于 Amazon Redshift 的 REST API

使用 REST 客户端 POSTMAN 使用 api 密钥调用 AWS api 网关端点

技术派:谁说API网关只能集成REST APIs?

Amazon S3 REST API 详解

在 API 网关中为 REST API 设置 $default 路由