@@ -111,6 +111,19 @@ def import_azure_key_vault() -> None:
111111 ) from e
112112
113113
114+ def import_aws_secrets_manager () -> None :
115+ global boto3_client
116+ global SecretsManagerClient
117+
118+ try :
119+ from boto3 import client as boto3_client
120+ from mypy_boto3_secretsmanager .client import SecretsManagerClient
121+ except ImportError as e :
122+ raise ImportError (
123+ 'AWS Secrets Manager dependencies are not installed, run `pip install pydantic-settings[aws-secrets-manager]`'
124+ ) from e
125+
126+
114127DotenvType = Union [Path , str , Sequence [Union [Path , str ]]]
115128PathType = Union [Path , str , Sequence [Union [Path , str ]]]
116129DEFAULT_PATH : PathType = Path ('' )
@@ -2250,6 +2263,43 @@ def __repr__(self) -> str:
22502263 return f'{ self .__class__ .__name__ } (url={ self ._url !r} , ' f'env_nested_delimiter={ self .env_nested_delimiter !r} )'
22512264
22522265
2266+ class AWSSecretsManagerSettingsSource (EnvSettingsSource ):
2267+ _secret_id : str
2268+ _secretsmanager_client : SecretsManagerClient # type: ignore
2269+
2270+ def __init__ (
2271+ self ,
2272+ settings_cls : type [BaseSettings ],
2273+ secret_id : str ,
2274+ env_prefix : str | None = None ,
2275+ env_parse_none_str : str | None = None ,
2276+ env_parse_enums : bool | None = None ,
2277+ ) -> None :
2278+ import_aws_secrets_manager ()
2279+ self ._secretsmanager_client = boto3_client ('secretsmanager' ) # type: ignore
2280+ self ._secret_id = secret_id
2281+ super ().__init__ (
2282+ settings_cls ,
2283+ case_sensitive = True ,
2284+ env_prefix = env_prefix ,
2285+ env_nested_delimiter = '--' ,
2286+ env_ignore_empty = False ,
2287+ env_parse_none_str = env_parse_none_str ,
2288+ env_parse_enums = env_parse_enums ,
2289+ )
2290+
2291+ def _load_env_vars (self ) -> Mapping [str , Optional [str ]]:
2292+ response = self ._secretsmanager_client .get_secret_value (SecretId = self ._secret_id )
2293+
2294+ return json .loads (response ['SecretString' ])
2295+
2296+ def __repr__ (self ) -> str :
2297+ return (
2298+ f'{ self .__class__ .__name__ } (secret_id={ self ._secret_id !r} , '
2299+ f'env_nested_delimiter={ self .env_nested_delimiter !r} )'
2300+ )
2301+
2302+
22532303def _get_env_var_key (key : str , case_sensitive : bool = False ) -> str :
22542304 return key if case_sensitive else key .lower ()
22552305
0 commit comments