import logging import boto3 from fansifter_common.adapters.aws.secretsmanager import SecretsManager from fansifter_common.utils.functional import lazy_proxy from app.config import settings logger = logging.getLogger(__name__) class S3Client: def __init__(self, *, region_name: str, session: boto3.Session) -> None: self.client = session.client("s3", region_name=region_name) def get_object_content(self, bucket: str, key: str) -> str: """Get object content as string.""" try: response = self.client.get_object(Bucket=bucket, Key=key) return response["Body"].read().decode("utf-8") except Exception as exc: logger.error( "Failed to get object content from S3.", exc_info=exc, extra={"bucket": bucket, "key": key}, ) raise def get_s3_client() -> S3Client: session = boto3.Session(region_name=settings.aws_region_name) return S3Client(session=session, region_name=settings.aws_region_name) s3_client = lazy_proxy(get_s3_client) def get_secrets_manager() -> SecretsManager: return SecretsManager(region_name=settings.aws_region_name) secrets_manager = lazy_proxy(get_secrets_manager)