在ECS EC2部署ML模型时从S3加载文件夹遇boto3访问拒绝
问题排查与解决方案
一、权限拒绝问题的可能原因及修复
凭证未正确生效
你的代码里创建了boto3.Session但没用来初始化S3客户端,直接调用boto3.client('s3')会优先使用ECS任务角色的凭证(如果配置了),而非你传入的KEY和ACCESS。修改代码:my_file = 'folder_artifacts' session = boto3.Session(aws_access_key_id=KEY, aws_secret_access_key=ACCESS) s3client = session.client('s3') # 用session创建客户端IAM实体权限不足
即便密钥正确,对应的IAM用户/角色必须拥有S3访问权限:- 确保IAM策略包含
s3:GetObject权限,且资源范围覆盖目标Bucket及所有子对象(比如arn:aws:s3:::your-bucket/folder_artifacts/*) - 检查Bucket Policy,确认没有拒绝该IAM实体的访问规则,同时存在允许访问的规则
- 确保IAM策略包含
区域配置不匹配
如果你的S3 Bucket不在默认区域,初始化客户端时需要指定对应区域:s3client = session.client('s3', region_name='us-west-2') # 替换为你的Bucket所在区域
二、加载S3文件夹的特殊操作
S3没有真正的文件夹概念,folder_artifacts只是对象前缀,无法直接用get_object获取整个文件夹。你需要遍历前缀下的所有文件并逐个下载:
import boto3 session = boto3.Session(aws_access_key_id=KEY, aws_secret_access_key=ACCESS) s3client = session.client('s3', region_name='your-region') bucket_name = 'your-bucket' prefix = 'folder_artifacts/' # 注意末尾的斜杠,避免匹配到类似folder_artifacts_xxx的前缀 # 列出前缀下的所有对象 paginator = s3client.get_paginator('list_objects_v2') for page in paginator.paginate(Bucket=bucket_name, Prefix=prefix): for obj in page.get('Contents', []): file_key = obj['Key'] # 跳过前缀本身(如果是虚拟文件夹) if file_key == prefix: continue # 下载文件到本地,这里假设本地路径和S3前缀对应 local_file_path = file_key.replace(prefix, '') s3client.download_file(bucket_name, file_key, local_file_path)
如果容器中安装了AWS CLI,也可以用更高效的s3 sync命令:
aws s3 sync s3://your-bucket/folder_artifacts/ ./local-folder/
内容的提问来源于stack exchange,提问作者LucaT
相关产品推荐
相关产品推荐

