存储桶策略仅允许文件类型,但允许创建文件夹

时间:2019-08-30 20:36:37

标签: amazon-web-services amazon-s3 amazon-iam

我正在尝试创建一个S3存储桶策略,该策略仅允许.docx文件类型(易于执行),但也允许我创建文件夹。

每次创建文件夹时,我都必须临时删除存储桶策略,创建文件夹,然后恢复该策略。

这是我目前的政策:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "AllowOnlyDocFiles",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:putObject",
        "NotResource": "arn:aws:s3:::input-bucket/*.docx"
    }
]
}

如果您可以为最终政策提供附加的Sid,那就太好了。

2 个答案:

答案 0 :(得分:1)

Amazon S3实际上不使用文件夹。而是,每个对象的文件名(Key)包含对象的完整路径

例如,此命令使用AWS Command-Line Interface (CLI)将文件复制到Amazon S3:

aws s3 cp foo.docx s3://my-bucket/invoices/foo.docx

即使invoices文件夹不存在,此命令也将成功运行。 Amazon S3界面将自动使invoices文件夹“出现”。但是,它只是显示对象键中使用的“公用前缀”。

假设该对象随后被删除:

aws s3 rm s3://my-bucket/invoices/foo.docx

这不仅会删除对象,还会使文件夹消失!。这是因为该文件夹实际上从未存在过。

因此,您不必担心制作文件夹和删除文件夹。 简单地假装它们存在并且一切都会正常运行。

但是,您问,管理控制台中的创建文件夹按钮如何?它是谁工作的?好吧,它实际上创建了一个大小为零的对象,其名称与“文件夹” 相同。这会导致该文件夹“出现”在用户界面中(因为存在带有该前缀的对象),但是对创建该文件夹没有影响,因为该文件夹不存在

因此,“允许创建文件夹”的策略实际上需要允许创建不带前缀的对象,但是我建议您甚至不用担心,因为创建文件夹没必要。

答案 1 :(得分:1)

正如@ john-rotenstein回答所说明的那样,您实际上不需要创建文件夹。

但是,如果您希望能够在创建空前缀的控制台中使用创建文件夹功能,只需将文件夹模式“ * /”添加到非资源行中即可

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOnlyDocFiles",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:putObject",
            "NotResource": [
                "arn:aws:s3:::input-bucket/*.docx",
                "arn:aws:s3:::input-bucket/*/"
            ]
        }
    ]
}