Carga de objetos con URL prefirmadas
Puede utilizar URL prefirmadas para permitir que alguien cargue un objeto en su bucket de Amazon S3. El uso de una URL prefirmada permitirá cargar datos sin necesidad de que otra parte disponga de credenciales ni permisos de seguridad de AWS. Una URL prefirmada está limitada por los permisos del usuario que la crea. Es decir, si recibe una URL prefirmada para cargar un objeto, podrá cargarlo solamente si el creador de la URL cuenta con los permisos necesarios para ello.
Cuando alguien usa la URL para cargar un objeto, Amazon S3 crea el objeto en el bucket especificado. Si ya existe en el bucket un objeto con la misma clave que se ha especificado en la URL prefirmada, Amazon S3 reemplaza el objeto existente con el objeto cargado. Tras la carga, el propietario del bucket será el propietario del objeto.
Para obtener información general sobre las URL prefirmadas, consulte Descarga y carga de objetos con URL prefirmadas.
Puede crear URL prefirmada para cargar un objeto sin necesidad de escribir código alguno gracias a AWS Explorer para Visual Studio. Puede generar una URL prefirmada mediante programación con los SDK de AWS.
En este momento, AWS Toolkit for Visual Studio no es compatible con Visual Studio para Mac.
-
Instale AWS Toolkit for Visual Studio siguiendo las instrucciones de Installing and setting up the Toolkit for Visual Studio en la Guía del usuario de AWS Toolkit for Visual Studio.
-
Conéctese a AWS con los pasos siguientes, Conexión a AWS en la Guía del usuario de AWS Toolkit for Visual Studio.
-
En el panel lateral izquierdo que tiene la etiqueta Explorador de AWS, haga clic con el botón derecho en el bucket en el que desee cargar un objeto.
-
Elija Crear URL prefirmada…
-
En la ventana emergente, defina la fecha y la hora de vencimiento de su URL prefirmada.
-
En Clave de objeto, establezca el nombre del archivo que se va a cargar. El archivo que vaya a cargar debe coincidir exactamente con este nombre. Si ya existe un objeto con la misma clave de objeto en el bucket, Amazon S3 sustituirá el objeto existente por el objeto recién cargado.
-
Elija PUT para especificar que esta URL prefirmada se utilizará para cargar un objeto.
-
Elija el botón Generate (Generar).
-
Para copiar la URL en el portapapeles, elija Copy (Copiar).
-
Para usar esta URL, puede enviar una solicitud PUT con el comando curl
. Incluya la ruta completa al archivo y la propia URL prefirmada.
curl -X PUT -T "/path/to/file
" "presigned URL
"
Puede generar una URL prefirmada que pueda realizar una acción de S3 durante un tiempo limitado.
- Python
-
El siguiente script Python genera una URL prefirmada PUT
para cargar un objeto en un bucket de propósito general de S3.
-
Copie el contenido del script y guárdelo como el archivo “put-only-url.py
”. Para utilizar los siguientes ejemplos, reemplace los marcadores de posición de entrada de usuario
por información propia (como el nombre de archivo).
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 generar una URL prefirmada PUT
para cargar un archivo, ejecute el siguiente script con el nombre del bucket y la ruta del objeto deseado.
El siguiente comando utiliza valores de ejemplo. Reemplace los marcadores de posición de entrada del usuario
por información propia.
python put-only-url.py
amzn-s3-demo-bucket
<object-path>
--region us-east-1
--content-type application/octet-stream
El script generará una URL prefirmada PUT
:
Generated PUT presigned URL: https://amzn-s3-demo-bucket
.s3.amazonaws.com/object.txt
?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
&Signature=vjbyNxybdZaMmLa%2ByT372YEAiv4%3D
&Expires=1741978496
-
Ahora puede cargar el archivo utilizando la URL prefirmada generada con curl. Asegúrese de incluir el mismo tipo de contenido que se utilizó al generar la URL:
curl -X PUT -T "path/to/your/local/file"
-H "Content-Type: application/octet-stream" "generated-presigned-url"
Si especificó un tipo de contenido diferente al generar la URL, asegúrese de usar ese mismo tipo de contenido en el comando curl.
Para ver más ejemplos de cómo utilizar los SDK de AWS para generar una URL prefirmada para cargar un objeto, consulte Creación de una URL prefirmada para Amazon S3 mediante un AWS SDK.
Solución de errores de SignatureDoesNotMatch
Si se produce un error SignatureDoesNotMatch
al utilizar direcciones URL prefirmadas, compruebe lo siguiente:
-
Verifique que la hora del sistema esté sincronizada con un servidor de tiempo fiable.
-
Asegúrese de utilizar la URL exactamente como se generó, sin ninguna modificación.
-
Compruebe si la URL ha caducado y genere una nueva si es necesario.
-
Asegúrese de que el tipo de contenido de la solicitud de carga coincida con el tipo de contenido especificado al generar la URL.
-
Verifique que está usando la región correcta para el bucket.
-
Cuando utilice curl, escriba la URL entre comillas para gestionar correctamente los caracteres especiales.