AWS Secrets Manager密钥轮换报错无法转换为键值对问题排查
问题根因
你的原始密钥是包含username和password字段的JSON键值对结构,但轮换逻辑中生成新密钥时,直接将随机生成的密码纯文本传入SecretString参数,替换了原本的JSON结构,导致Secrets Manager无法将密钥值解析为键值对,因此抛出*The secret value can't be converted to key name and value pairs.*错误。
修复步骤
- 先在代码头部引入JSON处理模块:
import json
- 替换原有
create_secret函数的逻辑,修改后的代码如下:
def create_secret(service_client, arn, token): # 获取当前在用的密钥内容,保留原有username等字段 current_secret = service_client.get_secret_value(SecretId=arn, VersionStage="AWSCURRENT") current_secret_dict = json.loads(current_secret['SecretString']) # 尝试获取待轮换的版本,不存在则生成新密码写入 try: service_client.get_secret_value(SecretId=arn, VersionId=token, VersionStage="AWSPENDING") logger.info("createSecret: Successfully retrieved secret for %s." % arn) except service_client.exceptions.ResourceNotFoundException: # 获取需要排除的特殊字符 exclude_characters = os.environ['EXCLUDE_CHARACTERS'] if 'EXCLUDE_CHARACTERS' in os.environ else '/@"\'\\' # 生成随机密码 passwd = service_client.get_random_password(ExcludeCharacters=exclude_characters) # 替换原有结构中的password字段值 current_secret_dict['password'] = passwd['RandomPassword'] # 将完整的JSON结构写入新的密钥版本 service_client.put_secret_value( SecretId=arn, ClientRequestToken=token, SecretString=json.dumps(current_secret_dict), VersionStages=['AWSPENDING'] ) logger.info("createSecret: Successfully put secret for ARN %s and version %s." % (arn, token))
如果你的密钥结构有其他自定义字段,也可以按照同样的逻辑保留原有字段,仅更新需要轮换的密码字段即可。
内容的提问来源于stack exchange,提问作者Dalal Alghomlas
相关产品推荐
相关产品推荐

