"""AWS service utilities.""" import boto3 from botocore.exceptions import ClientError from payee.config import Config, s3_client class KMSAliasNotFound(Exception): """KMS Alias not found.""" pass class KMSAliasAccessDenied(Exception): """KMS Access Denied.""" pass class KMSTokenExpired(Exception): """AWS Security Token Expired.""" pass class KMSTokenInvalid(Exception): """AWS Security Token Expired.""" pass def access_kms_key(key_id, region_name='us-east-1'): """TODO - migrate this kms logic into shared package.""" cl = boto3.client('kms', region_name=region_name) try: cl.describe_key(KeyId=key_id) except cl.exceptions.NotFoundException as e: raise KMSAliasNotFound(key_id, e) except ClientError as e: aws_error_type = e.response.get('Error').get('Code') if aws_error_type == 'AccessDeniedException': raise KMSAliasAccessDenied(key_id, e) if aws_error_type == 'ExpiredTokenException': raise KMSTokenExpired(key_id, e) if aws_error_type == 'UnrecognizedClientException': raise KMSTokenInvalid(key_id, e) raise e def get_s3_url_for_file(file_data: bytes, file_name: str, folder_name: str) -> str: """Upload a file to S3 and return a URL that points to it.""" s3_key = f'{folder_name}/{file_name}' s3_client.put_object(Bucket=Config.OWS_PAYEE_S3_BUCKET, Key=s3_key, Body=file_data) return s3_client.generate_presigned_url( 'get_object', Params={'Bucket': Config.OWS_PAYEE_S3_BUCKET, 'Key': s3_key}, ExpiresIn=Config.S3_PRESIGNED_URL_EXPIRATION_TIME, )