簡體   English   中英

AWS API Gateway 自定義 URL 參數?

[英]AWS API Gateway custom URL parameter?

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

一種解決方法是在 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 函數可以在 'Origin Request' 事件上觸發,該函數可以從 URL 中剝離硬件 ID,並將其作為 queryString 或 header 等傳遞給 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

注意:將域名映射到 CloudFront dist 需要 DNS 記錄(CNAME)

示例 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);
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM