You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:02:38