使用 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