import base64 from typing import Any import boto3 from fansifter_common.utils.functional import lazy_proxy from app.config import settings class KMSClient: def __init__( self, *, region_name: str, key_id: str, session: boto3.Session | None = None ) -> None: self.region_name = region_name self.key_id = key_id self._session = session self._client: Any | None = None @property def session(self) -> boto3.Session: if self._session is None: self._session = boto3.Session() return self._session @property def client(self) -> Any: if self._client is None: self._client = self.session.client("kms", region_name=self.region_name) return self._client def decrypt(self, value: str) -> str: response = self.client.decrypt( KeyId=self.key_id, CiphertextBlob=base64.b64decode(value), ) return response["Plaintext"].decode() def get_kms_client() -> KMSClient: return KMSClient(region_name=settings.aws_region_name, key_id=settings.kms_key_id) kms_client = lazy_proxy(get_kms_client)