bedrock.external.secrets_handler
1import re 2import json 3import traceback 4import base64 5from botocore.exceptions import ClientError 6from bedrock.config import get_secrets, set_secrets, get_config_params 7from bedrock.log import log_config 8from bedrock.external.aws import make_client 9 10log = log_config("SecretsHandlerEndpoint") 11SECRETS_MANAGER = make_client('secretsmanager') 12 13 14def find_secret(secret_arn) -> dict or None: # pragma: integration 15 """ 16 Find a secret in the secrets manager and returns its content. 17 Wraps `get_secret` to return None if the secret is not found. 18 19 :param secret_arn: The secret ARN 20 """ 21 config = get_config_params() 22 if config["secrets"][secret_arn]: # pragma: no cover - No testing AWS secrets 23 try: 24 return _get_secret(config["secrets"][secret_arn]) 25 except: 26 log.warning(f"Unable to fetch secret {secret_arn}") 27 return None 28 return None 29 30 31def find_secrets_like(config_secret_name_pattern: str) -> list: # pragma: integration 32 """ 33 Finds secrets that match the given pattern in the config. 34 35 :param config_secret_name_pattern: The pattern to match a secret that was defined in the config. 36 """ 37 config = get_config_params() 38 secrets = [find_secret(key) for key in config["secrets"] if re.match(config_secret_name_pattern, key)] 39 if not secrets: 40 log.warning(f"Unable to fetch secret with pattern {config_secret_name_pattern}") 41 return [] 42 return secrets 43 44 45def _get_secret(secret_arn: str) -> dict: # pragma: unit 46 """ 47 Find a secret in the secrets manager and returns its content. 48 49 :param secret_arn: 50 :return: 51 """ 52 secrets = get_secrets() 53 54 if secret_arn is None: 55 raise ValueError("No secret name defined") 56 57 if secret_arn in secrets: 58 log.debug(f"Getting {secret_arn} from secrets temporary cache") 59 return secrets[secret_arn] 60 61 log.debug(f"Extracting secrets from {secret_arn}") 62 try: 63 secrets_value = SECRETS_MANAGER.get_secret_value(SecretId=secret_arn) 64 except ClientError as e: # pragma: no cover 65 log.error(f"Unable to get secret '{secret_arn}': {e.response['Error']['Code']}") 66 raise e 67 except Exception as e: # pragma: no cover 68 log.error(f"Unknown error while getting secret '{secret_arn}'") 69 log.debug(f" {traceback.format_exc()}") 70 raise e 71 72 log.debug(f"Loading secret values...") 73 try: 74 secret = json.loads(secrets_value['SecretString']) 75 except KeyError: 76 secret = json.loads(base64.b64decode(secrets_value['SecretBinary'])) 77 78 log.debug(f"Got secret for {secret_arn}!") 79 set_secrets({**secrets, secret_arn: secret}) 80 81 return secret
log =
<MyLogger BEDROCK-SecretsHandlerEndpoint (INFO)>
SECRETS_MANAGER =
<botocore.client.SecretsManager object>
def
find_secret(secret_arn) -> dict:
15def find_secret(secret_arn) -> dict or None: # pragma: integration 16 """ 17 Find a secret in the secrets manager and returns its content. 18 Wraps `get_secret` to return None if the secret is not found. 19 20 :param secret_arn: The secret ARN 21 """ 22 config = get_config_params() 23 if config["secrets"][secret_arn]: # pragma: no cover - No testing AWS secrets 24 try: 25 return _get_secret(config["secrets"][secret_arn]) 26 except: 27 log.warning(f"Unable to fetch secret {secret_arn}") 28 return None 29 return None
Find a secret in the secrets manager and returns its content.
Wraps get_secret to return None if the secret is not found.
Parameters
- secret_arn: The secret ARN
def
find_secrets_like(config_secret_name_pattern: str) -> list:
32def find_secrets_like(config_secret_name_pattern: str) -> list: # pragma: integration 33 """ 34 Finds secrets that match the given pattern in the config. 35 36 :param config_secret_name_pattern: The pattern to match a secret that was defined in the config. 37 """ 38 config = get_config_params() 39 secrets = [find_secret(key) for key in config["secrets"] if re.match(config_secret_name_pattern, key)] 40 if not secrets: 41 log.warning(f"Unable to fetch secret with pattern {config_secret_name_pattern}") 42 return [] 43 return secrets
Finds secrets that match the given pattern in the config.
Parameters
- config_secret_name_pattern: The pattern to match a secret that was defined in the config.