Last active
March 27, 2026 06:22
-
-
Save jifang/31475c9189412702bac571a50f5957ac to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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