Source code for profile_photo.utils.aws.s3

from __future__ import annotations

from boto3 import Session, client
from botocore.config import Config
from botocore.exceptions import ClientError

from .client_cache import ClientCache
from ...log import LOG


[docs]class S3Helper(ClientCache): """ Helper class for interacting with the `boto3` S3 client. """ SERVICE_NAME = 's3' def __init__(self, region_name='us-east-1', profile_name=None, access_key: str | None = None, secret_key: str | None = None, use_sig_v4=False, init_client=False, max_pool_connections=None): self.access_key = access_key self.secret_key = secret_key self.use_sig_v4 = use_sig_v4 super().__init__(region_name, profile_name, init_client, max_pool_connections=max_pool_connections) def _create_client(self): client_kwargs = {} config_kwargs = {} if self.THREAD_SAFE or self.profile_name: client_func = Session(profile_name=self.profile_name).client else: client_func = client if self.access_key and self.secret_key: # Using access keys from an IAM user client_kwargs['aws_access_key_id'] = self.access_key client_kwargs['aws_secret_access_key'] = self.secret_key if self.max_pool_connections: config_kwargs['max_pool_connections'] = self.max_pool_connections if self.use_sig_v4: # Get the service client with signature v4 configured LOG.info('Creating S3 client with sigv4 configured') config_kwargs['signature_version'] = 's3v4' if config_kwargs: client_kwargs['config'] = Config(**config_kwargs) return client_func(self.SERVICE_NAME, self.region_name, **client_kwargs)
[docs] def get_object_bytes(self, bucket, key) -> bytes: """ Retrieve an object (raw bytes) from S3. """ try: res = self.client.get_object(Bucket=bucket, Key=key) except ClientError as ce: error_data = ce.response['Error'] LOG.error('Error retrieving object, error data: %s', str(error_data)) raise return res['Body'].read()