Carregar objetos com URLs pré-assinados
Você pode usar URLs pré-assinados para permitir que alguém carregue um objeto no seu bucket do Amazon S3. O uso de um URL pré-assinado permitirá um carregamento sem exigir que outra pessoa tenha credenciais ou permissões de segurança da AWS. Um URL pré-assinado é limitado pelas permissões do usuário que o criou. Isto é, se você receber um URL pré-assinado para carregar um objeto, só poderá fazer isso se o criador do URL pré-assinado tiver as permissões necessárias para carregar esse objeto.
Quando alguém usa o URL para carregar um objeto, o Amazon S3 cria o objeto no bucket especificado. Se um objeto com a mesma chave especificada no pre-signed URL já existir no bucket, o Amazon S3 substituirá o objeto existente pelo objeto obtido por upload. Após o carregamento, o proprietário do bucket será o proprietário do objeto.
Para obter informações gerais sobre URLs pré-assinados, consulte Baixar e fazer upload de objetos com URLs pré-assinados.
É possível criar um URL pré-assinado para carregar um objeto sem escrever nenhum código usando o AWS Explorer for Visual Studio. Também é possível gerar um URL pré-assinado programaticamente usando AWS SDKs.
No momento, o AWS Toolkit for Visual Studio não é compatível com o Visual Studio para Mac.
-
Instale o AWS Toolkit for Visual Studio usando as instruções a seguir, Installing and setting up the Toolkit for Visual Studio no Guia do usuário do AWS Toolkit for Visual Studio.
-
Conecte-se à AWS usando as etapas a seguir, Conectar-se ao AWS no Guia do usuário do AWS Toolkit for Visual Studio.
-
No painel do lado esquerdo chamado AWS Explorer, clique com o botão direito do mouse no bucket para o qual você deseja que um objeto seja carregado.
-
Escolha Criar URL pré-assinado….
-
Na janela pop-up, defina a data e hora de validade para o URL pré-assinado.
-
Em Chave de objeto, defina o nome do arquivo a ser carregado. O arquivo que você está carregando deve corresponder exatamente a esse nome. Se já existir um objeto com a mesma chave de objeto no bucket, o Amazon S3 substituirá o objeto existente pelo objeto recém-carregado.
-
Escolha PUT para especificar que esse URL pré-assinado será usado para carregar um objeto.
-
Escolha o botão Generate (Gerar).
-
Para copiar o URL para a área de transferência, escolha Copy (Copiar).
-
Para usar esse URL, você pode enviar uma solicitação PUT com o comando curl
. Inclua o caminho completo para o arquivo e o próprio URL pré-assinado.
curl -X PUT -T "/path/to/file
" "presigned URL
"
É possível gerar um URL pré-assinado que possa realizar uma ação do S3 por tempo limitado.
- Python
-
O script do Python a seguir gera um URL PUT
pré-assinado para fazer upload de um objeto em um bucket de uso geral do S3.
-
Copie o conteúdo do script e salve-o como arquivo “put-only-url.py
”. Para usar os exemplos a seguir, substitua os espaços reservados para entrada do usuário
por suas próprias informações (como o nome de seu arquivo).
import argparse
import boto3
from botocore.exceptions import ClientError
def generate_presigned_url(s3_client, client_method, method_parameters, expires_in):
"""
Generate a presigned Amazon S3 URL that can be used to perform an action.
:param s3_client: A Boto3 Amazon S3 client.
:param client_method: The name of the client method that the URL performs.
:param method_parameters: The parameters of the specified client method.
:param expires_in: The number of seconds the presigned URL is valid for.
:return: The presigned URL.
"""
try:
url = s3_client.generate_presigned_url(
ClientMethod=client_method,
Params=method_parameters,
ExpiresIn=expires_in
)
except ClientError:
print(f"Couldn't get a presigned URL for client method '{client_method}'.")
raise
return url
def main():
parser = argparse.ArgumentParser()
parser.add_argument("bucket", help="The name of the bucket.")
parser.add_argument(
"key", help="The key (path and filename) in the S3 bucket.",
)
parser.add_argument(
"--region", help="The AWS region where the bucket is located.", default="us-east-1"
)
parser.add_argument(
"--content-type", help="The content type of the file to upload.", default="application/octet-stream"
)
args = parser.parse_args()
# Create S3 client with explicit region configuration
s3_client = boto3.client("s3", region_name=args.region)
# Optionally set signature version if needed for older S3 regions
# s3_client.meta.config.signature_version = 's3v4'
# The presigned URL is specified to expire in 1000 seconds
url = generate_presigned_url(
s3_client,
"put_object",
{
"Bucket": args.bucket,
"Key": args.key,
"ContentType": args.content_type # Specify content type
},
1000
)
print(f"Generated PUT presigned URL: {url}")
if __name__ == "__main__":
main()
-
Para gerar uma URL PUT
pré-assinado para fazer upload de um arquivo, execute o script a seguir com o nome do bucket e o caminho do objeto desejado.
O comando a seguir usa exemplo de valores. Substitua os espaços reservados para entrada do usuário
por suas próprias informações.
python put-only-url.py
amzn-s3-demo-bucket
<object-path>
--region us-east-1
--content-type application/octet-stream
O script exibirá um URL PUT
pré-assinado:
Generated PUT presigned URL: https://amzn-s3-demo-bucket
.s3.amazonaws.com/object.txt
?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
&Signature=vjbyNxybdZaMmLa%2ByT372YEAiv4%3D
&Expires=1741978496
-
Agora você pode fazer upload do arquivo usando o URL pré-assinado gerado com curl. Você deve incluir o mesmo tipo de conteúdo usado ao gerar o URL:
curl -X PUT -T "path/to/your/local/file"
-H "Content-Type: application/octet-stream" "generated-presigned-url"
Se você especificou um tipo de conteúdo diferente ao gerar o URL, use esse mesmo tipo de conteúdo no comando curl.
Para obter mais exemplos de como usar SDKs da AWS para gerar um URL pré-assinado para fazer upload de um objeto, consulte Create a presigned URL for Amazon S3 by using an AWS SDK.
Solucionar problemas de SignatureDoesNotMatch
Se você encontrar um erro SignatureDoesNotMatch
ao usar URLs pré-assinados, faça o seguinte:
-
Verifique se a hora do sistema está sincronizada com um servidor de horário confiável.
-
Confirme se você está usando o URL exatamente como gerado, sem modificações.
-
Verifique se o URL expirou e gerou um novo, se necessário.
-
Garantia que o tipo de conteúdo em sua solicitação de upload corresponda ao tipo de conteúdo especificado ao gerar o URL.
-
Confirme se você está usando a região correta para o bucket.
-
Ao usar curl, coloque o URL entre aspas para lidar adequadamente com caracteres especiais.