gpt4 book ai didi

node.js - 以编程方式将文件上传到 AWS S3 存储桶

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:57 25 4
gpt4 key购买 nike

我想配置一个 AWS S3 存储桶和一个 IAM 用户(仅具有编程访问权限),以便我可以仅为该用户提供文件上传权限。用户将收到 AWS 访问 key ID 和 secret 访问 key ,以在简单的 Node.js 或 Python 控制台应用程序中使用。 实现这一目标所需的最少步骤是什么

  1. 创建一个 IAM 用户(具有编程访问权限),权限 - 完成
  2. 创建 S3 存储桶并阻止所有公共(public)访问 - 完成
  3. 添加如下所示的存储桶策略:
{
"Version": "2012-10-17",
"Id": "Policy1234567",
"Statement": [
{
"Sid": "Stmt1234567",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::1234567890:user/someuser"
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::some-bucket-name/*"
}
]
}

我有一个简单的 node.js 应用程序,它将给定文件上传到存储桶:

const fs = require('fs');
const zlib = require('zlib');
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});

const bucketName = 'some-bucket-name';
const fileName = 'alargefile.iso';
var body = fs.createReadStream(fileName)
.pipe(zlib.createGzip());

// Upload the stream
var s3obj = new AWS.S3({
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
params: {
Bucket: bucketName,
Key: fileName
}
});
s3obj.upload({
Body: body
}, function(err, data) {
if (err) {
console.log("An error occurred", err);
}
else {
console.log("Uploaded the file at", data.Location);
}
});
  • 由于用户没有任何权限,我是否还需要创建自定义策略来应用为用户的权限? OOTB 策略要么过于宽松 (AmazonS3FullAccess),要么过于严格 (AmazonS3ReadOnlyAccess)。另一个令人困惑的是,我设置了一个存储桶策略来管理特定用户对存储桶的访问,所以这还不够吗?
  • 最佳答案

    您还可以为 IAM 用户创建自定义策略,仅允许 PUTObject 到特定存储桶。

    示例:

    {
    "Version": "2012-10-17",
    "Id": "Policy1234567",
    "Statement": [
    {
    "Sid": "Stmt1234567",
    "Effect": "Allow",
    "Action": [
    "s3:PutObject"
    ],
    "Resource": "arn:aws:s3:::some-bucket-name/*"
    }
    ]
    }

    如果存储桶和 IAM 用户位于同一账户,并且 IAM 用户具有上述策略,则不需要存储桶策略。

    您肯定需要基于以下链接的身份政策:

    https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html

    关于node.js - 以编程方式将文件上传到 AWS S3 存储桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56717536/

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