Skip to content

Instantly share code, notes, and snippets.

@jifang
Last active March 27, 2026 06:22
Show Gist options
  • Select an option

  • Save jifang/31475c9189412702bac571a50f5957ac to your computer and use it in GitHub Desktop.

Select an option

Save jifang/31475c9189412702bac571a50f5957ac to your computer and use it in GitHub Desktop.
#!/bin/bash
# 遇到错误不立即退出,以便我们能捕获 delete 失败并显示友好提示
set -uo pipefail
# 获取 Profile 参数,默认为 default
PROFILE=${1:-default}
echo "----------------------------------------------------"
echo "🚀 开始 AWS Access Key 轮转: Profile [$PROFILE]"
echo "----------------------------------------------------"
# 1. 环境检查
if ! command -v aws &> /dev/null || ! command -v jq &> /dev/null; then
echo "❌ 错误: 请确保已安装 'aws-cli' 和 'jq' (brew install awscli jq)"
exit 1
fi
# 2. 获取当前本地使用的 Key ID
CURRENT_LOCAL_KEY=$(aws configure get aws_access_key_id --profile "$PROFILE" 2>/dev/null)
if [ -z "$CURRENT_LOCAL_KEY" ]; then
echo "❌ 错误: 本地未找到 Profile [$PROFILE] 的配置,请先运行 'aws configure --profile $PROFILE'"
exit 1
fi
echo "✅ 当前本地 Key: $CURRENT_LOCAL_KEY"
# 3. 检查 IAM 中的 Key 数量并清理多余 Key
IAM_KEYS_JSON=$(aws iam list-access-keys --profile "$PROFILE" --output json)
KEY_COUNT=$(echo "$IAM_KEYS_JSON" | jq '.AccessKeyMetadata | length')
if [ "$KEY_COUNT" -eq 2 ]; then
echo "⚠️ 检测到 IAM 中已有 2 个 Key(达到上限)。正在自动清理非本地使用的那个..."
UNUSED_KEY=$(echo "$IAM_KEYS_JSON" | jq -r --arg LOCAL "$CURRENT_LOCAL_KEY" '.AccessKeyMetadata[] | select(.AccessKeyId != $LOCAL) | .AccessKeyId')
if [ -n "$UNUSED_KEY" ]; then
aws iam delete-access-key --access-key-id "$UNUSED_KEY" --profile "$PROFILE"
echo "✅ 已清理多余 Key: $UNUSED_KEY"
fi
fi
# 4. 创建新 Key
echo "🆕 正在生成新的 Access Key..."
NEW_KEY_JSON=$(aws iam create-access-key --profile "$PROFILE" --output json)
NEW_ACCESS_KEY=$(echo "$NEW_KEY_JSON" | jq -r '.AccessKey.AccessKeyId')
NEW_SECRET_KEY=$(echo "$NEW_KEY_JSON" | jq -r '.AccessKey.SecretAccessKey')
echo "✅ 新 Key 已生成: $NEW_ACCESS_KEY"
# 5. 关键步骤:等待同步
# AWS IAM 是全球最终一致性系统,新 Key 生成后需要几秒钟才能在所有区域生效
echo "⏳ 等待 15 秒让新 Key 在 AWS 全球网络中生效 (防止删除旧 Key 时认证失败)..."
sleep 15
# 6. 更新本地配置
# 先备份
BACKUP_FILE="$HOME/.aws/credentials_bak_$(date +%Y%m%d%H%M%S)"
cp "$HOME/.aws/credentials" "$BACKUP_FILE"
aws configure set aws_access_key_id "$NEW_ACCESS_KEY" --profile "$PROFILE"
aws configure set aws_secret_access_key "$NEW_SECRET_KEY" --profile "$PROFILE"
echo "✅ 本地凭据已更新。备份存放在: $BACKUP_FILE"
# 7. 尝试删除旧 Key 并处理可能的同步延迟错误
echo "🗑️ 正在尝试从 IAM 中删除旧 Key: $CURRENT_LOCAL_KEY ..."
if aws iam delete-access-key --access-key-id "$CURRENT_LOCAL_KEY" --profile "$PROFILE" 2>/tmp/aws_rot_err; then
echo "----------------------------------------------------"
echo "🎉 恭喜!轮转成功完成。"
echo "✅ 旧 Key 已从 IAM 中物理删除。"
echo "✅ 本地环境已切换至新 Key。"
else
ERROR_MSG=$(cat /tmp/aws_rot_err)
echo -e "\n----------------------------------------------------"
echo "⚠️ [注意] 无法自动删除旧 Key"
echo "原因分析: $ERROR_MSG"
echo "----------------------------------------------------"
echo "这通常是因为新 Key 还在 AWS 内部同步中,暂时无法用于鉴权去执行删除操作。"
echo "您的本地配置已经更新成功,无需重复运行脚本。"
echo ""
echo "💡 请在 1 分钟后运行以下命令手动完成最后一步清理:"
echo " aws iam delete-access-key --access-key-id $CURRENT_LOCAL_KEY --profile $PROFILE"
echo "----------------------------------------------------"
fi
rm -f /tmp/aws_rot_err
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment