如何使用aws s3api为S3存储桶指定路径下所有子文件夹应用ACL策略
解决方案
你可以通过组合S3列表命令递归提取目标路径下所有文件夹前缀,再逐一对每个前缀执行ACL设置命令实现需求,具体操作如下:
前置准备
先把命令中涉及的变量替换为你自己的实际值:
BUCKET_NAME:你的S3存储桶名称TARGET_PREFIX:你要批量设置ACL的根路径,例如public/resources/MYPROFILE:你本地配置的AWS CLI凭证配置名
批量执行命令
Linux/macOS 环境(Bash)
直接运行以下组合命令即可递归给所有子文件夹设置ACL:
aws s3 ls s3://BUCKET_NAME/TARGET_PREFIX --recursive --profile MYPROFILE | awk '{print $4}' | grep '/$' | while read prefix; do aws s3api put-object-acl --bucket BUCKET_NAME --key "$prefix" --grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers --profile MYPROFILE done
命令逻辑说明:
aws s3 ls --recursive:递归列出目标路径下所有对象和前缀awk '{print $4}':提取输出中的路径字段grep '/$':过滤出所有以/结尾的文件夹前缀,排除实际文件- 循环遍历所有匹配的前缀,逐行执行ACL设置命令
Windows 环境(PowerShell)
运行以下PowerShell命令:
aws s3 ls s3://BUCKET_NAME/TARGET_PREFIX --recursive --profile MYPROFILE | ForEach-Object { $prefix = ($_ -split '\s+',4)[3] if ($prefix.EndsWith('/')) { aws s3api put-object-acl --bucket BUCKET_NAME --key $prefix --grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers --profile MYPROFILE } }
注意事项
- 如果你需要同时给路径下的所有文件也设置相同ACL,去掉命令中过滤文件夹的
grep '/$'(Bash)或if ($prefix.EndsWith('/'))判断(PowerShell)即可 - 操作前可以先验证匹配范围:把循环内的
put-object-acl命令替换为echo $prefix,确认路径无误后再执行实际设置 - S3是对象存储没有传统文件夹的概念,所谓的文件夹本质是带/后缀的空对象,单独设置文件夹ACL不会影响已有文件的权限,如果你需要新上传的对象自动继承公开读权限,建议搭配存储桶策略使用效率更高
内容的提问来源于stack exchange,提问作者SUBHAS PATIL
相关产品推荐
相关产品推荐

