Estou usando o código abaixo para gerar uma URL pré-assinada, mas a URL que estou obtendo não contém a região que configurei para o cliente s3.
REGION_NAME = 'me-south-1'
# Initialize S3 client
# Create the S3 client with the correct region
s3_client = boto3.client(
"s3",
aws_access_key_id=AWS_ACCESS_KEY,
aws_secret_access_key=AWS_SECRET_KEY,
region_name=REGION_NAME
)
def upload_file(file_stream, object_name):
"""Uploads a byte stream to the specified bucket on AWS under the 'kyc/' prefix and returns the file URL."""
# Add the 'kyc/' prefix to the object name
object_name_with_prefix = f"kyc/{object_name}"
try:
s3_client.upload_fileobj(file_stream, AWS_BUCKET_NAME, object_name_with_prefix)
print(f"File uploaded successfully as '{object_name_with_prefix}'")
# Construct the file URL
file_url = f"https://{AWS_BUCKET_NAME}.s3.me-south-1.amazonaws.com/{object_name_with_prefix}"
return (True, file_url)
except NoCredentialsError:
print("Credentials not available.")
return (False, NoCredentialsError)
except ClientError as e:
print("Failed to upload file:", e)
return (False, e)
def create_presigned_url_expanded(object_name,
expiration=3600):
url = s3_client.generate_presigned_url(
ClientMethod='get_object',
Params={'Bucket': AWS_BUCKET_NAME, 'Key': object_name},
ExpiresIn=expiration
)
return url
E antes que você pergunte, sim, o balde está na região.
Eu removi a região: o link não funcionou. Adicionei a região ao link manualmente: o novo link não funcionou. Eu defini o cliente na função: não funcionou.
Continuo recebendo o erro IllegalLocationConstraintException.
Quando eu estava carregando o arquivo, recebi esse erro, então adicionei a região à configuração do cliente s3 e o problema foi resolvido, mas aqui não sei por que não está funcionando.
Você precisa fornecer o ponto de extremidade específico da região ao criar o cliente boto3, da seguinte maneira: