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

如何通过AWSCredentialsProvider使用AWS角色ARN下载S3对象?

实现方案:通过角色ARN操作S3(Java AWS SDK)

可以实现你的需求,核心逻辑是通过AWS STS(安全令牌服务)扮演指定角色ARN,获取临时访问凭证,再用这些凭证初始化S3客户端。你提到的AWSCredentialsProvider(SDK v1)或CredentialsProvider(SDK v2)正是用来封装凭证获取逻辑的抽象,SDK已经提供了现成的实现类处理角色扮演场景。

核心原理

你不能直接用角色ARN替代凭证,而是需要:

  1. 使用当前环境的初始凭证(可以是实例角色、任务角色,或本地配置的凭证)调用STS的AssumeRole接口,获取目标角色的临时访问密钥、密钥ID和会话令牌。
  2. 用这些临时凭证创建S3客户端,执行查询/下载操作。
  3. SDK提供的角色凭证提供者会自动处理临时凭证的刷新,无需手动管理。

代码实现

方案1:AWS SDK v2(推荐使用的新版本)

import software.amazon.awssdk.auth.credentials.AssumeRoleCredentialsProvider;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.sts.StsClient;
import java.io.FileOutputStream;
import java.io.IOException;

public class S3RoleAccessExample {
    public static void main(String[] args) {
        // 替换为你的目标角色ARN
        String targetRoleArn = "arn:aws:iam::123456789012:role/YourS3AccessRole";
        // 会话名称,用于区分不同的角色会话
        String roleSessionName = "s3-download-session";
        Region region = Region.US_EAST_1;

        // 创建STS客户端,使用默认凭证链获取初始权限(需具备sts:AssumeRole权限)
        StsClient stsClient = StsClient.builder()
                .region(region)
                .credentialsProvider(DefaultCredentialsProvider.create())
                .build();

        // 构建角色凭证提供者,自动处理角色扮演和凭证刷新
        AssumeRoleCredentialsProvider roleCredentialsProvider = AssumeRoleCredentialsProvider.builder()
                .stsClient(stsClient)
                .roleArn(targetRoleArn)
                .roleSessionName(roleSessionName)
                .build();

        // 用角色凭证初始化S3客户端
        try (S3Client s3Client = S3Client.builder()
                .region(region)
                .credentialsProvider(roleCredentialsProvider)
                .build()) {

            // 示例:下载S3对象
            String bucketName = "your-bucket";
            String objectKey = "path/to/your/object";
            GetObjectRequest getRequest = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(objectKey)
                    .build();

            try (FileOutputStream outputStream = new FileOutputStream("local-file.txt")) {
                s3Client.getObject(getRequest, outputStream);
                System.out.println("S3对象下载完成");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

方案2:AWS SDK v1(旧版本兼容)

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import java.io.FileOutputStream;
import java.io.IOException;

public class S3RoleAccessV1Example {
    public static void main(String[] args) {
        String targetRoleArn = "arn:aws:iam::123456789012:role/YourS3AccessRole";
        String roleSessionName = "s3-download-session";
        Regions region = Regions.US_EAST_1;

        // 创建STS角色凭证提供者
        AWSCredentialsProvider roleCredentialsProvider = new STSAssumeRoleSessionCredentialsProvider.Builder(
                targetRoleArn, roleSessionName)
                .withRegion(region)
                .build();

        // 初始化S3客户端
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(roleCredentialsProvider)
                .build();

        // 示例:下载S3对象
        String bucketName = "your-bucket";
        String objectKey = "path/to/your/object";
        try (S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucketName, objectKey));
             FileOutputStream outputStream = new FileOutputStream("local-file.txt")) {

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = s3Object.getObjectContent().read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            System.out.println("S3对象下载完成");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键注意事项

  • 初始凭证权限:运行代码的环境必须有sts:AssumeRole权限,允许扮演目标角色ARN。如果在AWS托管服务(EC2、EKS、ECS等)上运行,可通过实例角色/任务角色赋予该权限;本地运行则需要在~/.aws/credentials或环境变量中配置具备该权限的凭证。
  • 凭证自动刷新:SDK提供的角色凭证提供者会自动检测临时凭证的过期时间,在凭证即将过期时自动调用STS刷新,无需手动处理。
  • 角色权限:目标角色ARN必须具备操作目标S3对象的权限(如s3:GetObject、s3:ListBucket等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:33:25