如何验证AWS Secrets Manager密钥轮换完成?需检查VersionId吗?
AWS Secrets Manager密钥轮换完成检查:是否需要VersionId验证?
不需要额外检查VersionId,AWS Secrets Manager的密钥轮换状态完全可以通过VersionStages标签来确认,你提到的两个判断条件已经覆盖了轮换完成的所有场景:
- AWSPENDING与AWSCURRENT附加到同一密钥版本:说明新密钥已完成激活,轮换流程的收尾操作(如关联应用配置)已完成
- AWSPENDING未附加到任何密钥版本:表示轮换流程彻底结束,没有待激活的过渡版本
现有脚本的问题
你的当前脚本存在逻辑漏洞:aws secretsmanager get-secret-value默认仅返回带有AWSCURRENT标签的密钥版本,如果轮换过程中AWSPENDING标签在另一个独立版本上,你无法获取到该版本的Stage信息,会导致判断错误。
优化后的轮询脚本
建议改用list-secret-version-ids接口获取所有版本的Stage信息,确保判断逻辑准确:
rotationComplete=false attempt=0 max_attempts=20 # 设置最大重试次数,避免无限循环 while [ "$rotationComplete" == false ] && [ $attempt -lt $max_attempts ]; do # 获取所有密钥版本的Stage集合 all_version_stages=$(aws secretsmanager list-secret-version-ids --secret-id awsSecret --query 'Versions[].VersionStages' | jq -r '.[] | @sh') # 检查是否存在同时包含AWSPENDING和AWSCURRENT的版本 has_both_stages=$(echo "$all_version_stages" | grep -q "AWSPENDING.*AWSCURRENT\|AWSCURRENT.*AWSPENDING" && echo true || echo false) # 检查是否所有版本都没有AWSPENDING标签 no_pending_stage=$(echo "$all_version_stages" | grep -q "AWSPENDING" && echo false || echo true) if [ "$has_both_stages" == true ] || [ "$no_pending_stage" == true ]; then echo "Secret rotation completed." rotationComplete=true else echo "Secret rotation has not completed yet. Waiting... (Attempt $((attempt+1))/$max_attempts)" attempt=$((attempt + 1)) sleep 30 fi done if [ "$rotationComplete" == false ]; then echo "Secret rotation timed out after $max_attempts attempts." fi
优化说明
- 用
list-secret-version-ids替代get-secret-value,确保能获取所有密钥版本的Stage标签,避免遗漏轮换过程中的过渡版本 - 增加最大重试次数限制,防止因异常情况导致无限轮询
- 拆分判断逻辑,让条件检查更清晰准确
内容的提问来源于stack exchange,提问作者jipot
相关产品推荐
相关产品推荐

