S3 和 ALB 前面的 AWS CloudFront

AWS CloudFront in front of S3 and ALB

各位。我有一个关于 CloudFront + S3 + ECS(ALB) 的案例。

所以,像这样的设计图:

我配置了 CloudFront 行为。

结果

当我请求 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);
};

结果

请帮帮我。对不起我的英语水平。

如果您查看错误,这意味着云端尝试从 S3 而不是 ELB 获取内部。 我建议你改变你的行为以更简单:

1.创建指定路径模式的行为 以将所有静态内容请求路由到 S3 存储桶。例如,您可以设置 "images/*.jpg" 路径模式以将对图像目录中的“.jpg”文件的所有请求路由到 S3 存储桶。

2.编辑默认 (*) 路径模式行为并将其 Origin 设置为您的负载均衡器。

或者你可以有这个,例如,两个起源的两个行为