Android端AWS S3上传纯文本文件遇Access Denied错误求助
已持有AWS访问密钥,可成功获取Amazon S3存储桶的文件夹结构,但无法上传txt文件到任何文件夹或根路径,报错:
AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XR5YENBX1E3SQH20)
成功执行的文件夹结构获取代码
val result: ListObjectsV2Result = s3Client.listObjectsV2(AWSCredentials.BUCKET_NAME) val objects = result.objectSummaries for (os in objects) { println(os.key) }
执行结果:
I/System.out: 2101/ I/System.out: 2101/Entrada/ I/System.out: 2101/Salida/ I/System.out: 2301/ I/System.out: 2301/Entrada/ I/System.out: 2301/Salida/
触发错误的文件上传代码
val request = PutObjectRequest( AWSCredentials.BUCKET_NAME, "2301/Entrada/maestro.txt", exampleFile ) s3Client.putObject(request)
检查存储桶策略的写入权限
确认存储桶策略中是否包含s3:PutObject权限:你能执行listObjectsV2说明已拥有s3:ListBucket权限,但上传需要额外的写入权限。需确保策略针对目标资源(如arn:aws:s3:::你的存储桶名/*)添加允许s3:PutObject的规则,同时排查是否存在优先级更高的Deny语句阻止写入。验证IAM用户/角色权限
访问密钥对应的IAM用户或角色,可能未被授予s3:PutObject权限。即使存储桶策略允许,IAM权限不足也会触发403错误。需在IAM控制台检查该用户的权限策略,确认包含对目标存储桶执行s3:PutObject的允许规则。检查存储桶公共访问设置
确认存储桶未开启会阻止写入的公共访问限制项,比如“阻止存储桶策略授予的公共访问”等选项。这类设置可能会覆盖允许写入的策略规则,导致权限被拒绝。核对桶名和对象路径
确认上传代码中的存储桶名称、对象键(2301/Entrada/maestro.txt)拼写完全正确,S3的桶名和对象键区分大小写,任何拼写错误都可能导致权限验证失败。检查本地文件权限
确保本地的exampleFile拥有可读权限,若SDK无法读取文件内容,也可能触发类似的权限报错。
内容的提问来源于stack exchange,提问作者Heinkel

