Amazon web services AWS API网关自定义URL参数?

Amazon web services AWS API网关自定义URL参数?,amazon-web-services,websocket,aws-api-gateway,Amazon Web Services,Websocket,Aws Api Gateway,使用web套接字设置API网关我希望嵌入式硬件客户端向该web套接字(也称为WebSocket URL)报告。遗憾的是,这些客户机是预配置的,并将其“ID”添加到URL中(参见下面的示例) 是否有任何方法可以提取ID并在连续处理中对其进行管理?我需要URL来识别我的不同客户并做出适当的响应 WebSocket URL:wss://12dxxxxx.execute-api.eu-central-1.amazonaws.com/dev/解决方法是在websocket API前面使用CloudFron

使用web套接字设置API网关我希望嵌入式硬件客户端向该web套接字(也称为WebSocket URL)报告。遗憾的是,这些客户机是预配置的,并将其“ID”添加到URL中(参见下面的示例)

是否有任何方法可以提取ID并在连续处理中对其进行管理?我需要URL来识别我的不同客户并做出适当的响应


WebSocket URL:
wss://12dxxxxx.execute-api.eu-central-1.amazonaws.com/dev/

解决方法是在websocket API前面使用CloudFront分发,并通过CloudFront分发服务请求。这意味着可以为将通过CloudFront dist提供服务的websocket API创建自定义域名。CloudFront dist的来源将是websocket API端点

Lambda@Edge函数可以在“Origin Request”事件中触发,函数可以从URL中删除硬件id,并将其作为queryString或header等传递给websocket API。websocket API的后端可以访问queryString/header,并最终从传入的事件数据中获取硬件id

注意:将域名映射到CloudFront dist需要DNS记录(CNAME)

样品L@EnodeJs代码如下:

“严格使用”;
exports.handler=(事件、上下文、回调)=>{
console.log(事件)
const request=event.Records[0].cf.request;
var hardwareId=request.uri.substr(1);
request.origin={
自定义:{
域名:“xxxxxxxxx.execute api.us-east-1.amazonaws.com”,
港口:443,
协议:“https”,
路径:'/dev',
sslProtocols:['TLSv1','TLSv1.1','TLSv1.2'],
读取超时:60,
keepaliveTimeout:5,
自定义标题:{}
}
};
request.uri='/';
request.querystring='hardwareId='+hardwareId;
回调(null,请求);
};

一种解决方法是将API字符串拆分为“/”并选择阶段部分后的第一个元素。但是API网关甚至不接受ConnectionSleep解决方法,多亏了这个想法。一、 这是在增加另一项服务,我仍然不回答,只是投票支持你。希望这个特性能被添加到API网关本身。这确实是一个很好的实现方法。为了解决上述问题,请确保在API网关控制台/API上创建自定义域,然后将此自定义域DNS直接指向其端点(而不是舞台上的执行API url)和CloudFront原点,您可以保留“/”而不是建议的“/dev”,因为自定义域将自动指定给stage(上面示例中的dev)。然后,您不需要替换
request.origin
,只需要替换
request.uri
,如上例所示。希望以后能帮助别人!