amazon-web-services - 用于动态路由的 AWS Edge 功能不起作用
问题描述
我无法使用 Cloudfront@Edge 函数设置一个简单的示例来更改请求的自定义来源,同时保留域名。
按照本指南和这个stackoverflow问题,我有以下设置:
- 2 个 HTTP 负载均衡器,每个都有一个 lambda 函数。它们返回一个带有区域 + 正文中所有标头的 HTTP 页面:
- 美国1个:
custom-us.us-west-1.elb.amazonaws.com
- 1 在欧盟:
custom-eu.eu-central-1.elb.amazonaws.com
- 美国1个:
- 1 个具有 1 个来源的云端分布 (
mydistr.cloudfront.net
),如指南中所述。我默认行为的来源是custom-us.us-west-1.elb.amazonaws.com
. 缓存策略是Managed-CachingDisabled
. - 1个cloudfront@edge lambda函数(带
origin-request
触发器),代码如下:
'use strict';
module.exports.dynamic_routing = (event, context, callback) => {
const request = event.Records[0].cf.request;
const originUSA = "custom-us.us-west-1.elb.amazonaws.com";
const originEU = "custom-eu.eu-central-1.elb.amazonaws.com";
var destDomain = originUSA;
const custom_header = request.headers['custom-header-value'];
if (custom_header && custom_header.value == "DE") {
destDomain = originEU;
}
request.origin = {
custom: {
domainName: destDomain,
port: 80,
protocol: 'http',
path: request.uri,
readTimeout: 20,
keepaliveTimeout: 5,
customHeaders: {}
}
};
request.headers['host'] = [{ key: 'host', value: destDomain}];
callback(null, request);
};
我可以正确导航到两个负载均衡器并看到正确的内容,这证明负载均衡器 + 各自的 lambda 函数设置正确。
如果我导航到mydistr.cloudfront.net
显示“美国”内容,这是正确的。但是,如果使用 Curl/Postman 发送请求,包括 my custom-header-value: DE
,我会一直看到美国信息:
当我期望改变原点时。
我错过了什么?
解决方案
嗯......解决方案很简单。
所有的标题都是数组,因此问题就在这里:custom_header.value == "DE"
它实际上应该在哪里custom_header[0].value == "DE"
。
推荐阅读
- python - Django Form 不显示,给出无法匹配 url 的错误
- codenameone - 代号 One 控制中心无法在 Linux 操作系统 (Ubuntu) 上运行
- sendgrid - API v3 - 为什么应用程序/pdf 类型的附件下载为“文件”类型而不是 PDF 本身?
- python - 弹出窗口中审美计数器的最快方法?
- python - 我可以在我的 android 应用程序的 apk 中使用“pyttsx3”模块和“speech_recognition”模块吗?
- html - 显示从快递服务器传回的图像
- xquery - 计算xquery中单词的频率
- c# - 从依赖注入容器中获取特定的日志记录提供程序
- r - R - 根据最近的匹配列查找和更新
- java - 如何在 listview 中更改 cardview 的标题字符串?安卓工作室 Java