S3 和 ALB 前面的 AWS CloudFront
AWS CloudFront in front of S3 and ALB
各位。我有一个关于 CloudFront + S3 + ECS(ALB) 的案例。
- S3 存储桶(启用静态网络)(CSR - SPA) 包括:
/index.html
/行政
/静态/(文件媒体)
- ECS + ALB:1 个集群 Fargate 运行 网络后端
所以,像这样的设计图:
我配置了 CloudFront 行为。
- 路径模式:/internal/* -> 来源 ALB
- 路径模式:默认 (*) -> Origin S3。 S3 使用带有 s3 静态网站的自定义来源 url 而不是用户别名。
结果
当我请求 CloudFrontURL 时,它会显示 S3 存储桶上的 /index.html。 (正确)。
但是当我请求时CloudFront/internal。它没有向我显示 404 代码。
然后,我找到了具有 lambda 边的解决方案。
(link:
https://medium.com/radon-dev/redirection-on-cloudfront-with-lambda-edge-e72fd633603e
).
我修改了link中的示例代码。我的代码:
var path = require('path');
var url = require('url');
exports.handler = (event, context, callback) => {
// Extract the request from the CloudFront event that is sent to Lambda@Edge
var request = event.Records[0].cf.request;
const parsedPath = path.parse(request.uri);
const parsedURL = url.parse(request.uri);
// Extract the URI from the request
var olduri = request.uri;
if (parsedURL.path.includes('/internal')) {
var newuri = "EC2Co-EcsEl-1KE5FOHEHN2NH-230429797.ap-southeast-1.elb.amazonaws.com";
request.uri = newuri;
console.log("alburi =" + " " + newuri);
} else if (parsedPath.dir.includes('/') && parsedPath.base != 'index.html' && parsedPath.dir != '/admin') {
var newuri = olduri.replace(parsedURL.pathname, '/index.html');
request.uri = newuri;
console.log("rooturi =" + " " + newuri);
}
// Return to CloudFront
return callback(null, request);
};
结果
- 当我请求
CloudfrontURL/
或 CloudFrontURL/abcdxyz...
或 CloudFrontURL/something..
-> 响应是 /index.html (正确)
- 当我请求
CloudfrontURL/internal*
-> 响应是 502。就像这样
请帮帮我。对不起我的英语水平。
如果您查看错误,这意味着云端尝试从 S3 而不是 ELB 获取内部。
我建议你改变你的行为以更简单:
1.创建指定路径模式的行为 以将所有静态内容请求路由到 S3 存储桶。例如,您可以设置 "images/*.jpg" 路径模式以将对图像目录中的“.jpg”文件的所有请求路由到 S3 存储桶。
2.编辑默认 (*) 路径模式行为并将其 Origin 设置为您的负载均衡器。
或者你可以有这个,例如,两个起源的两个行为
各位。我有一个关于 CloudFront + S3 + ECS(ALB) 的案例。
- S3 存储桶(启用静态网络)(CSR - SPA) 包括: /index.html /行政 /静态/(文件媒体)
- ECS + ALB:1 个集群 Fargate 运行 网络后端
所以,像这样的设计图:
我配置了 CloudFront 行为。
- 路径模式:/internal/* -> 来源 ALB
- 路径模式:默认 (*) -> Origin S3。 S3 使用带有 s3 静态网站的自定义来源 url 而不是用户别名。
结果
当我请求 CloudFrontURL 时,它会显示 S3 存储桶上的 /index.html。 (正确)。
但是当我请求时CloudFront/internal。它没有向我显示 404 代码。
然后,我找到了具有 lambda 边的解决方案。
(link:
https://medium.com/radon-dev/redirection-on-cloudfront-with-lambda-edge-e72fd633603e
).
我修改了link中的示例代码。我的代码:
var path = require('path');
var url = require('url');
exports.handler = (event, context, callback) => {
// Extract the request from the CloudFront event that is sent to Lambda@Edge
var request = event.Records[0].cf.request;
const parsedPath = path.parse(request.uri);
const parsedURL = url.parse(request.uri);
// Extract the URI from the request
var olduri = request.uri;
if (parsedURL.path.includes('/internal')) {
var newuri = "EC2Co-EcsEl-1KE5FOHEHN2NH-230429797.ap-southeast-1.elb.amazonaws.com";
request.uri = newuri;
console.log("alburi =" + " " + newuri);
} else if (parsedPath.dir.includes('/') && parsedPath.base != 'index.html' && parsedPath.dir != '/admin') {
var newuri = olduri.replace(parsedURL.pathname, '/index.html');
request.uri = newuri;
console.log("rooturi =" + " " + newuri);
}
// Return to CloudFront
return callback(null, request);
};
结果
- 当我请求
CloudfrontURL/
或CloudFrontURL/abcdxyz...
或CloudFrontURL/something..
-> 响应是 /index.html (正确) - 当我请求
CloudfrontURL/internal*
-> 响应是 502。就像这样
请帮帮我。对不起我的英语水平。
如果您查看错误,这意味着云端尝试从 S3 而不是 ELB 获取内部。 我建议你改变你的行为以更简单:
1.创建指定路径模式的行为 以将所有静态内容请求路由到 S3 存储桶。例如,您可以设置 "images/*.jpg" 路径模式以将对图像目录中的“.jpg”文件的所有请求路由到 S3 存储桶。
2.编辑默认 (*) 路径模式行为并将其 Origin 设置为您的负载均衡器。
或者你可以有这个,例如,两个起源的两个行为