使用预签名 URL 共享对象 - Amazon Simple Storage Service

使用预签名 URL 共享对象

默认情况下,所有 Amazon S3 对象都是私有的,只有对象拥有者才具有访问它们的权限。但是,对象拥有者可以通过创建预签名 URL 与其他人共享对象。预签名 URL 使用安全凭证来授予下载对象的限时权限。可以在浏览器中输入此 URL,或者程序使用此 URL 来下载对象。预签名 URL 使用的凭证是生成该 URL 的 AWS 用户的凭证。

有关预签名 URL 的一般信息,请参阅使用预签名 URL 下载和上传对象

您可以使用 Amazon S3 控制台、适用于 Visual Studio 的 AWS Explorer 或 AWS Toolkit for Visual Studio Code 创建预签名 URL 来共享对象,而不需要编写任何代码。也可以使用 AWS Command Line Interface(AWS CLI)或 AWS SDK 以编程方式生成预签名 URL。

您可以使用 Amazon S3 控制台,按照以下步骤生成预签名 URL 来共享对象。使用控制台时,预签名 URL 的最长过期时间为自创建时起 12 小时。

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

  2. 在左侧导航窗格中,选择通用存储桶

  3. 通用存储桶列表中,选择通用存储桶的名称,该存储桶包含要为其生成预签名 URL 的对象。

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

  5. 对象操作菜单上,请选择使用预签名 URL 共享

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

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

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

以下示例 AWS CLI 命令生成一个预签名 URL,以共享 Amazon S3 存储桶中的对象。使用 AWS CLI 时,预签名 URL 的最长过期时间为自创建时起 7 天。要使用此示例,请将 user input placeholders 替换为您自己的信息。

aws s3 presign s3://amzn-s3-demo-bucket/mydoc.txt --expires-in 604800

注意

对于 2019 年 3 月 20 日之后启动的所有 AWS 区域,您需要随请求指定 endpoint-urlAWS 区域。有关所有 Amazon S3 区域和端点的列表,请参阅《AWS 一般参考》中的区域和端点

aws s3 presign s3://amzn-s3-demo-bucket/mydoc.txt --expires-in 604800 --region af-south-1 --endpoint-url https://s3.af-south-1.amazonaws.com

有关更多信息,请参阅 AWS CLI 命令参考 中的 presign

可以使用 AWS SDK 以编程方式生成预签名 URL。

Python

以下 Python 脚本生成用于共享对象的 GET 预签名 URL。

  1. 复制脚本的内容并将其保存为“get-only-url.py”文件。要使用以下示例,请将用户输入占位符替换为您自己的信息(例如,您的文件名)。

    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.", ) args = parser.parse_args() # By default, this will use credentials from ~/.aws/credentials s3_client = boto3.client("s3") # The presigned URL is specified to expire in 1000 seconds url = generate_presigned_url( s3_client, "get_object", {"Bucket": args.bucket, "Key": args.key}, 1000 ) print(f"Generated GET presigned URL: {url}") if __name__ == "__main__": main()
  2. 要生成 GET 预签名 URL 来共享文件,请使用存储桶名称和所需的对象路径运行以下脚本。

    以下命令使用的是示例值。将用户输入占位符替换为您自己的信息。

    python get-only-url.py amzn-s3-demo-bucket <object-path>

    该脚本将输出一个 GET 预签名 URL:

    Generated GET presigned URL: https://amzn-s3-demo-bucket.s3.amazonaws.com/object.txt?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=vjbyNxybdZaMmLa%2ByT372YEAiv4%3D&Expires=1741978496
  3. 您可以使用通过 curl 生成的预签名 URL 来下载文件:

    curl -X GET "generated-presigned-url" -o "path/to/save/file"

有关使用 AWS SDK 生成预签名 URL 来共享对象的更多示例,请参阅 Create a presigned URL for Amazon S3 by using an AWS SDK

注意

对于 2019 年 3 月 20 日之后启动的所有 AWS 区域,您需要随请求指定 endpoint-urlAWS 区域。有关所有 Amazon S3 区域和端点的列表,请参阅《AWS 一般参考》中的区域和端点

注意

使用 AWS SDK 时,Tagging 属性必须是标题而不是查询参数。所有其他属性都可以作为预签名 URL 的参数传递。

注意

目前,AWS Toolkit for Visual Studio 不支持 Visual Studio for Mac。

  1. 按照《AWS Toolkit for Visual Studio User Guide》中的 Installing and setting up the Toolkit for Visual Studio 中的说明安装 AWS Toolkit for Visual Studio。

  2. 使用以下步骤(《AWS Toolkit for Visual Studio 用户指南》中的连接到 AWS)连接到 AWS。

  3. 在标有 AWS 各区服务浏览器的左侧面板中,双击包含您的对象的存储桶。

  4. 右键单击要为其生成预签名 URL 的对象,然后选择创建预签名 URL...

  5. 在弹出窗口中,设置预签名 URL 的到期日期和时间。

  6. 应根据您选择的对象预填充对象密钥

  7. 选择 GET 可指定此预签名 URL 将用于下载对象。

  8. 选择 Generate(生成)按钮。

  9. 要将此 URL 复制到剪贴板,请选择 Copy(复制)

  10. 要使用生成的预签名 URL,请将该 URL 粘贴到任何浏览器中。

如果您使用的是 Visual Studio 代码,可以使用 AWS Toolkit for Visual Studio Code 生成预签名 URL 来共享对象的,而不需要编写任何代码。有关一般信息,请参阅《AWS Toolkit for Visual Studio Code 用户指南》中的 AWS Toolkit for Visual Studio Code

有关如何安装 AWS Toolkit for Visual Studio Code 的说明,请参阅《AWS Toolkit for Visual Studio Code 用户指南》中的安装 AWS Toolkit for Visual Studio Code

  1. 使用以下步骤(《AWS Toolkit for Visual Studio Code 用户指南》中的连接到 AWS Toolkit for Visual Studio Code)连接到 AWS。

  2. 在 Visual Studio 代码中选择左侧面板上的 AWS 徽标。

  3. 资源管理器下,选择 S3

  4. 选择存储桶和文件,然后打开上下文菜单(右键单击)。

  5. 选择生成预签名 URL,然后设置过期时间(以分钟为单位)。

  6. 按 Enter,预签名 URL 将复制到剪贴板。