Hochladen von Objekten mit vorsignierten URLs - Amazon Simple Storage Service

Hochladen von Objekten mit vorsignierten URLs

Sie können vorsignierte URLs verwenden, damit jemand ein Objekt in Ihren Amazon-S3-Bucket hochladen kann. Die Verwendung einer vorsignierten URL ermöglicht einen Upload, ohne dass die andere Partei über Sicherheitsanmeldeinformationen oder Berechtigungen für AWS verfügen muss. Eine vorsignierte URL ist durch die Berechtigungen des Benutzers eingeschränkt, der sie erstellt hat. Das bedeutet, dass Sie ein Objekt, für das Sie eine vorsignierte URL zum Hochladen eines Objekts erhalten haben, nur dann hochladen können, wenn der Ersteller der URL die erforderlichen Berechtigungen zum Hochladen dieses Objekts besitzt.

Wenn jemand das Objekt über die URL hochlädt, erstellt Amazon S3 das Objekt in dem angegebenen Bucket. Wenn im Bucket bereits ein Objekt mit demselben Schlüssel vorhanden ist, der in der vorsignierten URL angegeben wird, ersetzt Amazon S3 das vorhandene Objekt durch das hochgeladene Objekt. Nach dem Upload gehört das Objekt dem Bucket-Besitzer.

Allgemeine Informationen zu vorsignierten URLs finden Sie unter Herunterladen und Hochladen von Objekten mit vorsignierten URLs.

Sie können mit AWS-Explorer für Visual Studio eine vorsignierte URL zum Hochladen eines Objekts erstellen, ohne einen Code schreiben zu müssen. Sie können eine vorsignierte URL mithilfe von AWS-SDKs auch programmgesteuert generieren.

Anmerkung

Zurzeit unterstützt das AWS Toolkit for Visual Studio Visual Studio für Mac nicht.

  1. Installieren Sie das AWS Toolkit for Visual Studio mithilfe der Anweisungen unter Installation und Einrichtung des Toolkit for Visual Studio im Benutzerhandbuch für AWS Toolkit for Visual Studio.

  2. Stellen Sie anhand der folgenden Schritte im AWS Toolkit for Visual StudioBenutzerhandbuch eine Verbindung zu AWS her: Herstellen einer Verbindung mit AWS.

  3. Klicken Sie in der linken Seitenleiste mit der Bezeichnung AWS Explorer mit der rechten Maustaste auf den Bucket, in den Sie ein Objekt hochladen möchten.

  4. Wählen Sie Vorsignierte URL erstellen aus.

  5. Legen Sie im Pop-up-Fenster das Ablaufdatum und die Ablaufuhrzeit für Ihre vorsignierte URL fest.

  6. Geben Sie für Objektschlüssel den Namen der Datei ein, die hochgeladen werden soll. Die Datei, die Sie hochladen, muss genau diesem Namen entsprechen. Wenn ein Objekt mit dem gleichen Objektschlüssel bereits im Bucket vorhanden ist, ersetzt Amazon S3 das vorhandene Objekt durch das neu hochgeladene Objekt.

  7. Wählen Sie PUT, um anzugeben, dass diese vorsignierte URL zum Hochladen eines Objekts verwendet wird.

  8. Wählen Sie die Schaltfläche Generate (Generieren) aus.

  9. Wählen Sie zum Kopieren der URL in die Zwischenablage Copy (Kopieren) aus.

  10. Um diese URL zu verwenden, können Sie mit dem curl-Befehl eine PUT-Anfrage senden. Geben Sie den vollständigen Pfad zu Ihrer Datei sowie die vorab signierte URL selbst an.

    curl -X PUT -T "/path/to/file" "presigned URL"

Sie können eine vordefinierte URL generieren, die für eine begrenzte Zeit eine S3-Aktion ausführen kann.

Anmerkung

Wenn Sie die AWS CLI oder AWS SDKs verwenden, kann die Verfallszeit für vordefinierte URLs auf bis zu 7 Tage festgelegt werden. Weitere Informationen finden Sie unter Ablaufzeit für vordefinierte URLs.

Python

Das folgende Python-Skript generiert eine vordefinierte URL PUT für das Hochladen eines Objekts in einen S3-Allzweck-Bucket.

  1. Kopieren Sie den Inhalt des Skripts und speichern Sie es als Datei "put-only-url.py". Um das folgende Beispiel zu verwenden, ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Informationen (z. B. Ihren Dateinamen).

    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()
  2. Führen Sie das folgende Skript mit Ihrem Bucket-Namen und dem gewünschten Objektpfad aus, um eine URL mit dem Vorzeichen PUT zum Hochladen einer Datei zu generieren.

    Im folgenden Beispiel wird der Befehl verwendet. Ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Informationen.

    python put-only-url.py amzn-s3-demo-bucket <object-path> --region us-east-1 --content-type application/octet-stream

    Das Skript gibt eine PUT vorsignierte URL aus:

    Generated PUT presigned URL: https://amzn-s3-demo-bucket.s3.amazonaws.com/object.txt?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=vjbyNxybdZaMmLa%2ByT372YEAiv4%3D&Expires=1741978496
  3. Sie können die Datei nun mit der generierten vordefinierten URL mit curl hochladen. Achten Sie darauf, dass Sie denselben Inhaltstyp verwenden, der auch bei der Erstellung der URL verwendet wurde:

    curl -X PUT -T "path/to/your/local/file" -H "Content-Type: application/octet-stream" "generated-presigned-url"

    Wenn Sie bei der Erstellung der URL einen anderen Inhaltstyp angegeben haben, müssen Sie diesen Inhaltstyp auch im curl-Befehl verwenden.

Weitere Beispiele für die Verwendung der AWS SDKs zur Generierung einer vorsignierten URL für das Hochladen eines Objekts finden Sie unter Eine vorsignierte URL für Amazon S3 mithilfe eines AWS-SDK erstellen.

Fehlerbehebung bei SignatureDoesNotMatch-Fehlern

Wenn bei der Verwendung von vorsignierten URLs ein SignatureDoesNotMatch Fehler auftritt, überprüfen Sie Folgendes:

  • Stellen Sie sicher, dass Ihre Systemzeit mit einem zuverlässigen Zeitserver synchronisiert ist.

  • Stellen Sie sicher, dass Sie die URL genau so verwenden, wie sie generiert wurde, ohne irgendwelche Änderungen.

  • Prüfen Sie, ob die URL abgelaufen ist, und erstellen Sie bei Bedarf eine neue.

  • Stellen Sie sicher, dass der Inhaltstyp in Ihrer Upload-Anforderung mit dem Inhaltstyp übereinstimmt, der bei der Generierung der URL angegeben wurde.

  • Stellen Sie sicher, dass Sie die richtige Region für den Bucket verwenden

  • Wenn Sie curl verwenden, schließen Sie die URL in Anführungszeichen ein, um Sonderzeichen korrekt zu behandeln