from __future__ import annotations import json from typing import TYPE_CHECKING, Any, cast try: import boto3 except ImportError as exc: raise ImportError("`boto3` must be installed to use SecretsManager.") from exc if TYPE_CHECKING: from mypy_boto3_secretsmanager import SecretsManagerClient class SecretsManager: """A wrapper around boto3 SecretsManager client.""" def __init__( self, session: boto3.Session | None = None, **client_kwargs: Any ) -> None: self._session = session self._client_kwargs = client_kwargs self._client: SecretsManagerClient | None = None @property def session(self) -> boto3.Session: if self._session is None: self._session = boto3.Session() return self._session @property def client(self) -> SecretsManagerClient: if self._client is None: self._client = self.session.client("secretsmanager", **self._client_kwargs) return self._client def get_secret(self, secret_name: str) -> str: """Get a secret from SecretsManager.""" get_secret_value_response = self.client.get_secret_value(SecretId=secret_name) secret_string: str = get_secret_value_response["SecretString"] try: return cast(str, json.loads(secret_string)) except ValueError: pass return secret_string