当 AWS Websocket Api Gateway 尝试通过 Cloudfront 提供服务时出现 403 Forbidden

2024-06-25

我使用 AWS 的 websocket API 网关创建了一个 Websocket API。创建 api 后,我得到了像这样的端点

wss://x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com/dev

我可以直接使用它并调用$connectlambda 没有任何问题

现在我希望它通过云前端提供服务。

我已经有一个具有备用域名的发行版,例如app.blablabla.cloud它提供多个 REST API(源类型:API网关)针对不同的服务。我也想对 websocket API 做同样的事情

我为发行版创建了一个新的自定义来源

  • 原始域 -x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com
  • 协议 -仅 HTTPS
  • HTTPS 端口 - 443
  • 最低来源 SSL 协议 - TLS v1
  • 原点路径 -留空
  • 其余配置 - 默认

之后我创建了一个行为并附加了这个原点

  • 路径模式 -/dev/my-socket/*
  • 自动压缩对象 - 是
  • 观众 -仅 HTTPS
  • 允许的 HTTP 方法 - GET、HEAD、OPTIONS、PUT、POST、PATCH、DELETE
  • 限制查看者访问 - 否
  • 缓存密钥和源请求 - 缓存策略和源请求策略
    缓存策略- 缓存禁用
    原产地请求政策- 创建了一项政策Cookies - All, Query strings - All and Headers - Include the following headers - Sec-WebSocket-Key, Sec-WebSocket-Version, Sec-WebSocket-Protocol, Sec-WebSocket-Accept, Sec-WebSocket-Extensions
  • 其余配置 - 默认

现在我尝试使用 url 调用来自邮递员的 wss 初始调用wss://app.blablabla.cloud/dev/my-socket/?param1=1&param2=test

但我明白了Status Code: 403 Forbidden(我期待着一个101 Switching Protocols) 并且请求标头是

Sec-WebSocket-Version: 13
Sec-WebSocket-Key: TVMDG46dqkDM4a7DoM20ZB==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: app.blablabla.cloud

so it looks like cloudfront is hit just can't get it through. the api gateway dashboard also showed something like enter image description here

我不明白问题出在哪里。非常感谢您的帮助。提前致谢!


EDIT.
后来尝试使用cloudfront功能here https://stackoverflow.com/a/76958086/13583510并认为这是一个更好的方法


问题是 API Gateway’s WebSocket API does not support a path parameter in the connection URL. By design (or say it a design oversight), the connection URL path is fixed to the root path / (stage would be prepended when execute-api endpoint is used).正如本文中提到的中等文章 https://medium.com/@lancers/amazon-api-gateway-websocket-api-cloudfront-function-ab304fd95ac3.

简单来说就是尝试连接wss://x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com/dev/my-socket/?param1=1&param2=test会给出相同的403 禁忌 . Only wss://x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com/dev/?param1=1&param2=test or wss://x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com/dev?param1=1&param2=test works.

即当我尝试连接时wss://app.blablabla.cloud/dev/my-socket/?param1=1&param2=test它必须尝试连接到wss://x5g9h3p2rq.execute-api.eu-central-1.amazonaws.com/dev/my-socket/?param1=1&param2=test

So 方法1

  • 在行为改变中路径图案 - /dev并降低优先级,以便其余的dev/stuff/*不受影响。
  • 现在我能够做到wss://app.blablabla.cloud/dev?param1=1&param2=test

但这是不可扩展的。如果我们需要另一个套接字 API 该怎么办?我们不能使用相同的/dev对于一切。

这会带来更好的结果方法2

Using Lambda@Edge

  • 保持路径模式的行为 -/dev/my-socket/*.
  • 创建 Lambda@Edge 并将其与原产地要求
  • lambda 很简单,只需更改uri from /dev/my-socket/ to /dev
'use strict';

exports.handler = (event, context, callback) => {
  const request = event.Records[0].cf.request;
  request.uri = request.uri.replace(/\/[^\/]+\/$/, '');
  return callback(null, request);
};

  • 现在我能够做到wss://app.blablabla.cloud/dev/my-socket/?param1=1&param2=test它会剥离my-socket并转发到正确的原点。
  • 此外,Lambda 仅在连接调用期间被调用。握手完成后,Lambda 不再参与。
  • 还注意到与直接使用 API 网关 URL 相比,这种方法有轻微的延迟
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 AWS Websocket Api Gateway 尝试通过 Cloudfront 提供服务时出现 403 Forbidden 的相关文章

随机推荐

  • Roslyn:将 C# 转换为 VB

    我有这样的情况 我需要将 C 项目转换为 VB NET 项目 我想自动化这个 所以我不能使用在线工具或类似的东西 有 粘贴为 C VB 示例 Visual Studio 扩展 https github com akimboyko MetaP
  • 如何将 Angular 7 应用程序包含在现有的 html 文件和网站中?

    我一方面有一个现有网站 另一方面有一个 Angular 7 应用程序组件 我想编辑现有的someusecase html并重用我的 Angular 7 应用程序 例如
  • VS 2010 和 MBUnit 如何只运行一项测试

    我安装了 Gallio MbUnit 并使用 VS 2010 RC 我希望能够运行单个单元测试或 TestFixture 内的所有单元测试 而不是每次调试时整个项目中的所有测试 在 VS 2010 中如何做到这一点 安装testdriven
  • 如何最大限度地减少 Go 中的垃圾收集?

    有时您可能想避免 最小化垃圾收集器 所以我想确定如何做到这一点 我认为下一个是正确的 在函数的开头声明变量 使用数组代替切片 还有吗 为了最大限度地减少 Go 中的垃圾收集 您必须最大限度地减少堆分配 为了最大限度地减少堆分配 您必须了解分
  • SignalR - 如何向除呼叫者之外的所有人发送消息

    我有一个 Aspnet core 3 1 MVC 应用程序 我在其中配置了 SignalR 集线器 我有一个控制器 我可以在其中进行依赖注入 oIHubContext private readonly IHubContext
  • 如何在拖动另一个元素时获取鼠标光标下的元素?

    我用谷歌搜索并找到了几个答案 但它们都是关于单击或鼠标移动事件的 这些事件不适合我的问题 基本上 我允许用户从列表中拖动项目并将其放在另一个列表中的文件夹上 并且每当项目拖动到元素上时 我想突出显示元素 在文件夹列表中 监听文件夹列表上的
  • 无法找到类型 [Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers]

    我正在尝试对来自指定进程参数的 Powershell 的构建进行排队 我收到以下错误 知道我做错了什么吗 无法找到类型 Microsoft TeamFoundation Build Workflow WorkflowHelpers 确保包含
  • CUDA双指针内存复制[重复]

    这个问题在这里已经有答案了 我这样写了我的示例代码 int d ptr cudaMalloc void d ptr sizeof int N int tmp ptr N for int i 0 i
  • 如何从 Uri xamarin android 获取实际路径

    我想从 Uri 获取实际路径 当我使用意图选择文件时 它将返回 URI 但下面的代码行无法将 URI 转换为字符串路径 打开文件选择器 public static void PickFile Activity context Intent
  • 在 Powershell 中获取小文件的“磁盘大小”

    我正在使用一个遗留系统 该系统有大量来自外部系统的导入 其中大多数通过下载文件 根据上下文大小不同 处理它 然后将文件存储在 SAN 卷上的其他位置 格式为 NTFS 和安装在 WS2008R2 盒子上 我们遇到的问题是 由于簇的大小 大量
  • 取消选择单选选项

    我正在使用引导单选按钮 http getbootstrap com javascript buttons并希望允许取消选择无线电组 这可以使用额外的按钮来完成 Fiddle http jsfiddle net norlihazmeyGhaz
  • 使用 immutable.js 相对于 Object.assign 或扩展运算符的优势

    到目前为止 我看到的大多数 入门样板 和一些关于 React Redux 的帖子都鼓励使用不可变 js https facebook github io immutable js 来解决可变性 我个人依靠Object assign或传播运算
  • 使用 viewpager 的片段事务返回空白视图

    我正在使用 tablayout 和视图寻呼机来显示片段 我当前的设置是 我获得 类别 的列表视图 用户单击一个类别 然后返回一个新片段 其中包含该类别中的可用折扣列表 我的设置创建新的 DiscountList 片段 但在原始片段执行事务时
  • 将变量从 SASS 导出到普通 CSS?

    考虑一下我有一长串不同的 SASS 变量 scss像这样的文件 app color white ffffff app color black 000000 将这些变量导出为普通 CSS 变量的最有效方法是什么 root app color
  • IL 约束调用

    对于这段代码 class Program static void Main Console WriteLine new MyStruct ToString struct MyStruct C 编译器生成constrained callvir
  • 如何合并不同 MySQL 列中的日期和时间以与完整的 DateTime 进行比较?

    Column d是日期 列t是时间 列v例如 是 INT 假设我需要 2012 年 2 月 1 日 15 00 及之后记录的所有值 如果我写 SELECT FROM mytable WHERE d gt 2012 02 01 AND t g
  • Java 有没有办法记录*每个*线程中断?

    我想每次都以某种方式记录Thread interrupt 被调用 记录哪个线程发出调用 及其当前堆栈 以及识别有关哪个线程被中断的信息 有没有办法做到这一点 在搜索信息时 我看到有人提到实施安全管理器的可能性 这是可以在运行时完成的事情 例
  • 无限循环:确定并打破无限循环

    你如何判断一个循环是无限循环并且会跳出它 有没有人有算法或者可以帮助我解决这个问题 Thanks 没有通用的算法可以确定程序是否处于无限循环中图灵完备 http en wikipedia org wiki Turing completene
  • 使用node+express解压POST正文

    我有一个简单的节点应用程序 应该从客户端写入指标 客户端以 json 格式发送指标 并用 python 的 zlib 模块压缩 我试图添加一个中间件来在快速 bodyParse 发生之前解压缩请求帖子 我的中间件就是express默认提供的
  • 当 AWS Websocket Api Gateway 尝试通过 Cloudfront 提供服务时出现 403 Forbidden

    我使用 AWS 的 websocket API 网关创建了一个 Websocket API 创建 api 后 我得到了像这样的端点 wss x5g9h3p2rq execute api eu central 1 amazonaws com