AWS Secrets Manager Python代码报UnboundLocalError错误求助
问题排查与解决方案
报错核心原因
- 异常分支覆盖不全:当前代码仅对
ClientError下5种特定错误码做了抛出处理,若触发其他错误码的ClientError,程序不会抛出异常,会直接跳过try...else块,此时secret变量从未被定义,执行return语句时就会触发变量未绑定报错。 - 代码缩进错误:
get_secret函数下的所有逻辑代码均未正确缩进,不属于函数内部作用域,函数执行时无法找到secret变量的定义。 - 附加问题:代码直接使用了未定义的
region_name、secret_name变量,运行时也会触发名称错误。
修复方案
保留原有错误分类处理逻辑的前提下,补充异常兜底抛出规则,修正缩进,将动态参数改为函数入参,修复后代码如下:
import boto3 import base64 from botocore.exceptions import ClientError import json def get_secret(secret_name, region_name): # 创建Secrets Manager客户端 session = boto3.session.Session() client = session.client( service_name='secretsmanager', region_name=region_name ) try: get_secret_value_response = client.get_secret_value( SecretId=secret_name ) except ClientError as e: if e.response['Error']['Code'] == 'DecryptionFailureException': # Secrets Manager无法使用提供的KMS密钥解密受保护的密钥文本 raise e elif e.response['Error']['Code'] == 'InternalServiceErrorException': # 服务端发生错误 raise e elif e.response['Error']['Code'] == 'InvalidParameterException': # 参数值非法 raise e elif e.response['Error']['Code'] == 'InvalidRequestException': # 参数值不符合资源当前状态要求 raise e elif e.response['Error']['Code'] == 'ResourceNotFoundException': # 未找到请求的资源 raise e # 兜底其他所有异常情况,避免漏处理 else: raise e else: # 使用关联的KMS CMK解密密钥 if 'SecretString' in get_secret_value_response: secret = get_secret_value_response['SecretString'] else: secret = base64.b64decode(get_secret_value_response['SecretBinary']) return json.loads(secret)
调用示例
# 传入实际的密钥名称和对应区域即可调用 secret = get_secret("your-secret-id", "ap-southeast-1")
内容的提问来源于stack exchange,提问作者Elijah Kalii
相关产品推荐
相关产品推荐

