Freigabe von Objekten unter Verwendung vorsignierter URLs
Standardmäßig sind alle S3-Objekte privat. Nur der Objekteigentümer hat die Berechtigung, darauf zuzugreifen. Der Objekteigentümer kann die Objekte jedoch optional mit anderen teilen, indem er eine vorsignierte URL erstellt und seine eigenen Sicherheitsanmeldeinformationen verwendet, um eine temporäre Berechtigung für den Download der Objekte zu erteilen.
Wenn Sie eine vorsignierte URL für Ihr Objekt erstellen, müssen Sie Ihre Sicherheitsanmeldeinformationen angeben und dann einen Bucket-Namen, einen Objektschlüssel, eine HTTP-Methode (GET zum Herunterladen des Objekts) sowie ein Ablaufdatum und eine Ablaufzeit angeben. Vorsignierte URLs sind nur für die angegebene Dauer gültig. Wenn Sie eine vorsignierte URL mit einem temporären Token erstellt haben, verfällt die URL mit Ablauf des Token, auch wenn die URL mit einer späteren Ablaufzeit erstellt wurde.
Jeder, der die vorsignierte URL erhält, kann dann auf das Objekt zugreifen. Wenn Sie beispielsweise ein Video in Ihrem Bucket haben und sowohl der Bucket als auch das Objekt privat sind, können Sie das Video mit anderen teilen, indem Sie eine vorsignierte URL generieren. Da vorsignierte URLs jedem, der die URL hat, Zugriff auf Ihre Amazon-S3-Buckets gewähren, empfehlen wir Ihnen, diese angemessen zu schützen. Weitere Informationen zum Schutz vorsignierter URLs finden Sie unter Beschränkung der Funktionen für vorsignierte URLs.
Weitere Informationen dazu, wer eine vorsignierte URL erstellen kann finden Sie unter Wer eine vorsignierte URL erstellen kann.
Generieren einer vorsignierten URL zur Freigabe eines Objekts
Sie können mit der S3-Konsole oder AWS-Explorer für Visual Studio eine vorsignierte URL für ein Objekt generieren, ohne Code schreiben zu müssen. Sie können eine vorsignierte URL auch mithilfe der AWS-SDKs für Java, .NET, Ruby, PHP, Node.js, Python und Go programmgesteuert generieren.
Wenn Sie eine vorsignierte URL generieren, stellen Sie sicher, dass die Parameter in Ihrer Anfrage genau mit der Signatur übereinstimmen. Wenn Sie beispielsweise bei der Generierung der URL keinen Inhaltstyp angeben, müssen Sie den Inhaltstyp weglassen, wenn Sie ein Objekt hochladen. Außerdem werden Platzhalter nicht unterstützt und die Verwendung eines Platzhalters in Ihrer vorsignierten URL führt zu einem Fehler.
Sie können die AWS Management Console verwenden, um eine vorsignierte URL für ein Objekt zu generieren, indem Sie diese Schritte ausführen.
In der Amazon-S3-Konsole beträgt die maximale Ablaufzeit für eine vorsignierte URL 12 Stunden ab dem Zeitpunkt der Erstellung.
Generieren einer vorsignierten URL mit AWS Management Console
Melden Sie sich bei der AWS Management Console an und öffnen Sie die Amazon-S3-Konsole unter https://console.aws.amazon.com/s3/.
-
Wählen Sie in der Liste Buckets den Namen des Buckets mit dem Objekt aus, für das Sie eine vorsignierte URL haben möchten.
-
In der Liste Objekte wählen Sie das Objekt aus, für das Sie eine vorsignierte URL erstellen möchten.
-
Wählen Sie im Menü Actions (Aktionen) die Option Share with a presigned URL (An vorsignierte URL freigeben).
-
Geben Sie an, wie lange die vorsignierte URL gültig sein soll.
-
Wählen Sie Create presigned URL (Vorsignierte URL erstellen).
-
Wenn eine Bestätigung angezeigt wird, wird die URL automatisch in Ihre Zwischenablage kopiert. Sie sehen eine Schaltfläche zum Kopieren der vorsignierten URL, wenn Sie sie erneut kopieren müssen.
Wenn Sie Visual Studio verwenden, können Sie auch den AWS-Explorer für Visual Studio verwenden, um eine vorsignierte URL für ein Objekt zu erstellen, ohne Code schreiben zu müssen. Jeder mit dieser URL kann das Objekt herunterladen. Weitere Informationen finden Sie unter Using Amazon S3 from AWS Explorer (Verwenden von Amazon S3 im AWS Explorer).
Mit AWS Explorer for Visual Studio beträgt die maximale Ablaufzeit für eine vorsignierte URL 7 Tage ab dem Zeitpunkt der Erstellung.
Anleitungen zur Installation des AWS Explorers finden Sie unter Entwickeln mit Amazon S3 unter Verwendung der AWS-SDKs und Explorer.
Die folgenden Beispiele generieren eine vorsignierte URL, die Sie für andere bereitstellen können, so dass sie ein Objekt abrufen können.
Mit den AWS-SDKs beträgt die maximale Ablaufzeit für eine vorsignierte URL 7 Tage ab dem Zeitpunkt der Erstellung.
- Java
-
Das folgende Beispiel erstellt eine vorsignierte URL, die Sie für andere bereitstellen können, so dass sie ein Objekt aus einem S3-Bucket abrufen können. Weitere Informationen finden Sie unter Freigabe von Objekten unter Verwendung vorsignierter URLs.
Anweisungen zum Erstellen und Testen eines funktionierenden Beispiels finden Sie unter Testen der Java-Codebeispiele für Amazon S3.
import com.amazonaws.AmazonServiceException;
import com.amazonaws.HttpMethod;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
import java.io.IOException;
import java.net.URL;
import java.time.Instant;
public class GeneratePresignedURL {
public static void main(String[] args) throws IOException {
Regions clientRegion = Regions.DEFAULT_REGION;
String bucketName = "*** Bucket name ***";
String objectKey = "*** Object key ***";
try {
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withRegion(clientRegion)
.withCredentials(new ProfileCredentialsProvider())
.build();
// Set the presigned URL to expire after one hour.
java.util.Date expiration = new java.util.Date();
long expTimeMillis = Instant.now().toEpochMilli();
expTimeMillis += 1000 * 60 * 60;
expiration.setTime(expTimeMillis);
// Generate the presigned URL.
System.out.println("Generating pre-signed URL.");
GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(bucketName, objectKey)
.withMethod(HttpMethod.GET)
.withExpiration(expiration);
URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
System.out.println("Pre-Signed URL: " + url.toString());
} catch (AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it, so it returned an error response.
e.printStackTrace();
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
e.printStackTrace();
}
}
}
- .NET
-
Anweisungen zum Erstellen und Testen eines funktionierenden Beispiels finden Sie unter Ausführen der .NET-Codebeispiele für Amazon S3.
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
namespace Amazon.DocSamples.S3
{
class GenPresignedURLTest
{
private const string bucketName = "*** bucket name ***";
private const string objectKey = "*** object key ***";
// Specify how long the presigned URL lasts, in hours
private const double timeoutDuration = 12;
// Specify your bucket region (an example region is shown).
private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
private static IAmazonS3 s3Client;
public static void Main()
{
s3Client = new AmazonS3Client(bucketRegion);
string urlString = GeneratePreSignedURL(timeoutDuration);
}
static string GeneratePreSignedURL(double duration)
{
string urlString = "";
try
{
GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest
{
BucketName = bucketName,
Key = objectKey,
Expires = DateTime.UtcNow.AddHours(duration)
};
urlString = s3Client.GetPreSignedURL(request1);
}
catch (AmazonS3Exception e)
{
Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
}
catch (Exception e)
{
Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
}
return urlString;
}
}
}
- JavaScript
-
Das folgende Beispiel erstellt einen Bucket, platziert ein Objekt, erstellt eine signierte URL für dieses Objekt, ruft die URL ab und löscht dann das Objekt und den Bucket.
import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3";
import { fromIni } from "@aws-sdk/credential-providers";
import { HttpRequest } from "@aws-sdk/protocol-http";
import {
getSignedUrl,
S3RequestPresigner,
} from "@aws-sdk/s3-request-presigner";
import { parseUrl } from "@aws-sdk/url-parser";
import { formatUrl } from "@aws-sdk/util-format-url";
import { Hash } from "@aws-sdk/hash-node";
const createPresignedUrlWithoutClient = async ({ region, bucket, key }) => {
const url = parseUrl(`https://${bucket}.s3.${region}.amazonaws.com/${key}`);
const presigner = new S3RequestPresigner({
credentials: fromIni(),
region,
sha256: Hash.bind(null, "sha256"),
});
const signedUrlObject = await presigner.presign(new HttpRequest(url));
return formatUrl(signedUrlObject);
};
const createPresignedUrlWithClient = ({ region, bucket, key }) => {
const client = new S3Client({ region });
const command = new GetObjectCommand({ Bucket: bucket, Key: key });
return getSignedUrl(client, command, { expiresIn: 3600 });
};
export const main = async () => {
const REGION = "us-east-1";
const BUCKET = "example_bucket";
const KEY = "example_file.jpg";
try {
const noClientUrl = await createPresignedUrlWithoutClient({
region: REGION,
bucket: BUCKET,
key: KEY,
});
const clientUrl = await createPresignedUrlWithClient({
region: REGION,
bucket: BUCKET,
key: KEY,
});
console.log("Presigned URL without client");
console.log(noClientUrl);
console.log("\n");
console.log("Presigned URL with client");
console.log(clientUrl);
} catch (err) {
console.error(err);
}
};
- PHP
-
Weitere Informationen zur Verwendung von AWS SDK for PHP Version 3 zum Generieren einer vorsignierten URL finden Sie unter Amazon S3 pre-signed URL with AWS SDK for PHP Version 3 (Amazon S3 vorsignierte URL mit PHP Version 3) im Entwicklerhandbuch für AWS SDK for PHP.
- Python
-
Generieren Sie eine vorsignierte URL zur Freigabe eines Objekts mithilfe des SDK for Python (Boto3). Verwenden Sie beispielsweise einen Boto3-Client und die generate_presigned_url
-Funktion, um eine vorsignierte URL zu generieren, die ein Objekt erhält.
import boto3
url = boto3.client('s3').generate_presigned_url(
ClientMethod='get_object',
Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600)
Weitere Informationen zur Verwendung von SDK for Python (Boto3) zum Generieren einer vorsignierten URL finden Sie unter Python in der API–Referenz für AWS SDK for Python (Boto).
Wenn Sie eine vorsignierte URL zur Freigabe eines Objekts mit der AWS CLI generieren möchten, finden Sie weitere Informationen unter presign in der AWS CLI-Befehlsreferenz.
Mit der AWS CLI beträgt die maximale Ablaufzeit für eine vorsignierte URL 7 Tage ab dem Zeitpunkt der Erstellung.