【问题标题】:Programmatic file upload to AWS S3 bucket以编程方式将文件上传到 AWS S3 存储桶
【发布时间】:2019-11-05 03:17:21
【问题描述】:

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

  1. 创建一个 IAM 用户(具有编程访问权限),具有 no 权限 - 完成
  2. 创建一个 S3 存储桶并阻止所有公共访问 - 完成
  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);
  }
});
  1. 由于用户没有任何权限,我是否还需要创建自定义策略来为用户申请权限? OOTB 策略要么过于宽松 (AmazonS3FullAccess) 要么过于严格 (AmazonS3ReadOnlyAccess)。另一个令人困惑的地方是,我已经设置了一个存储桶策略来规范特定用户对存储桶的访问,所以这还不够吗?

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3


    【解决方案1】:

    您也可以为 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

    【讨论】:

    • 感谢您提供有用的链接和示例政策!
    猜你喜欢
    • 2018-04-25
    • 2021-02-07
    • 2017-10-17
    • 2020-10-10
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多