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

使用Java调用STS AssumeRole访问S3时遇403权限错误的解决咨询

问题描述

我用以下Java代码尝试连接S3存储桶:

AssumeRoleRequest assumeRequest = new AssumeRoleRequest().withRoleArn("arn:aws:s3:::test");
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
    .withCredentials(new AWSStaticCredentialsProvider(new AWSCredentials......)).build();
AssumeRoleResult assumeResult = stsClient.assumeRole(assumeRequest);

配置时出现403权限错误:

Caused by: com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException: User: arn:aws:iam::401532472896:user/test is not authorized to perform: sts:AssumeRole on resource: arn:aws:s3:::test  (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: 582c9c03-cd8e-43f7-bc35-8563461355e8; Proxy: null)

我创建了存储桶并附加了如下策略,但问题依旧:

{
    "Id": "Policy1567210887639",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1567210883302",
            "Action": [
                "sts:AssumeRole"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:iam::123456789:user/test"
        }
    ]
}
解决方法

1. 修正AssumeRole的目标ARN

sts:AssumeRole操作的目标是IAM角色,不是S3存储桶。你代码里把S3桶的ARN传给withRoleArn()是完全错误的。需要先创建一个具备S3访问权限的IAM角色,使用该角色的ARN,格式为:
arn:aws:iam::你的AWS账户ID:role/角色名称

2. 修正用户的权限策略

当前附加的策略逻辑错误:sts:AssumeRole的Resource字段应该是你要切换到的IAM角色ARN,而非用户自身的ARN。正确的用户权限策略如下,将其附加到arn:aws:iam::401532472896:user/test用户上:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::你的AWS账户ID:role/目标角色名称"
        }
    ]
}

3. 配置目标IAM角色的信任策略

仅给用户权限还不够,目标IAM角色必须明确允许该用户扮演自己。给目标角色添加如下信任策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::401532472896:user/test"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

4. 给目标角色添加S3访问权限

目标IAM角色需要具备访问S3存储桶的权限,比如添加允许读写test桶的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::test",
                "arn:aws:s3:::test/*"
            ]
        }
    ]
}

5. 修正Java代码

将代码中的RoleArn替换为正确的IAM角色ARN:

AssumeRoleRequest assumeRequest = new AssumeRoleRequest().withRoleArn("arn:aws:iam::你的AWS账户ID:role/目标角色名称");
// 其余代码保持不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:42:40