使用带有 CloudFront 的 Lambda Edge 访问 S3 时访问被拒绝
Access Denied when using Lamda Edge with CloudFront to access S3
我有一个 CloudFront 设置,我想从中提供放置在 S3 存储桶中的静态文件内容(会有很多子文件夹)。
我想根据查询字符串将请求路由到存储桶中的不同文件夹。
在我添加为 CloudFront 触发器的 Lamda Edge 函数中,我遵循
const request = event.Records[0].cf.request;
request.origin.s3.path = "/" + folderName + request.uri
callback(null, request);
但是当我通过 url 访问 CloudFront 时,出现 "AccessDenied" 错误。不确定如何调试。
我的 S3 存储桶文件是 public,我可以使用适当的 s3 urls 访问它们。
这里的任何帮助都会很棒。
谢谢
您可以check the docs for this,您需要生成另一个指向 s3 的响应。
这是文档中的一个示例,可能对您的案例有用:
'use strict';
const querystring = require('querystring');
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
/**
* Reads query string to check if S3 origin should be used, and
* if true, sets S3 origin properties.
*/
const params = querystring.parse(request.querystring);
if (params['useS3Origin']) {
if (params['useS3Origin'] === 'true') {
const s3DomainName = 'my-bucket.s3.amazonaws.com';
/* Set S3 origin fields */
request.origin = {
s3: {
domainName: s3DomainName,
region: '',
authMethod: 'none',
path: '',
customHeaders: {}
}
};
request.headers['host'] = [{ key: 'host', value: s3DomainName}];
}
}
callback(null, request);
};
您需要更改逻辑以将文件路径的 s3DomainName
替换为您的代码,例如:
/* Set S3 origin fields */
request.origin = {
s3: {
domainName: <yourS3Domain>,
region: '',
authMethod: 'none',
path: folderName+ / + request.uri,
customHeaders: {}
}
};
request.headers['host'] = [{ key: 'host', value: <yourS3Domain>}];
我有一个 CloudFront 设置,我想从中提供放置在 S3 存储桶中的静态文件内容(会有很多子文件夹)。
我想根据查询字符串将请求路由到存储桶中的不同文件夹。
在我添加为 CloudFront 触发器的 Lamda Edge 函数中,我遵循
const request = event.Records[0].cf.request;
request.origin.s3.path = "/" + folderName + request.uri
callback(null, request);
但是当我通过 url 访问 CloudFront 时,出现 "AccessDenied" 错误。不确定如何调试。 我的 S3 存储桶文件是 public,我可以使用适当的 s3 urls 访问它们。
这里的任何帮助都会很棒。
谢谢
您可以check the docs for this,您需要生成另一个指向 s3 的响应。
这是文档中的一个示例,可能对您的案例有用:
'use strict';
const querystring = require('querystring');
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
/**
* Reads query string to check if S3 origin should be used, and
* if true, sets S3 origin properties.
*/
const params = querystring.parse(request.querystring);
if (params['useS3Origin']) {
if (params['useS3Origin'] === 'true') {
const s3DomainName = 'my-bucket.s3.amazonaws.com';
/* Set S3 origin fields */
request.origin = {
s3: {
domainName: s3DomainName,
region: '',
authMethod: 'none',
path: '',
customHeaders: {}
}
};
request.headers['host'] = [{ key: 'host', value: s3DomainName}];
}
}
callback(null, request);
};
您需要更改逻辑以将文件路径的 s3DomainName
替换为您的代码,例如:
/* Set S3 origin fields */
request.origin = {
s3: {
domainName: <yourS3Domain>,
region: '',
authMethod: 'none',
path: folderName+ / + request.uri,
customHeaders: {}
}
};
request.headers['host'] = [{ key: 'host', value: <yourS3Domain>}];