调用API时出现S3 Access Denied错误,Amplify Storage列表获取失败
解决Amplify Storage访问S3时的权限拒绝问题
1. 检查Cognito身份池角色权限
Amplify Storage依赖Cognito身份池的未认证/认证角色生效,而非你直接配置的IAM用户权限。即便给IAM用户授予S3FullAccess,只要身份池角色无对应权限,仍会触发访问拒绝错误:
- 登录AWS控制台,进入Cognito服务找到目标身份池
- 查看「未认证角色」「认证角色」的权限策略,确保包含对目标S3桶的
list和get权限,示例策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::你的桶名/public/*", "arn:aws:s3:::你的桶名" ] } ] }
替换其中的「你的桶名」为实际S3桶名称。
2. 验证S3桶策略
确保S3桶的桶策略允许Cognito角色访问目标路径:
- 进入S3控制台,找到目标桶并进入「权限」→「桶策略」
- 添加允许身份池角色访问的规则,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:role/你的Cognito未认证角色ARN" }, "Action": [ "s3:ListBucket", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::你的桶名/public/*", "arn:aws:s3:::你的桶名" ] } ] }
替换其中的「你的AWS账号ID」「你的Cognito未认证角色ARN」「你的桶名」为实际值。
3. 修正代码错误处理逻辑
原代码使用result.then()会导致内部错误无法被外层try-catch捕获,建议改用await简化代码并统一错误处理:
Future<void> retrieveDecks() async { try { final StorageListResult<StorageItem> result = await Amplify.Storage.list( path: 'public/deck', ).result; List<StorageItem> items = result.items; print(items); } catch (e) { print('获取文件列表失败: $e'); } }
4. 确认Amplify配置正确性
检查amplifyconfiguration.json中的Storage配置,确保桶名称、区域与实际一致,示例配置如下:
"Storage": { "plugins": { "awsS3": { "bucket": "你的桶名", "region": "你的AWS区域(如us-east-1)", "defaultAccessLevel": "public" } } }
内容的提问来源于stack exchange,提问作者Atomic Boy
相关产品推荐
相关产品推荐

