使用预签名 URL 共享对象 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用预签名 URL 共享对象

默认情况下,所有的 S3 对象都是私有的。只有对象所有者才具有访问它们的权限。但是,对象所有者可以选择使用自己的安全凭证来创建预签名的 URL,以授予有限时间内的下载对象权限,从而与其他用户共享对象。

当您为对象创建预签名的 URL 时,必须提供安全凭证、指定存储桶名称、对象键、HTTP 方法(指定为 GET 以下载对象)和过期日期和时间。预签名 URL 仅在指定的持续时间内有效。如果您已使用临时令牌创建预签名 URL,则此 URL 将在令牌过期时过期,即使创建的 URL 的过期时间更晚也是如此。

然后,收到预签名 URL 的任何人都可以访问对象。例如,如果您在存储桶中具有一段视频,并且存储桶和对象均为私有,您可以通过生成预签名的 URL 来与其他用户共享视频。由于预签名 URL 将访问 Amazon S3 存储桶的权限授予任何具有 URL 的人,我们建议您适当地保护它们。有关保护预签名 URL 的更多详细信息,请参阅 限制预签名 URL 功能

有关谁可以创建预签名 URL 的更多信息,请参阅 谁可以创建预签名 URL

生成预签名 URL 以共享对象

您可以使用 S3 控制台或适用于 Visual Studio 的 Amazon Explorer 为对象生成预签名 URL,而不编写任何代码。您可以使用适用于 Java、.NET、RubyPHPNode.jsPythonGo 的 Amazon 软件开发工具包以编程方式生成预签名 URL。

您可以使用 Amazon Web Services Management Console 按照以下步骤为对象生成预签名 URL。

注意

在 Amazon S3 控制台中,预签名 URL 的最长过期时间为自创建时起 12 小时。

要使用 Amazon Web Services Management Console 生成预签名 URL
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. Buckets(存储桶)列表中,请选择包含要为其生成预签名 URL 的对象的存储桶的名称。

  3. Objects(对象)列表中,选择要为其生成预签名 URL 的对象。

  4. Actions(操作)菜单上,请选择 Share with a presigned URL(与预签名 URL 共享)。

  5. 指定您希望的预签名 URL 有效时间长度。

  6. 请选择 Create presigned URL(创建预签名 URL)。

  7. 出现确认时,URL 将自动复制到剪贴板。如果您需要再次复制预签名 URL,您将看到一个按钮,用于复制该 URL。

如果您使用的是 Visual Studio,可以使用适用于 Visual Studio 的 Amazon Explorer 为对象生成预签名 URL,而不需要编写任何代码。具有该 URL 的任何人均可下载对象。有关详细信息,请参阅从 Amazon Explorer 使用 Amazon S3

注意

使用适用于 Visual Studio 的 Amazon Explorer,预签名 URL 的最长过期时间为自创建时起 7 天。

有关如何安装 Amazon Explorer 的说明,请参阅 使用 Amazon 开发工具包和浏览器进行 Amazon S3 开发

以下示例将生成预签名 URL,您可以将其提供给其他用户,以便他们可以检索对象。

注意

使用 Amazon 软件开发工具包,预签名 URL 的最长过期时间为自创建时起 7 天。

Java

以下示例将生成预签名 URL,您可以将其提供给其他用户,以便他们可以从 S3 存储桶中检索对象。有关更多信息,请参阅使用预签名 URL 共享对象

有关创建和测试有效示例的说明,请参阅 测试 Amazon S3 Java 代码示例

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

有关创建和测试有效示例的说明,请参阅运行 Amazon S3 .NET 代码示例

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; } } }
PHP

有关使用 Amazon SDK for PHP 版本 3 生成预签名 URL 的信息,请参阅 Amazon SDK for PHP 开发人员指南中的使用 Amazon SDK for PHP 版本 3 的 Amazon S3 预签名 URL

Python

使用 SDK for Python (Boto3) 生成预签名 URL 以共享对象。例如,使用 Boto3 客户端和 generate_presigned_url 函数生成获取对象的预签名 URL。

import boto3 url = boto3.client('s3').generate_presigned_url( ClientMethod='get_object', Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'}, ExpiresIn=3600)

有关使用 SDK for Python (Boto3) 生成预签名 URL 的更多信息,请参阅 Amazon SDK for Python (Boto) API 参考中的 Python

要使用 Amazon CLI 生成预签名 URL 以共享对象,请参阅《Amazon CLI 命令参考》中的 presign

注意

使用 Amazon CLI,预签名 URL 的最长过期时间为自创建时起 7 天。