使用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
相关产品推荐
相关产品推荐

