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,按以下优先级查找凭证:

  1. 环境变量
  2. 系统属性
  3. 配置文件
  4. 实例配置文件(兜底方案)

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. 总结

通过实例配置文件凭证,我们实现了:

  1. 零硬编码密钥的云原生认证
  2. 自动凭证轮换的安全保障
  3. Spring Cloud的无缝集成

完整代码示例请参考GitHub仓库

最佳实践建议

  • 生产环境强制使用实例配置文件
  • 本地开发通过~/.aws/credentials模拟
  • 结合IAM策略实现最小权限原则

原始标题:Instance Profile Credentials using Spring Cloud