如何使用 Lambda Edge 在 Cloudfront 源请求中设置 S3 存储桶路径?

问题描述 投票:0回答:2

我有一个 S3 存储桶,其中根目录中的每个文件夹都包含一个网站,文件夹名称就是网站 url。我有一个 Cloudfront 分配,将此存储桶作为源,并有一个与源请求分配关联的 Lambda Edge 函数。在该函数中,我想获取原始请求的 url 并将其添加到原始请求中作为 S3 存储桶的路径键。我该怎么做?

在事件请求中我看到这些字段:

'origin': {'custom': {'customHeaders': {}, 'domainName': '<bucketName>.s3-website-us-east-1.amazonaws.com', 'keepaliveTimeout': 5, 'path': '', 'port': 80, 'protocol': 'http', 'readTimeout': 30, 'sslProtocols': ['TLSv1', 'SSLv3']}}, 'querystring': '', 'uri': '/'

我尝试将原始请求的url设置为['origin']['custom']中的路径,作为查询字符串或uri,并将其附加到['origin']['custom']中的域名,但没有已经工作了。添加为查询字符串或 uri 返回“指定的存储桶不存在”,添加为路径返回“无效路径”,添加到域名返回“无效域名”。

感谢您的帮助!

amazon-web-services amazon-s3 amazon-cloudfront aws-lambda-edge
2个回答
0
投票

如果我正确理解你的问题,我认为你修改了错误的字段。 活动内部需要改变的地方不是

origin
,而是
request
。 基本上你需要改变
uri
内部的
event['Records'][0]['cf']['request']
,然后
return request


0
投票

我的问题的解决方案是将原始请求的 url(S3 存储桶路径)设置为请求中的 uri,如 @vpereira 提到的。此外,我通过将主机标头转发到原始请求来获取原始请求的 url,因此在检索到原始请求的 url 后,我需要将主机标头更改回 S3 存储桶的 url。第二部分有更多描述这里

代码解决方案:

def lambda_handler(event, context):
     request = event['Records'][0]['cf']['request']
     # Get original host header
     requested_url = request['headers']['host'][0]['value']
     # Set original host header as uri
     request['uri'] = '/' + requested_url + request['uri']
     # Set host header to bucket url
     request['headers']['host'][0]['value'] = '<bucketName>.s3-website-<region>.amazonaws.com'
     return request
© www.soinside.com 2019 - 2024. All rights reserved.