"""Secrets Manager implementation.""" from __future__ import annotations from typing import TYPE_CHECKING from python_pdp_sdk.logging_adapter import get_logger if TYPE_CHECKING: from mypy_boto3_secretsmanager import SecretsManagerClient logger = get_logger(__name__) class DatadogSecretsManager: """SecretsManager client for fetching DD creds.""" def __init__( self, environment: str, service_name: str = "datadog", ) -> None: """Attempt to import boto3 and init.""" try: import boto3 except ImportError as exc: raise ImportError( "boto3 is required to fetch Datadog credentials from Secrets Manager. " "Install it or supply dd_api_key directly." ) from exc self.boto3_session = boto3.session.Session() self._client: SecretsManagerClient = self.boto3_session.client("secretsmanager") self._environment = environment self._service_name = service_name @property def client(self) -> SecretsManagerClient: """Return a typed SecretsManager client.""" return self._client def get_secret(self, key: str) -> str: """Get a secret from AWS Secrets Manager. Raises ValueError: If the secret exists but contains no ``SecretString``. """ secret_name = f"{self._environment}/{self._service_name}/{key}" logger.debug( "[MigrationAuthorizationBackend] Fetching DD secret from: %s", secret_name ) response = self.client.get_secret_value(SecretId=secret_name) secret_string = response.get("SecretString") if secret_string is None: raise ValueError( f"Secret '{secret_name}' exists but contains no SecretString value." ) return secret_string