Chargement d’objets à l’aide d’URL présignées
Vous pouvez utiliser des URL présignées pour permettre à quelqu’un de charger un objet dans votre compartiment Amazon S3. Une URL présignée permet d’effectuer un chargement sans qu’une autre partie ait besoin d’informations d’identification ou d’autorisations de sécurité AWS. Une URL présignée est limitée par les autorisations de l’utilisateur qui l’a créée. Cela signifie que si vous recevez une URL présignée pour charger un objet, vous pouvez le charger uniquement si le créateur de l’URL dispose des autorisations nécessaires pour charger cet objet.
Lorsqu’une personne utilise l’URL pour charger un objet, Amazon S3 crée l’objet dans le compartiment spécifié. Si un objet avec la même clé que celle spécifiée dans l’URL présignée existe déjà dans le compartiment, Simple Storage Service (Amazon S3) remplace l’objet existant par l’objet chargé. Après le chargement, le propriétaire du compartiment devient propriétaire de l’objet.
Pour des informations générales sur les URL présignées, consultez Téléchargement et chargement d’objets à l’aide d’URL présignées.
Vous pouvez créer une URL présignée pour le chargement d’un objet sans écrire de code grâce à AWS Explorer for Visual Studio. Vous pouvez également générer une URL présignée par programmation à l’aide des kits AWS SDK.
À l’heure actuelle, AWS Toolkit for Visual Studio ne prend pas en charge Visual Studio pour Mac.
-
Installez AWS Toolkit for Visual Studio en suivant les instructions ci-dessous, Installation et configuration de Toolkit for Visual Studio dans le Guide de l’utilisateur AWS Toolkit for Visual Studio.
-
Connectez-vous à AWS en suivant les étapes dans Connexion à AWS dans le Guide de l’utilisateur AWS Toolkit for Visual Studio.
-
Dans le volet de gauche intitulé Explorateur AWS, cliquez avec le bouton droit sur le compartiment dans lequel vous souhaitez charger un objet.
-
Choisissez Créer une URL présignée.
-
Dans la fenêtre contextuelle, définissez la date et l’heure d’expiration de votre URL présignée.
-
Pour Clé d’objet, définissez le nom du fichier à charger. Le fichier que vous chargez doit correspondre exactement à ce nom. Si un objet avec la même clé que celle spécifiée dans l’URL présignée existe déjà dans le compartiment, Amazon S3 remplace l’objet existant par l’objet chargé.
-
Choisissez PUT pour spécifier que cette URL présignée est utilisée pour charger un objet.
-
Cliquez sur le bouton Générer.
-
Pour copier l’URL dans le presse-papiers, choisissez Copier.
-
Pour utiliser cette URL, vous pouvez envoyer une demande PUT avec la commande curl. Incluez le chemin complet de votre fichier et l’URL présignée elle-même.
curl -X PUT -T "/path/to/file" "presigned URL"
Vous pouvez générer une URL présignée qui peut exécuter une action S3 pendant une durée limitée.
Si vous utilisez l’interface de ligne de commande AWS ou les kits AWS SDK, le délai d’expiration des URL présignées peut être de sept jours. Pour plus d’informations, consultez Délai d’expiration pour les URL présignées.
- Python
-
Le script Python suivant génère une URL PUT présignée pour le chargement d’un objet dans un compartiment S3 à usage général.
-
Copiez le contenu du script et enregistrez-le sous « put-only-url.py ». Pour utiliser les exemples suivants, remplacez les espaces réservés à la saisie utilisateur par vos propres informations (nom de votre fichier, par exemple).
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()
-
Pour générer une URL PUT présignée pour le chargement d’un fichier, exécutez le script suivant avec le nom de votre compartiment et le chemin d’objet souhaité.
La commande suivante utilise des valeurs d’exemple. Remplacez les espaces réservés à la saisie utilisateur par vos propres informations.
python put-only-url.py amzn-s3-demo-bucket <object-path> --region us-east-1 --content-type application/octet-stream
Le script affiche une URL PUT présignée :
Generated PUT presigned URL: https://amzn-s3-demo-bucket.s3.amazonaws.com/object.txt?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=vjbyNxybdZaMmLa%2ByT372YEAiv4%3D&Expires=1741978496
-
Vous pouvez désormais charger le fichier en utilisant l’URL présignée générée avec curl. Assurez-vous d’inclure le même type de contenu que celui utilisé lors de la génération de l’URL :
curl -X PUT -T "path/to/your/local/file" -H "Content-Type: application/octet-stream" "generated-presigned-url"
Si vous avez spécifié un autre type de contenu lors de la génération de l’URL, veillez à utiliser le même type de contenu dans la commande curl.
Pour obtenir des exemples d’utilisation des kits AWS SDK afin de générer une URL présignée pour le chargement d’un objet, consultez Création d’une URL présignée pour Amazon S3 à l’aide d’un kit AWS SDK.
Résolution des erreurs SignatureDoesNotMatch
Si vous rencontrez une erreur SignatureDoesNotMatch lors de l’utilisation d’URL présignées, vérifiez les points suivants :
-
Vérifiez que l’heure de votre système est synchronisée avec un serveur de temps fiable
-
Assurez-vous d’utiliser l’URL exactement telle qu’elle a été générée, sans aucune modification
-
Vérifiez si l’URL a expiré et générez-en une nouvelle si nécessaire
-
Assurez-vous que le type de contenu de votre demande de chargement correspond au type de contenu spécifié lors de la génération de l’URL
-
Vérifiez que vous utilisez la bonne région pour le compartiment
-
Lorsque vous utilisez curl, placez l’URL entre guillemets pour gérer correctement les caractères spéciaux