""" This module contains factory functions to create AWS clients. They are cached so that the same client is reused across invocations during the lifetime of the container. """ from functools import lru_cache from common.src.enums import AWSService, AWSRegion from common.src.aws.session import Session from botocore.config import Config def _new_generic_client(service_name: AWSService, region_name: AWSRegion, config=None): """Factory function to create a new generic AWS client. Args: service_name (AWSService): The name of the AWS service, e.g., "lambda". region_name (AWSRegion): The region name, e.g., "us-west-2". config (botocore.config.Config, optional): Optional configuration for the client. """ return Session().client( region_name=region_name, service_name=service_name, config=config ) @lru_cache def new_lambda_client(region_name: AWSRegion): """Factory function to create a new Lambda client. Args: region_name (AWSRegion): The region name, e.g., "us-west-2". """ config = Config(read_timeout=900, connect_timeout=60) return _new_generic_client(AWSService.LAMBDA, region_name, config=config) @lru_cache def new_secrets_manager_client(region_name: AWSRegion): """Factory function to create a new Secrets Manager client. Args: region_name (AWSRegion): The region name, e.g., "us-west-2". """ return _new_generic_client(AWSService.SECRETS_MANAGER, region_name) @lru_cache def new_s3_client(region_name: AWSRegion): """Factory function to create a new S3 client. Args: region_name (AWSRegion): The region name, e.g., "us-west-2". """ return _new_generic_client(AWSService.S3, region_name) @lru_cache def new_sns_client(region_name: AWSRegion): """Factory function to create a new SNS client. Args: region_name (AWSRegion): The region name, e.g., "us-west-2". """ return _new_generic_client(AWSService.SNS, region_name)