拒绝 AK/SK 硬编码!AWS 本地开发环境配置的优雅方案

175 阅读5分钟

1-cover.png

引言:你的密钥还在“裸奔”吗?

在云原生开发中,如何安全、优雅地管理 AWS 访问凭证(Access Key/Secret Key)是一个经典的老大难问题。

你是否经历过以下场景:

  • 安全隐患:为了图省事,将 AK/SK 直接写死在 Java 代码里,结果不小心提交到了 Git 仓库,半夜收到 AWS 的安全警告邮件。
  • 环境地狱:本地开发用一套配置,测试环境用一套,生产环境又用一套。代码里充斥着 if (env == "dev") 这种丑陋的判断逻辑。
  • 配置丢失:每次重新拉取代码或切换分支,本地的配置文件就被覆盖,不得不重新填一遍密钥。

如果你中枪了,那么这篇文章就是为你准备的。本文将详细介绍如何利用 AWS SDK 的标准机制,实现 零代码修改、多环境自动适配 的优雅鉴权方案。


1. 核心解密:凭证提供链 (Credential Provider Chain)

为什么资深的 AWS 开发者从来不在代码里写 new BasicAWSCredentials("ak", "sk")

因为 AWS SDK(无论是 Java, Python, Go 还是 Node.js)都内置了一个智能的 默认凭证提供链 (Default Credential Provider Chain)

当你初始化一个客户端(如 S3Client)且不指定凭证时,SDK 不会报错,而是会按照一套严格的 优先级顺序 自动去寻找凭证:

  1. 系统环境变量:检查 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
  2. Java 系统属性:检查 -Daws.accessKeyId 等启动参数。
  3. Web Identity Token:用于 EKS (Kubernetes) Service Account 场景。
  4. 本地配置文件 (⭐ 本地开发核心):检查 ~/.aws/credentials 文件中的 Profile。
  5. EC2 容器凭证: 检查 ECS 容器元数据
  6. EC2 实例元数据 (⭐ 生产环境核心):请求 EC2 Instance Metadata Service (IMDS) 获取绑定的 IAM Role 凭证。

1-credential-chain2.png

设计哲学:

  • 本地开发:利用第 4 步,读取开发者电脑上的 ~/.aws/credentials 文件。
  • 生产部署:利用第 6 步,自动读取 EC2 绑定的 IAM Role。
  • 结果一套代码,走遍天下。无需任何环境判断逻辑。

2. 实战指南:配置本地开发环境

第一步:安装 AWS CLI v2

我们需要使用 AWS CLI 来生成和管理本地的凭证文件,而不是手动去创建文本文件(容易出错)。

  • macOS:
    brew install awscli
    
  • Windows:
    winget install -e --id Amazon.AWSCLI
    
  • 验证安装:
    aws --version
    

第二步:配置命名 Profile (关键)

我们 不建议 直接修改 default 配置。最佳实践是创建一个专门的开发环境 Profile(例如 dev-profile),这样可以隔离个人账号、公司测试账号和生产账号的权限,避免误操作。

在终端运行:

aws configure --profile dev-profile

根据提示输入:

  1. AWS Access Key ID: 你的开发账号 AK。
  2. AWS Secret Access Key: 你的开发账号 SK。
  3. Default region name: us-east-2 (你的目标区域)。
  4. Default output format: json

配置完成后,凭证会被安全地保存在:

  • Mac/Linux: ~/.aws/credentials
  • Windows: %USERPROFILE%\.aws\credentials

第三步:验证配置

测试一下配置是否生效:

aws s3 ls --profile dev-profile

如果能列出 S3 Bucket,说明配置成功。前提是你配置的账号 AK 具有相应的权限。


3. Java 代码的最佳实践:从青铜到王者

❌ 错误写法(反面教材)

这种写法强依赖 AK/SK,导致代码无法在生产环境利用 IAM Role 自动鉴权,必须把 AK/SK 打包进镜像或注入容器,极不安全。

// 🚫 这种写法不仅硬编码了密钥,还导致生产环境无法自动切换到 IAM Role
BasicAWSCredentials creds = new BasicAWSCredentials("AK...", "SK...");
S3Client s3 = S3Client.builder()
    .credentialsProvider(StaticCredentialsProvider.create(creds)) // 👎 糟糕的实践
    .build();

✅ 正确写法(最佳实践)

// ✨ 这种写法自动适配所有环境(本地读 Profile,生产读 Role)
S3Client s3 = S3Client.builder()
    .credentialsProvider(DefaultCredentialsProvider.create()) // 👍 核心关键
    .region(Region.AP_NORTHEAST_1)
    .build();

4. IDEA 开发环境配置 (解决配置丢失痛点)

现在的挑战是:如何告诉 Java SDK 在本地运行时使用 dev-profile?默认情况下 SDK 会读取 default profile。

我们需要注入环境变量 AWS_PROFILE=dev-profile

为了避免每次切换 Git 分支导致 Run Configuration 丢失,推荐一种持久化方案:

方案 :使用 .env 文件 (团队协作首选)

如果你使用 EnvFile 插件,可以更优雅地管理,且配置可以被 Git 忽略。

  1. 在 IDEA 的插件市场搜索 EnvFile,并下载

1-step01.png

  1. 在项目根目录创建 local.env 文件(务必加入 .gitignore):

    AWS_PROFILE=dev-profile
    
  2. 在 Run Configuration 中,修改配置模板,并开启 EnvFile 选项卡,添加该文件。

1-step02.png

20251203-213322.png

20251203-213646.png

20251203-213909.png

💡 小技巧: 如果将文件直接命名为 .env,IntelliJ 的文件选择器可能会因为 macOS 的隐藏文件机制而找不到它。推荐命名为 local.envdev.env


5. 总结

通过这套方案,我们实现了云原生开发的“不可能三角”:

  1. 安全性 (Security):AK/SK 永远不进 Git 代码库,只存在于开发者本地目录。
  2. 一致性 (Consistency):Java 代码在本地和生产环境完全一样,没有一行 if-else
  3. 便捷性 (Convenience):生产环境只需给 EC2 绑定 IAM Role,无需任何配置文件,即插即用。

这就是云原生时代最标准的身份鉴权开发姿势。你的本地环境配置对了吗?


1-result.png