AWS API Gateway自定义URL参数?

时间:2019-05-13 16:43:33

标签: 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/<THIS_IS_THE_ID_OF_MY_EMBEDDED_HARDWARE>

1 个答案:

答案 0 :(得分:1)

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

https://aws.amazon.com/about-aws/whats-new/2018/11/amazon-cloudfront-announces-support-for-the-websocket-protocol/

Lambda @ Edge函数可以在“原始请求”事件上触发,并且该函数可以从URL中剥离硬件ID,并将其作为queryString或标头等传递给websocket API。 websocket API的后端可以访问queryString / header并最终从传入的事件数据中获取硬件ID

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-cloudfront-trigger-events.html

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html#lambda-examples-redirecting-examples

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

下面的示例L @ E nodeJs代码:

'use strict';

exports.handler = (event, context, callback) => {
    console.log(event)
    const request = event.Records[0].cf.request;
    var hardwareId = request.uri.substr(1);

    request.origin = {
                 custom: {
                     domainName: 'xxxxxxxxxx.execute-api.us-east-1.amazonaws.com',
                     port: 443,
                     protocol: 'https',
                     path: '/dev',
                     sslProtocols: ['TLSv1', 'TLSv1.1','TLSv1.2'],
                     readTimeout: 60,
                     keepaliveTimeout: 5,
                     customHeaders: {}
                }
    };

    request.uri = '/';

    request.querystring = 'hardwareId='+hardwareId;

    callback(null, request);
};