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

如何在本地创建使用EC2角色访问受限S3桶的Java应用

本地Java应用通过EC2 IAM角色无密钥访问S3桶

问题场景

我尝试直接创建无凭证的S3客户端:

AmazonS3 s3;
s3  = AmazonS3ClientBuilder.standard().withRegion(region).build();
return s3;

调用API时会抛出访问被拒绝错误。

使用硬编码Access Key和Secret的方式可正常运行:

AWSCredentials credentials = new BasicAWSCredentials(accessKey, accessSecret);
return AmazonS3ClientBuilder.standard()
          .withCredentials(new AWSStaticCredentialsProvider(credentials))
          .withRegion(region).build();

但不想使用硬编码密钥,已创建拥有S3桶完全访问权限与EC2完全访问权限的IAM角色,希望本地Java应用通过该角色无密钥访问受限S3桶。

解决方案

1. 配置本地AWS角色切换凭证

AWS SDK for Java会自动按优先级查找凭证,本地要使用EC2 IAM角色,需通过AWS配置文件设置角色切换:

方式一:编辑AWS配置文件

在~/.aws/config(Linux/macOS)或C:\Users\<你的用户名>\.aws\config(Windows)中添加以下配置:

[profile s3-role-profile]
role_arn = arn:aws:iam::<你的AWS账号ID>:role/<你的IAM角色名称>
source_profile = default
  • source_profile对应本地已配置的、拥有sts:AssumeRole权限的AWS用户凭证(可通过AWS CLI的aws configure初始化)。

方式二:编辑AWS凭证文件

在~/.aws/credentials(或Windows对应路径)中添加:

[s3-role-profile]
role_arn = arn:aws:iam::<你的AWS账号ID>:role/<你的IAM角色名称>
source_profile = default

2. 简化Java代码使用默认凭证链

不需要硬编码密钥,SDK会自动从本地配置中获取角色临时凭证,代码可简化为:

AmazonS3 s3 = AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .build();
return s3;

也可显式指定默认凭证提供者(SDK默认已启用):

AmazonS3 s3 = AmazonS3ClientBuilder.standard()
                .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                .withRegion(region)
                .build();
return s3;

3. 验证IAM角色权限

确保你的IAM角色包含访问目标S3桶的权限策略,示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<你的S3桶名>",
                "arn:aws:s3:::<你的S3桶名>/*"
            ]
        }
    ]
}

同时,source_profile对应的用户需要拥有扮演该角色的权限,策略示例:

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

4. 运行时指定配置文件

启动Java应用时,可通过环境变量指定使用的AWS配置文件:

# Linux/macOS
export AWS_PROFILE=s3-role-profile
java -jar your-application.jar

# Windows(PowerShell)
$env:AWS_PROFILE = "s3-role-profile"
java -jar your-application.jar

也可在代码中直接指定:

System.setProperty("aws.profile", "s3-role-profile");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:20:28