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

使用AWS官方单Bucket访问示例遇权限拒绝问题求助

AWS S3 PutObject权限问题排查

问题描述

我按照AWS官方示例配置S3访问策略,将用户加入挂载了该策略的用户组后,生成STS令牌调用putObject接口时收到错误:

'User: x is not authorized to perform: s3:PutObject on resource: "arn:aws:s3:::dummy-bucket/test/test.txt" because no identity-based policy allows the s3:PutObject action'

但将策略中的Resource改为*后即可正常执行,想确认这是因为策略挂载在用户组而非用户,还是使用STS令牌导致的?

相关代码

生成STS令牌代码

$sdk = new Sdk([
    'region' => 'eu-central-1',
    'credentials' => [
        'key' => $accessKey['AccessKeyId'],
        'secret' => $accessKey['SecretAccessKey'],
    ],
]);

$stsClient = $sdk->createSts();

$result = $stsClient->getSessionToken([
    'DurationSeconds' => $lifetime, // Set the duration in seconds (15 min minimum)
]);

调用putObject代码

$client = new S3Client([
    'region' => 'eu-central-1',
    'version' => '2006-03-01',
    'credentials' => [
        'key' => $token['key'],
        'secret' => $token['secret'],
        'token' => $token['token']
    ],
]);

$buckets = $client->listBuckets();

$res = $client->putObject([
    'Bucket' => 'dummy-bucket',
    'Key' => 'test/test.txt',
    'SourceFile' => __DIR__ . '/testfile.txt'
]);

问题原因与解决方案

  • 核心问题是S3资源ARN的权限范围不匹配:官方示例策略中的Resource如果是arn:aws:s3:::dummy-bucket,仅授权对Bucket本身的操作(比如创建、删除桶),而putObject针对的是桶内对象,对应的ARN格式应为arn:aws:s3:::dummy-bucket/*(匹配桶内所有对象)。
  • 策略挂载在用户组和直接挂载到用户的权限生效逻辑完全一致;STS临时凭证会继承原身份的权限(只要原身份拥有sts:GetSessionToken权限),这两个因素都不是导致权限错误的原因。
  • 修正方案:将策略中的Resource字段修改为arn:aws:s3:::dummy-bucket/*,即可授权对桶内所有对象的putObject操作;如果需要更精细的权限控制,可以指定具体前缀,比如arn:aws:s3:::dummy-bucket/test/*。

内容的提问来源于stack exchange,提问作者Oli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:29:51