

# Carregar objetos com URLs pré-assinados
<a name="PresignedUrlUploadObject"></a>



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](using-presigned-url.md).

É 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.

**nota**  
No momento, o AWS Toolkit for Visual Studio não é compatível com o Visual Studio para Mac.

## Usar o AWS Toolkit for Visual Studio (Windows)
<a name="upload-object-presignedurl-vsexplorer"></a>

1. Instale o AWS Toolkit for Visual Studio usando as instruções a seguir, [Installing and setting up the Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/setup.html) no *Guia do usuário do AWS Toolkit for Visual Studio*.

1. Conecte-se à AWS usando as etapas a seguir, [Conectar-se ao AWS](https://docs.aws.amazon.com/AWSToolkitVS/latest/UserGuide/connect.html) no *Guia do usuário do AWS Toolkit for Visual Studio*.

1. 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.

1. Escolha **Criar URL pré-assinado…**.

1. Na janela pop-up, defina a data e hora de validade para o URL pré-assinado.

1. 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. 

1. Escolha **PUT** para especificar que esse URL pré-assinado será usado para carregar um objeto.

1. Escolha o botão **Generate (Gerar)**.

1. Para copiar o URL para a área de transferência, escolha **Copy (Copiar)**.

1. 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"
   ```

## Usar SDKs da AWS para gerar um URL pré-assinado `PUT` e fazer upload de um arquivo
<a name="presigned-urls-upload-sdk"></a>

 É possível gerar um URL pré-assinado que possa realizar uma ação do S3 por tempo limitado. 

**nota**  
Se você usar a AWS CLI ou SDKs da AWS, o tempo de validade dos URLs pré-assinados poderá ser definido como até sete dias. Para obter mais informações, consulte [Tempo de validade para URLs pré-assinados](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html#PresignedUrl-Expiration).

------
#### [ 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. 

1. 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()
   ```

1. 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
   ```

1. 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](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_Scenario_PresignedUrl_section.html).

**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.
Garanta 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.

------