

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以下示例 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
```

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



**注意**  
对于 2019 年 3 月 20 日之后启动的所有 AWS 区域，您需要随请求指定 `endpoint-url` 和 `AWS 区域`。有关所有 Amazon S3 区域和端点的列表，请参阅《AWS 一般参考》**中的[区域和端点](https://docs.aws.amazon.com/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
```



有关更多信息，请参阅《AWS 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)。

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

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

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?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=vjbyNxybdZaMmLa%2ByT372YEAiv4%3D&Expires=1741978496
   ```

1. 您可以使用通过 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](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_Scenario_PresignedUrl_section.html)。

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

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

------

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

**注意**  
目前，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](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/setup.html) 中的说明安装 AWS Toolkit for Visual Studio。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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