gpt4 book ai didi

node.js - 如何使用 Amazon Lambda 对在 S3 中创建的文件设置打开/下载权限?

转载 作者:太空宇宙 更新时间:2023-11-03 22:53:16 28 4
gpt4 key购买 nike

我有一个 Amazon Lambda 函数,可以成功将文件写入 Amazon S3 存储桶。但是,默认情况下这些文件不可公开访问。如何让它们在写入时自动访问?

有没有办法更改存储桶本身,以便所有项目都可以公开读取(打开/下载)?

或者,我了解到这可以通过 IAM 角色策略来完成。这就是我所拥有的:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}

我认为需要更改的是“资源”,但我不确定如何更改。

为了完整起见(以防其他人需要做类似的事情并且陷入 Lambda 文档的泥潭),这是我在客户端的 ajax 调用(我正在将图像写入 S3 并需要返回文件名) :

$.ajax({
url: 'https://mylambdafunctionurl/',
type: 'POST',
crossDomain: true,
contentType: 'application/json',
data: JSON.stringify(data),
dataType: 'json',
success: function(data) {
var path = "https://myregion.amazonaws.com/mybucket/";
var filename = JSON.parse(data).filename;
document.getElementById('finalimage').innerHTML = "<a href='"+path+filename+"'>Your image</a>";
},
error: function(xhr, ajaxOptions, thrownError) {
if (xhr.status == 200) {
console.log(ajaxOptions);
} else {
console.log("Error: ");
console.log(xhr.status);
console.log(thrownError);
}
}
});

这是 Lambda POST 函数 (nodejs):

var AWS = require('aws-sdk');
var s3 = new AWS.S3();

exports.handler = function(event,context) {
var s3 = new AWS.S3();
var nowtime = new Date();
var bodycontent = event.image;

mykey = nowtime.getTime() + '.png';
var param = {Bucket: 'mybucket', Key: mykey, Body: bodycontent};
var successdata = {filename:mykey};
s3.upload(param, function(e,data) {
if (e) {
console.log(e,e.stack);
} else {
console.log(event);
}
context.done(null,JSON.stringify(successdata));
});
}

警告:使用当前时间作为文件名还不能用于生产。这只是生成相当独特的文件名的快速方法。

最佳答案

按照此页面示例:http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html您可以像这样设置 IAM 角色策略

...
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::EXAMPLE-BUCKET-NAME/*"
}
...

所以你可以将它与像 arn:aws:s3:::EXAMPLE-BUCKET-NAME/public/* 这样的文件夹组合起来,我认为



或者您可以创建一个完整的存储桶,可以公开访问所有文件,仅用于上传。



或者也许您可以使用 sdk 中的 getSignedUrl 到刚刚上传的文件并将该 url 返回给客户端,这将使该文件在给定时间内可以通过该 url 访问(不记得了)现在它们的有效期是多长),如下所示:

s3.putObject({
Bucket: bucket,
Key: key,
Body: fs.createReadStream(path),
ContentType: contentType,
}, function(err, data) {
if (err)
return callback(err, null);

s3.getSignedUrl('getObject', {
Bucket: 'mybucket',
Key: 'mypublicfiles/myfile.txt'
}, function(err, url) {
if (err)
return callback(err, null)
else
return callback(null, url)
});
});

关于node.js - 如何使用 Amazon Lambda 对在 S3 中创建的文件设置打开/下载权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33631229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com