场景:我有一个简单的S3存储桶,多个用户将向其上传文件。每个用户都应该上传到一个特定的文件夹,并且只有该文件夹-没有超出该文件夹的子文件夹。在这个文件夹里,他们可以上传任何他们想要的东西。我有一个IAM策略,该策略当前仅限于该用户文件夹,但允许他们指定我不想要的子文件夹。
当前IAM策略JSON限制为顶级文件夹:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObjectTagging"
],
"Resource": "arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/*"
}]
}
建议的IAM策略JSON我希望它只在指定的文件夹上进一步限制PutObject,但这似乎不允许上传任何对象?:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObjectTagging"
],
"Resource": "arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/*",
"Condition": {
"StringEquals": {
"s3:prefix": [
"",
"[MY_FOLDER]/"
],
"s3:delimiter": [
"/"
]
}
}
}]
}
预期结果
- 允许arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].csv
- 允许arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE]镶木地板
- 允许arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].txt
- DENYarn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].txt
- DENYarn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].txt
- DENYarn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[…N个文件夹]/[MY_FILE].txt
AmazonS3中没有文件系统中的"文件夹"。您所看到的文件夹实际上只是文件名的前缀。AmazonS3的工作方式是,您可以限制对特定前缀的访问,但不能限制在下面创建额外的前缀。
但是,您可以通过使用AmazonS3事件和Lambda函数来实现您的需求。这个过程可能看起来像这样:
1.用户将文件存储在Amazon S3 中
2.Amazon S3触发一个事件通知,其中包含元数据,包括对象密钥(表示文件名(和前缀(表示文件夹。
3.由S3事件触发的Lambda函数,并通过以下方式处理元数据:
- 检查文件名中允许的前缀(表示"子文件夹"(后面是否有后续斜杠(
/
( - 如果创建的文件包含后续斜杠,则删除该文件