使用Amazon API Gateway将GraphQL(AppSync)包装成REST API

5
我部署了一个GraphQL服务器,使用AWS AppSync。然而我们的客户更喜欢标准REST API。我正在寻找一种最简单的方法来包装GraphQL查询并将其与REST API集成。
我考虑使用Amazon API Gateway创建REST端点,并在API Gateway后面集成Lambda。通过这种方式,我可以让Lambda函数发送固定的GraphQL查询/变异并修改响应。
但是,正如您从下面的图片中看到的那样,在Amazon API Gateway中找到了AWS服务集成选项。我想知道是否可以直接将AppSync集成到API Gateway中,而无需使用Lambda。我从AWS文档中搜索过,但未找到任何相关信息。
Amazon API Gateway设置截图:
[图片]
1. 是否可以像我从截图中看到的那样,通过将AppSync集成到API Gateway中来封装GraphQL API以实现REST API? 2. 如果是,是否有任何示例或教程? 3. 如果不是,我应该只集成Lambda吗?是否有更好的想法或技巧?
3个回答

2

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

在设置页面中:

  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文章-https://medium.com/@aswinkumar4018/aws-api-gateway-as-a-proxy-to-appsync-5d4dcd609a2c),如下所示 - { "Version": "2012-10-17", "Statement": [ { "Action": [ "appsync:GraphQL" ], "Resource": [ "arn:aws:appsync:us-east-1:{AWS-Account-Number}:apis/{AppSync-API-ID}/*" ], "Effect": "Allow" } ] } - csharpnewbie
但我收到了错误信息 - 由于配置错误,执行失败:API 网关没有权限扮演所提供角色的身份。 - csharpnewbie
@csharpnewbie 确保角色具有足够的权限来调用appsync。 - Felipe Centeno
@BSD如何为rest api格式化请求?请求正文是否与GraphQL查询相同?如果是,那么创建代理有什么意义,而不只是使appsync公开? - Felipe Centeno

1

在 @BSD 的解决方案上进行补充:

  • IAM role:

    • should grant Trust relationship to ApiGateway
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "apigateway.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
          }
        ]
      }
      
    • should have policy to allow to access AppSync endpoint
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Action": [
                      "appsync:GraphQL"
                  ],
                  "Resource": [
                      "arn:aws:appsync:us-east-1:{AWS-Account-Number}:apis/{AppSync-API-ID}/*"
                  ],
                  "Effect": "Allow"
              }
          ]
      }
      
  • The format for sending query/mutation through APIGW: Let's say your AppSync query is:

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

这个查询会转换成以下的JSON格式:
{
  "query": "query MyQuery {foo(request: {bar: \"abc123\", baz: \"xyz\"}) {a b c} }"
}

1

我似乎无法弄清如何构建OpenAPI规范的URI。在terraform中是否有一种动态获取它的方法?例如,aws_appsync_graphql_api.mygraphql.arn没有起作用。 - Jaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接