【发布时间】:2020-08-02 23:53:06
【问题描述】:
Appsync 已经在某种程度上取代了 API Gateway,那你为什么需要通过 API Gateway 公开它。我知道大多数人都会问这个问题。这是为什么?
- 支持使用计划
- 货币化的可能性。
据我了解,Appsync 是 GrapQL + Apollo 服务器实现。公开的 API 支持 POST 请求。甚至订阅请求也是以 Websocket MQTT (AWS IoT) URL 作为响应的发布请求。 (例如下面提供)
{
"extensions": {
"subscription": {
"mqttConnections": [
{
"url": "wss://something-ats.iot.ap-northeast-1.amazonaws.com/mqtt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...",
"topics": [
".../.../subscribeToVehicleLocation/..."
],
"client": "..."
}
],
"newSubscriptions": {
"subscribeToVehicleLocation": {
"topic": ".../../subscribeToVehicleLocation/..",
"expireTime": null
}
}
}
},
"data": {
"subscribeToVehicleLocation": null
}
}
如果是这样,我们可以通过 API-Gateway(POST 方法)暴露 Appsyn 端点吗?
为简单起见,我尝试在 API-Gateway 中使用 HTTP API。
- 它适用于 Query 和 Mutate 请求。
-
但是对于 订阅 请求,我收到了握手异常。 (连接失败:连接握手错误,在我的角度放大项目中)
这是通过 API-Gateway 公开 Appsync 的正确方法吗?或者我应该使用 AWS 服务(在 API 网关中)来调用 Appsync?
如何解决 Angular Amplify 项目中的 Websocket 连接握手错误?
PS:
我之前能够使用原始 Appsync URL 订阅数据(在 Angular 7 中使用 AmplifyJS)。使用 API-Gateway URL,我得到了这个 WS Handshake 异常(使用 Amplify)。
WebSocket connection to 'wss://....execute-api.ap-northeast-1.amazonaws.com/graphql?header=...&payload=e30=' failed: Error during WebSocket handshake: Unexpected response code: 400
in AWSAppSyncRealTimeProvider.js:603
2020 年 4 月 24 日更新
我能够使用以下设置通过 API-Gateway 中的 AWS 服务调用来调用 Appsync。 (使用 API Gateway 提供的 REST 协议)
但是,我仍然在 Amplify 中遇到 Web Socket 错误
API-网关配置
注意:AWS 子域,是 Appsync API Endpoint 的子域部分。
IAM 角色的信任关系
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"appsync.amazonaws.com",
"apigateway.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
IAM 角色权限
【问题讨论】:
-
API网关的角色有appsync吗?
-
嘿@RobertNavado,更新了问题。请注意,我没有使用
AWS Service Integrate来调用 Appsync。但想知道,这是推荐的方法。 -
我不明白为什么您仍然不能使用 AppSync 提供的订阅 URL 并且必须通过 API 网关代理它。您基本上可以通过 API Gateway 代理查询/突变,并自行使用 Web 套接字 URL。
-
@IonutTrestian 谢谢。但这不符合我的配额要求
标签: aws-api-gateway aws-amplify aws-appsync aws-iot amplifyjs