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、Ruby、PHP、Node.js、Python 和 Go 的 Amazon 软件开发工具包以编程方式生成预签名 URL。
您可以使用 Amazon Web Services Management Console 按照以下步骤为对象生成预签名 URL。
在 Amazon S3 控制台中,预签名 URL 的最长过期时间为自创建时起 12 小时。
要使用 Amazon Web Services Management Console 生成预签名 URL
登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/。
-
在 Buckets(存储桶)列表中,请选择包含要为其生成预签名 URL 的对象的存储桶的名称。
-
在 Objects(对象)列表中,选择要为其生成预签名 URL 的对象。
-
在 Actions(操作)菜单上,请选择 Share with a presigned URL(与预签名 URL 共享)。
-
指定您希望的预签名 URL 有效时间长度。
-
请选择 Create presigned URL(创建预签名 URL)。
-
出现确认时,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 天。