1. 简介
本文将快速构建一个Spring Cloud应用,通过实例配置文件凭证(Instance Profile Credentials)连接AWS S3存储桶。这种认证方式无需硬编码密钥,是云原生环境下的最佳实践。
2. 云环境准备
实例配置文件是AWS的核心特性,允许EC2实例通过临时凭证访问其他AWS资源。这些凭证具有以下特点:
- ✅ 自动轮换(AWS管理生命周期)
- ✅ 短期有效(默认1小时)
- ⚠️ 仅限EC2实例内部请求获取
2.1. 部署资源
需要准备以下AWS资源(可通过CloudFormation模板或手动创建):
- EC2实例
- S3存储桶
- IAM角色(附加S3访问策略)
提示:示例代码中的CloudFormation模板可一键部署完整环境
2.2. 验证配置
在EC2实例内执行以下命令验证凭证获取(替换<InstanceProfileRoleName>
为实际角色名):
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<InstanceProfileRoleName>
成功响应应包含以下JSON字段:
{
"AccessKeyId": "ASIA...",
"SecretAccessKey": "...",
"Token": "...",
"Expiration": "2023-10-01T12:00:00Z"
}
3. Spring Cloud配置
3.1. 基础配置
在application.properties
中开启实例配置文件支持:
cloud.aws.credentials.instanceProfile=true
踩坑提醒:此配置仅对EC2实例内运行的应用生效!本地开发会报错
3.2. 强制使用实例配置文件
若需禁用其他凭证来源(如环境变量),自定义AmazonS3
Bean:
@Bean
public AmazonS3 amazonS3() {
InstanceProfileCredentialsProvider provider =
new InstanceProfileCredentialsProvider(true); // 强制刷新凭证
return AmazonS3ClientBuilder.standard()
.withCredentials(provider)
.build();
}
原理说明:Spring Cloud默认使用EC2ContainerCredentialsProviderWrapper
,按以下优先级查找凭证:
- 环境变量
- 系统属性
- 配置文件
- 实例配置文件(兜底方案)
4. 连接S3存储桶
标准Spring Cloud S3操作示例:
@Component
public class SpringCloudS3Service {
@Autowired
private AmazonS3 amazonS3;
public void createBucket(String bucketName) {
if (!amazonS3.doesBucketExistV2(bucketName)) {
amazonS3.createBucket(bucketName);
log.info("存储桶 {} 创建成功", bucketName);
}
}
}
关键限制:
- ❌ 本地开发无法运行(需EC2环境)
- ✅ 支持所有AWS服务(SQS/SNS/EC2等)
- ⚠️ 凭证自动过期,无需手动处理
5. 总结
通过实例配置文件凭证,我们实现了:
- 零硬编码密钥的云原生认证
- 自动凭证轮换的安全保障
- Spring Cloud的无缝集成
完整代码示例请参考GitHub仓库
最佳实践建议:
- 生产环境强制使用实例配置文件
- 本地开发通过
~/.aws/credentials
模拟 - 结合IAM策略实现最小权限原则