46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
import boto3
|
|
from botocore.client import Config
|
|
from boto3.s3.transfer import TransferConfig
|
|
|
|
from config import (
|
|
S3_ENDPOINT,
|
|
S3_REGION,
|
|
S3_ACCESS_KEY,
|
|
S3_SECRET_KEY,
|
|
S3_MAX_CONCURRENCY,
|
|
S3_MULTIPART_THRESHOLD_MB,
|
|
S3_MULTIPART_CHUNK_MB,
|
|
)
|
|
|
|
S3_TRANSFER_CONFIG = TransferConfig(
|
|
multipart_threshold=S3_MULTIPART_THRESHOLD_MB * 1024 * 1024,
|
|
multipart_chunksize=S3_MULTIPART_CHUNK_MB * 1024 * 1024,
|
|
max_concurrency=S3_MAX_CONCURRENCY,
|
|
use_threads=True,
|
|
)
|
|
|
|
def get_s3_client():
|
|
kwargs = {
|
|
"aws_access_key_id": S3_ACCESS_KEY,
|
|
"aws_secret_access_key": S3_SECRET_KEY,
|
|
"config": Config(signature_version="s3v4"),
|
|
}
|
|
|
|
if S3_ENDPOINT:
|
|
kwargs["endpoint_url"] = S3_ENDPOINT
|
|
kwargs["region_name"] = S3_REGION or "us-east-1"
|
|
else:
|
|
if not S3_REGION:
|
|
raise RuntimeError("AWS S3 requires S3_REGION")
|
|
kwargs["region_name"] = S3_REGION
|
|
|
|
return boto3.client("s3", **kwargs)
|
|
|
|
|
|
def generate_presigned_url(s3, bucket: str, key: str, expires: int):
|
|
return s3.generate_presigned_url(
|
|
ClientMethod="get_object",
|
|
Params={"Bucket": bucket, "Key": key},
|
|
ExpiresIn=expires,
|
|
)
|