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

使用IAM用户通过AssumeRole访问AWS S3 Bucket失败求助

解决STS AssumeRole后访问S3报InvalidAccessKeyId的问题

你的代码里有个致命问题:构建S3客户端时,把STS返回的临时凭证给改坏了,导致AWS认不出你的密钥。

问题出在哪

STS返回的临时凭证是**带会话令牌(Session Token)**的BasicSessionCredentials,但你却把它转换成了不带令牌的BasicAWSCredentials——临时密钥必须配合会话令牌才能生效,缺了令牌AWS就会判定密钥无效,抛出InvalidAccessKeyId错误。而且你还做了多余的凭证包装操作,完全没必要重新调用getAWSCredentials。

修正后的代码

直接用STS返回的完整临时会话凭证构建S3客户端就行,别乱改:

public static void main(String[] args) {
    try{
        // 用IAM用户的永久密钥构建STS客户端
        AWSSecurityTokenService stsclient= AWSSecurityTokenServiceClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(getAWSCredentials("AKIAWEBTXXXXXXEDTIGNM", "KJR1e6eqk7schchdjhdyIf8R2FJQ6i")))
            .withRegion(Regions.fromName("us-west-2"))
            .build();
        
        // 发起AssumeRole请求,拿到临时会话凭证
        AssumeRoleRequest roleRequest= new AssumeRoleRequest()
            .withDurationSeconds(3600)
            .withRoleArn("arn:aws:iam::421XXXXX2511:role/s3_readonly_access_role")
            .withRoleSessionName("test-session");
        AssumeRoleResult roleResult=stsclient.assumeRole(roleRequest);
        Credentials creds= roleResult.getCredentials();
        
        // 直接用带SessionToken的临时凭证创建提供者,别拆东拆西
        AWSStaticCredentialsProvider credProvider= new AWSStaticCredentialsProvider(
            new BasicSessionCredentials(
                creds.getAccessKeyId(),
                creds.getSecretAccessKey(),
                creds.getSessionToken()
            )
        );
        
        // 用这个凭证提供者直接构建S3客户端(关键:别丢SessionToken)
        AmazonS3 s3=AmazonS3ClientBuilder
            .standard()
            .withCredentials(credProvider)
            .withRegion(Regions.fromName("us-west-2"))
            .build();

        List<Bucket> buckets= s3.listBuckets();
        for(Bucket bucket:buckets){
            System.out.println(bucket.getName());
        }
    }catch(AmazonS3Exception ex){
        ex.printStackTrace();
    }
}

private static AWSCredentials getAWSCredentials(String accessKey, String secretKey) {
    return new BasicAWSCredentials(accessKey, secretKey);
}

额外要确认的点

除了代码,还要检查两个IAM配置:

  • IAM用户权限:必须给用户加sts:AssumeRole权限,策略示例:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "arn:aws:iam::421XXXXX2511:role/s3_readonly_access_role"
            }
        ]
    }
    
  • IAM角色信任策略:目标角色的信任列表里必须包含这个IAM用户,不然用户根本没法扮演角色,信任策略示例:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::421XXXXX2511:user/你的IAM用户名"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:22:05