

# 使用预签名 URL 共享对象
<a name="ShareObjectPreSignedURL"></a>

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

有关预签名 URL 的一般信息，请参阅[使用预签名 URL 下载和上传对象](using-presigned-url.md)。

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

## 使用 S3 控制台
<a name="generating-presigned-url"></a>

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

**使用 Amazon S3 控制台生成预签名 URL**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

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

1. 在 **Objects**（对象）列表中，选择要为其生成预签名 URL 的对象。

1. 在**对象操作**菜单上，请选择**使用预签名 URL 共享**。

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

1. 请选择 **Create presigned URL**（创建预签名 URL）。

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

## 使用 Amazon CLI
<a name="ShareObjectPresignedCLI"></a>

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

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

`--expires-in` 参数指定到期时间（以秒为单位）。



**注意**  
对于 2019 年 3 月 20 日之后启动的所有 Amazon Web Services 区域，您需要随请求指定 `endpoint-url` 和 `Amazon Web Services 区域`。有关所有 Amazon S3 区域和端点的列表，请参阅《Amazon 一般参考》**中的[区域和端点](https://docs.amazonaws.cn/general/latest/gr/rande.html#s3_region)。

```
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}}
```



有关更多信息，请参阅《Amazon CLI Command Reference》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/presign.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/presign.html)。

## 使用 Amazon SDK
<a name="ShareObjectPreSignedURLSDK"></a>

可以使用 Amazon 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()
   ```

1. 要生成 `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}}?AmazonAccessKeyId={{AKIAIOSFODNN7EXAMPLE}}&Signature={{vjbyNxybdZaMmLa%2ByT372YEAiv4%3D}}&Expires={{1741978496}}
   ```

1. 您可以使用通过 curl 生成的预签名 URL 来下载文件：

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

有关使用 Amazon SDK 生成预签名 URL 来共享对象的更多示例，请参阅 [Create a presigned URL for Amazon S3 by using an Amazon SDK](https://docs.amazonaws.cn/AmazonS3/latest/API/s3_example_s3_Scenario_PresignedUrl_section.html)。

**注意**  
对于 2019 年 3 月 20 日之后启动的所有 Amazon Web Services 区域，您需要随请求指定 `endpoint-url` 和 `Amazon Web Services 区域`。有关所有 Amazon S3 区域和端点的列表，请参阅《Amazon 一般参考》**中的[区域和端点](https://docs.amazonaws.cn/general/latest/gr/rande.html#s3_region)。

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

------

## 使用 Amazon Toolkit for Visual Studio (Windows)
<a name="ShareObjectPreSignedURLVSExplorer"></a>

**注意**  
目前，Amazon Toolkit for Visual Studio 不支持 Visual Studio for Mac。

1. 按照《Amazon Toolkit for Visual Studio User Guide》**中的 [Installing and setting up the Toolkit for Visual Studio](https://docs.amazonaws.cn/toolkit-for-visual-studio/latest/user-guide/setup.html) 中的说明安装 Amazon Toolkit for Visual Studio。

1. 使用以下步骤（《Amazon Toolkit for Visual Studio 用户指南》**中的[连接到 Amazon](https://docs.amazonaws.cn/AWSToolkitVS/latest/UserGuide/connect.html)）连接到 Amazon。

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

1. 右键单击要为其生成预签名 URL 的对象，然后选择**创建预签名 URL...**。

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

1. 应根据您选择的对象预填充**对象密钥**。

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

1. 选择 **Generate（生成）**按钮。

1. 要将此 URL 复制到剪贴板，请选择 **Copy（复制）**。

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

## 使用 Amazon Toolkit for Visual Studio Code
<a name="ShareObjectPreSignedURLVSCode"></a>

如果您使用的是 Visual Studio 代码，可以使用 Amazon Toolkit for Visual Studio Code 生成预签名 URL 来共享对象的，而不需要编写任何代码。有关一般信息，请参阅《Amazon Toolkit for Visual Studio Code 用户指南》**中的 [Amazon Toolkit for Visual Studio Code](https://docs.amazonaws.cn/toolkit-for-vscode/latest/userguide/welcome.html)。

有关如何安装 Amazon Toolkit for Visual Studio Code 的说明，请参阅《Amazon Toolkit for Visual Studio Code 用户指南》**中的[安装 Amazon Toolkit for Visual Studio Code](https://docs.amazonaws.cn/toolkit-for-vscode/latest/userguide/setup-toolkit.html)。

1. 使用以下步骤（《Amazon Toolkit for Visual Studio Code 用户指南》**中的[连接到 Amazon Toolkit for Visual Studio Code](https://docs.amazonaws.cn/toolkit-for-vscode/latest/userguide/connect.html)）连接到 Amazon。

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

1. 在**资源管理器**下，选择 **S3**。

1. 选择存储桶和文件，然后打开上下文菜单（右键单击）。

1. 选择**生成预签名 URL**，然后设置过期时间（以分钟为单位）。

1. 按 Enter，预签名 URL 将复制到剪贴板。