import logging import boto3 from botocore.config import Config logger = logging.getLogger(__name__) s3_config = Config(signature_version="s3v4") URL_EXPIRE = 60 * 30 def s3_delete(source=None, bucket_name=None, file_key=None): try: if source: source_parts = source.split("/") bucket_name = source_parts[0] file_key = "/".join(source_parts[1:]) if bucket_name and file_key: s3 = boto3.resource("s3") try: s3.Object(bucket_name, file_key).delete() except s3.meta.client.exceptions.NoSuchBucket: pass else: RuntimeError("Please provide either full file source or bucket and key") except Exception as e: logger.exception(e) def s3_move(src_bucket, src_key, dst_bucket, dst_key): s3 = boto3.resource("s3") s3.Object(dst_bucket, dst_key).copy_from( CopySource={"Bucket": src_bucket, "Key": src_key}, ServerSideEncryption="AES256" ) s3.Object(src_bucket, src_key).delete() def s3_put(bucket, key, body): s3 = boto3.resource("s3") s3.Object(bucket, key).put(Body=body, ServerSideEncryption="AES256") def s3_signed_download_url(bucket, key, url_expire=URL_EXPIRE, content_type="text/csv"): s3_client = boto3.client("s3", config=s3_config) try: return s3_client.generate_presigned_url( ClientMethod="get_object", Params={"Bucket": bucket, "Key": key, "ResponseContentType": content_type}, ExpiresIn=url_expire, ) except Exception as e: logger.exception("URL SIGNING FAILED", exc_info=e) raise e