Amazon-S3
如何讓使用者將文件上傳到 S3 儲存桶,但不覆蓋或刪除?
我對使用者有以下 IAM 政策
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1395161912000", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:PutObject", "s3:*" ], "Resource": [ "arn:aws:s3:::bucketname" ] }, { "Sid": "list", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": [ "arn:aws:s3:::*" ] } ] }
目標是讓使用者將文件上傳到儲存桶,但不能覆蓋或刪除。是用來備份的。我從
ListBucket
and開始PutObject
,但*
由於它不起作用而添加。甚至*
不讓使用者上傳文件,只是獲取Access Denied
.當我嘗試模擬器時,它返回
Denied - Implicitly denied (no matching statements found).
forListBucket
,這似乎很奇怪,因為我已經隱含地允許這樣做。我已經嘗試過 Cyberduck 和 3Hub 作為 S3 客戶端。
知道有什麼問題嗎?
在為Amazon S3制定Amazon IAM策略時,您需要了解服務上的操作(例如ListAllMyBuckets)、桶上的操作(例如ListBucket)和對像上的操作(例如GetObject)之間的區別。
特別是,
Resource
您的策略規範需要根據以下模式處理適當的目標實體(參見例如Amazon S3 的各種範例策略):
- 服務運營——
arn:aws:s3:::*
- 對桶的操作 -
arn:aws:s3:::<bucket>
- 對對象的操作 -
arn:aws:s3:::<bucket>/<object>
解決方案
您遇到
Access Denied
,因為您已為 指定了儲存桶級別資源PutObject
,這需要對象級別資源規範,例如arn:aws:s3:::<bucket>/*
- 因此,以下策略應涵蓋您的範例案例:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": [ "arn:aws:s3:::*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucketname" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::bucketname/*" ] } ] }