Uma URL presignada no S3 permite acesso temporário a um objeto no armazenamento sem precisar alterar as permissões de acesso do objeto. É uma ferramenta prática para permitir que usuários de terceiros façam download de arquivos. Neste artigo, veremos como criar uma URL presignada de duas maneiras: no painel de controle da Hostman ou via AWS CLI.
A geração de URL presignada está disponível apenas para buckets privados. Para gerar uma URL presignada:

O link será copiado para a área de transferência e permanecerá ativo por 60 minutos. Depois disso, o link retornará um erro 403. O painel de controle não permite alterar esse parâmetro.
Você também pode gerar um link para uma versão específica do objeto se o versionamento estiver habilitado no bucket. Para isso:
Você pode criar uma URL presignada usando a AWS CLI com o seguinte comando:
aws s3 presign s3://<bucket>/<object> --expires-in 60 --endpoint-url https://s3.hmstorage.net
O parâmetro --expires-in é opcional. Ele define por quanto tempo o objeto ficará disponível pelo link (em segundos). Se o parâmetro não for especificado, o objeto ficará disponível por 3600 segundos (1 hora).
As ferramentas padrão não oferecem suporte à geração de uma URL presignada para uma versão diferente da atual. Para criar um link para uma versão específica do objeto, você pode usar scripts personalizados. Por exemplo, o seguinte script em Python pode ser usado:
#!/usr/bin/env python3
import argparse
import boto3
parser = argparse.ArgumentParser()
parser.add_argument('--bucket', required=True)
parser.add_argument('--key', required=True)
parser.add_argument('--expires-in', type=int, default=3600)
parser.add_argument('--version-id')
parser.add_argument('--method', default='get_object')
args = parser.parse_args()
client = boto3.client('s3', endpoint_url='https://s3.hmstorage.net')
params = {'Bucket': args.bucket, 'Key': args.key}
if args.version_id:
params.update({'VersionId': args.version_id})
url = client.generate_presigned_url(args.method, Params=params, ExpiresIn=args.expires_in)
print(url)
Execute o script com:
python ./main.py --bucket <bucket-name> --key <object-key> --expires-in 6969 --version-id <object-version>
Onde:
--expires-in é o tempo em segundos até o link expirar.--version-id é a versão do objeto (VersionId), que pode ser obtida, por exemplo, via AWS CLI.O script usará as credenciais de autenticação de ~/.aws/credentials.
Você pode gerar previamente uma URL presignada para enviar um objeto, mesmo que o objeto ainda não exista no bucket. Ferramentas padrão como a AWS CLI não oferecem suporte a isso, mas é possível fazer usando um SDK, como o boto3 para Python.
Exemplo de script:
import boto3
from botocore.client import Config
# Enter your credentials
AWS_ACCESS_KEY_ID = 'S3 Access Key'
AWS_SECRET_ACCESS_KEY = 'S3 Secret Access Key'
BUCKET_NAME = 'Bucket Name'
OBJECT_KEY = 'example.txt' # name of the future object
EXPIRES_IN = 3600 # link expiration time in seconds
s3 = boto3.client(
's3',
endpoint_url='https://s3.hmstorage.net',
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
config=Config(signature_version='s3v4'),
region_name='us-2'
)
# Generate presigned URL
url = s3.generate_presigned_url(
ClientMethod='put_object',
Params={
'Bucket': BUCKET_NAME,
'Key': OBJECT_KEY,
},
ExpiresIn=EXPIRES_IN
)
print(url)
Não é necessário especificar
Content-Typeao gerar o link, pois incluí-lo pode causar um erro.
Depois de executar o script, será gerado um link temporário para upload.
Você pode enviar o arquivo usando curl:
curl -X PUT -T /path/to/file.txt -H "Content-Type: text/plain" "<presigned-url-from-script>"