

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon S3 存储桶
<a name="S3-buckets"></a>

研究与工程工作室 (RES) 支持[将 Amazon S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)挂载到 Linux 虚拟桌面基础设施 (VDI) 实例。**RES 管理员可以将 S3 存储桶载入 RES，将其附加到项目，编辑其配置，并在 “环境管理” 下的 “S3 存储桶” 选项卡中删除存储桶。**

S3 存储桶控制面板提供了可供您使用的已载入 S3 存储桶的列表。在 S3 存储桶控制面板中，您可以：

1. 使用**添加存储桶将** S3 存储桶加载到 RES。

1. 选择 S3 存储桶，然后使用**操作菜单执行以下操作**：
   + 编辑存储桶
   + 移除存储桶

1. 使用搜索字段按存储桶名称进行搜索并查找已加载的 S3 存储桶。  
![\[S3 存储桶列表允许您按存储桶名称进行搜索并查找已加载的存储桶\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/docs-list-bucket.png)

以下各节介绍如何在您的 RES 项目中管理 Amazon S3 存储桶。

**Topics**
+ [隔离 VPC 部署的 Amazon S3 存储桶先决条件](S3-buckets-prereqs.md)
+ [添加 Amazon S3 存储桶](S3-buckets-add.md)
+ [编辑 Amazon S3 存储桶](S3-buckets-edit.md)
+ [移除亚马逊 S3 存储桶](S3-buckets-remove.md)
+ [数据隔离](S3-buckets-data-isolation.md)
+ [跨账户存储桶访问权限](S3-buckets-cross-account-access.md)
+ [防止私有 VPC 中的数据泄露](S3-buckets-preventing-exfiltration.md)
+ [问题排查](S3-buckets-troubleshooting.md)
+ [正在启用 CloudTrail](S3-buckets-enabling-cloudtrail.md)

# 隔离 VPC 部署的 Amazon S3 存储桶先决条件
<a name="S3-buckets-prereqs"></a>

如果您要在隔离的 VPC 中部署 Research and Engineering Studio，请在 AWS 账户中部署 RES 后，按照以下步骤更新 lambda 配置参数。

1. 登录部署研究与工程工作室的 AWS 账户的 Lambda 控制台。

1. 查找并导航到名为的 Lambda 函数。`<RES-EnvironmentName>-vdc-custom-credential-broker-lambda`

1. 选择函数的 “**配置**” 选项卡。  
![\[隔离的 VPC 环境变量\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/Isolated-VPC-Env-Variable.png)

1. 在导航窗格中，选择**环境变量**以查看该部分。

1. 选择 **Edit** 并将以下新环境变量添加到函数中：
   + 键：`AWS_STS_REGIONAL_ENDPOINTS`
   + 值：`regional`

1. 选择**保存**。

# 添加 Amazon S3 存储桶
<a name="S3-buckets-add"></a>

**要将 S3 存储桶添加到您的 RES 环境，请执行以下操作：**

1. 选择 **Add bucket (添加存储桶)**。

1. 输入存储桶的详细信息，例如存储桶名称、ARN 和挂载点。
**重要**  
创建后无法更改所提供的存储桶 ARN、挂载点和模式。
存储桶 ARN 可以包含一个前缀，该前缀会将已加载的 S3 存储桶与该前缀隔离开来。

1. 选择一种加载存储桶的模式。
**重要**  
有关[数据隔离](S3-buckets-data-isolation.md)使用特定模式进行数据隔离的更多信息，请参阅。

1. 在 “**高级选项”** 下，您可以提供 IAM 角色 ARN 来挂载存储桶以进行跨账户访问。按照中的[跨账户存储桶访问权限](S3-buckets-cross-account-access.md)步骤创建跨账户访问所需的 IAM 角色。

1. （可选）将存储桶与项目关联，以后可以对其进行更改。但是，无法将 S3 存储桶装载到项目的现有 VDI 会话中。只有在项目与存储桶关联后启动的会话才会挂载存储桶。

1. 选择**提交**。  
![\[添加存储分区页面，显示可用的存储分区设置字段和提交按钮\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/docs-add-bucket.png)

# 编辑 Amazon S3 存储桶
<a name="S3-buckets-edit"></a>

1. 在 S3 存储桶列表中选择一个 S3 存储桶。

1. 从 “**操作**” 菜单中选择 “**编辑”**。

1. 输入您的更新。
**重要**  
将项目与 S3 存储桶关联**不会**将存储桶挂载到该项目的现有虚拟桌面基础架构 (VDI) 实例。只有在项目中启动的 VDI 会话与该存储桶关联后，该存储桶才会装载到该项目中启动的 VDI 会话。
取消项目与 S3 存储桶的关联不会影响 S3 存储桶中的数据，但会导致桌面用户无法访问该数据。

1. 选择 “**保存存储桶设置”**。  
![\[“编辑 S3 存储桶” 页面已输入显示名称和项目关联字段，并突出显示了 “保存存储桶设置” 按钮\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/docs-edit-bucket.png)

# 移除亚马逊 S3 存储桶
<a name="S3-buckets-remove"></a>

1. 在 S3 存储桶列表中选择一个 S3 存储桶。

1. 从 “**操作**” 菜单中选择 “**删除**”。
**重要**  
您必须先从存储桶中移除所有项目关联。
删除操作不会影响 S3 存储桶中的数据。它只会删除 S3 存储桶与 RES 的关联。
移除存储桶将导致现有的 VDI 会话在该会话的凭证到期（大约 1 小时）时无法访问该存储桶中的内容。

# 数据隔离
<a name="S3-buckets-data-isolation"></a>

将 S3 存储桶添加到 RES 时，您可以选择将存储桶内的数据隔离给特定的项目和用户。在**添加存储桶**页面上，您可以选择只读 (R) 或读写 (R/W) 模式。

**只读**

如果选中，`Read Only (R)`则根据存储桶 ARN 的前缀（Amazon 资源名称）强制执行数据隔离。例如，如果管理员使用 ARN 向 RES 添加存储分区，`arn:aws:s3:::bucket-name/example-data/`并将此存储分区与项目 A 和项目 B 关联起来，则 VDIs 从项目 A 和项目 B 中启动的用户只能读取位于路径`bucket-name`下的数据。`/example-data`他们将无法访问该路径之外的数据。如果存储桶 ARN 中没有附加前缀，则整个存储桶将可供与其关联的任何项目使用。

**读和写**

如果`Read and Write (R/W)`选中，则仍会根据存储桶 ARN 的前缀强制执行数据隔离，如上所述。此模式还有其他选项，允许管理员为 S3 存储桶提供基于变量的前缀。选中后`Read and Write (R/W)`，“自定义前缀” 部分将变为可用，该部分提供包含以下选项的下拉菜单：
+ 没有自定义前缀
+ /%p
+ /%p/%u

![\[添加带有自定义前缀下拉列表的存储桶页面\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/add-bucket-custom-prefix.png)


**没有自定义数据隔离 **  
如果`No custom prefix`选择 “**自定义前缀**”，则在不进行任何自定义数据隔离的情况下添加存储桶。这允许与存储桶关联的任何项目具有读取和写入权限。例如，如果管理员使用`No custom prefix`选定的 ARN `arn:aws:s3:::bucket-name` 将存储分区添加到 RES，并将此存储分区与项目 A 和项目 B 相关联，则 VDIs 从项目 A 和项目 B 中启动的用户将拥有对该存储分区的无限制读写权限。

**在每个项目层面上进行数据隔离 **  
如果`/%p`选择 “**自定义前缀**”，则存储桶中的数据将与其关联的每个特定项目隔离。`%p`变量表示项目代码。例如，如果管理员使用`/%p`选定的 ARN `arn:aws:s3:::bucket-name`、**挂载点**为的存储桶添加存储桶*/bucket*，并将该存储桶与项目 A 和项目 B 关联起来，则项目 A 中的用户 A 可以向写入文件。*/bucket*项目 A 中的用户 B 也可以看到用户 A 写入的文件*/bucket*。但是，如果用户 B 在项目 B 中启动 VDI 并进行查看*/bucket*，他们将看不到用户 A 写入的文件，因为数据是按项目隔离的。用户 A 写入的文件位于前缀下的 S3 存储桶中，`/ProjectA`而用户 B 只能在使用项目 B VDIs 中的文件`/ProjectB`时才能访问

**在每个项目、每个用户级别上进行数据隔离 **  
如果`/%p/%u`选择 “**自定义前缀**”，则存储桶中的数据将与该项目关联的每个特定项目和用户隔离。`%p`变量代表项目代码，`%u`代表用户名。例如，管理员使用 ARN `arn:aws:s3:::bucket-name` 将存储桶添加到 RES 中，`/%p/%u`选中且挂载点为。*/bucket*此存储桶与项目 A 和项目 B 相关联。项目 A 中的用户 A 可以向其写入文件*/bucket*。与之前仅使用`%p`隔离的场景不同，在这种情况下，用户 B 将看不到用户 A 在项目 A 中写入的文件*/bucket*，因为数据由项目和用户隔离。用户 A 写入的文件位于前缀下的 S3 存储桶中，`/ProjectA/UserA`而用户 B 只能 VDIs 在项目 A 中使用他们的文件`/ProjectA/UserB`时才能访问。

# 跨账户存储桶访问权限
<a name="S3-buckets-cross-account-access"></a>

RES 可以从其他 AWS 账户挂载存储桶，前提是这些存储桶具有适当的权限。在以下场景中，账户 A 中的 RES 环境想要在账户 B 中挂载 S3 存储桶。

**步骤 1：在部署 RES 的账户中创建 IAM 角色*（这将称为账户 A）*：**

1. 登录需要访问 S3 存储桶的 RES 账户（账户 A）的 AWS 管理控制台。

1. 打开 IAM 控制台：

   1. 导航到 IAM 控制面板。

   1. 在导航窗格中，选择**策略**。

1. 创建策略：

   1. 选择**创建策略**。

   1. 选择 **JSON** 选项卡。

   1. 粘贴以下 JSON 策略（`amzn-s3-demo-bucket`替换为账户 B 中的 S3 存储桶的名称）：

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "s3:GetObject",
                      "s3:PutObject",
                      "s3:ListBucket",
                      "s3:DeleteObject",
                      "s3:AbortMultipartUpload"
                  ],
                  "Resource": [
                      "arn:aws:s3:::amzn-s3-demo-bucket",
                      "arn:aws:s3:::amzn-s3-demo-bucket/*"
                  ]
              }
          ]
      }
      ```

------

   1. 选择**下一步**。

1. 查看并创建策略：

   1. 提供策略的名称（例如，AccessPolicy“S3”）。

   1. 添加可选描述以解释政策的目的。

   1. 查看策略并选择**创建策略**。

1. 打开 IAM 控制台：

   1. 导航到 IAM 控制面板。

   1. 在导航窗格中，选择**角色**。

1. 创建角色：

   1. 选择**创建角色**。

   1. 选择**自定义信任策略**作为可信实体的类型。

   1. 粘贴以下 JSON 策略（`111122223333`替换为账户 A 的实际账户 ID 和 `{RES_ENVIRONMENT_NAME}` RES 部署的环境名称）：

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:role/<ENVIRONMENT_NAME>-vdc-custom-credential-broker-lambda-role"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }
      ```

------

   1. 选择**下一步**。

1. 附加权限策略：

   1. 搜索并选择您之前创建的策略。

   1. 选择**下一步**。

1. 标记、查看和创建角色：

   1. 输入角色名称（例如，AccessRole“S3”）。

   1. 在 “步骤 3” 下，选择 “**添加标签**”，然后输入以下键和值：
      + 键：`res:Resource`
      + 值：`s3-bucket-iam-role`

   1. 查看角色并选择**创建角色**。

1. 在 RES 中使用 IAM 角色：

   1. 复制您创建的 IAM 角色 ARN。

   1. 登录 RES 控制台。

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

   1. 选择**添加存储桶**，然后使用跨账户 S3 存储桶 ARN 填写表单。

   1. 选择 “**高级设置-可选**” 下拉列表。

   1. 在 IAM 角色 ARN 字段中输入角色 ARN。

   1. 选择 “**添加存储桶**”。

**步骤 2：修改账户 B 中的存储桶策略**

1. 登录账户 B 的 AWS 管理控制台

1. 打开 S3 控制台：

   1. 导航到 S3 控制面板。

   1. 选择您要授予访问权限的存储桶。

1. 编辑存储桶策略：

   1. 选择 “**权限**” 选项卡，然后选择 “**存储桶策略**”。

   1. 添加以下策略以授予账户 A 中的 IAM 角色访问存储桶的权限（*111122223333*替换为账户 A 的实际账户 ID 和 *amzn-s3-demo-bucket* S3 存储桶的名称）：

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:role/S3AccessRole"
                  },
                  "Action": [
                      "s3:GetObject",
                      "s3:PutObject",
                      "s3:ListBucket",
                      "s3:DeleteObject",
                      "s3:AbortMultipartUpload"
                  ],
                  "Resource": [
                      "arn:aws:s3:::amzn-s3-demo-bucket",
                      "arn:aws:s3:::amzn-s3-demo-bucket/*"
                  ]
              }
          ]
      }
      ```

------

   1. 选择**保存**。

# 防止私有 VPC 中的数据泄露
<a name="S3-buckets-preventing-exfiltration"></a>

为防止用户将数据从安全 S3 存储桶泄露到自己账户中的 S3 存储桶中，您可以附加 VPC 终端节点来保护您的私有 VPC。以下步骤说明如何为 S3 服务创建 VPC 终端节点，该终端节点支持访问您的账户中的 S3 存储桶以及任何其他拥有跨账户存储桶的账户。

1. 打开亚马逊 VPC 控制台：

   1. 登录到 AWS 管理控制台。

   1. 打开亚马逊 VPC 控制台，网址为[ https://console.aws.amazon.com/vpcconsole/](https://console.aws.amazon.com/vpcconsole)。

1. 为 S3 创建 VPC 终端节点：

   1. 在左侧导航窗格中，选择**终端节点**。

   1. 选择**创建端点**。

   1. 对于**服务类别**，请确保选中 **AWS 服务**。

   1. 在 “**服务名称**” 字段中，输入`com.amazonaws.<region>.s3`（`<region>`用您 AWS 所在的地区替换）或搜索 “S3”。

   1. 从列表中选择 S3 服务。

1. 配置端点设置：

   1. 对于 **VPC**，选择要在其中创建端点的 VPC。

   1. 对于**子网**，请选择部署期间用于 VDI 子网的两个私有子网。

   1. 对于**启用 DNS 名称**，请确保选中该选项。这允许将私有 DNS 主机名解析到端点网络接口。

1. 将策略配置为限制访问：

   1. 在 “**策略**” 下，选择 “**自定义**”。

   1. 在策略编辑器中，输入限制访问您的账户或特定账户内资源的策略。以下是策略示例（*amzn-s3-demo-bucket*替换为您的 S3 存储桶*444455556666*名称*111122223333*和您想要访问 IDs 的相应 AWS 账户）：
**注意**  
此示例策略使用`s3:*`但不限制 S3 控制平面操作，例如事件通知配置、复制或清单。这些操作可能允许将对象元数据（例如存储桶名称和对象密钥）发送到跨账户目的地。如果存在问题，请在 VPC 终端节点策略中为相关 S3 控制平面操作添加明确的拒绝语句。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": "*",
                  "Action": "s3:*",
                  "Resource": [
                      "arn:aws:s3:::amzn-s3-demo-bucket",
                      "arn:aws:s3:::amzn-s3-demo-bucket/*"
                  ],
                  "Condition": {
                      "StringEquals": {
                          "aws:PrincipalAccount": [
                              "111122223333",
                              "444455556666"
                          ]
                      }
                  }
              }
          ]
      }
      ```

------

1. 创建终端节点：

   1. 检视您的设置。

   1. 选择**创建端点**。

1. 验证终端节点：

   1. 创建终端节点后，在 VPC 控制台中导航至 “**终端节点**” 部分。

   1. 选择新创建的端点。

   1. 验证**状态**是否为**可用**。

按照这些步骤操作，您可以创建一个允许 S3 访问的 VPC 终端节点，但仅限于您的账户或指定账户 ID 中的资源。

# 问题排查
<a name="S3-buckets-troubleshooting"></a>

**如何检查存储桶是否无法在 VDI 上挂载** 

如果存储桶无法在 VDI 上装载，则可以在几个位置检查是否存在错误。请按照以下步骤操作。

1. 查看 VDI 日志：

   1. 登录到 AWS 管理控制台。

   1. 打开 EC2 控制台并导航到**实例**。

   1. 选择您启动的 VDI 实例。

   1. 通过会话管理器连接到 VDI。

   1. 运行以下 命令：

      ```
      sudo su
      cd ~/bootstrap/logs
      ```

      在这里，你可以找到引导日志。任何失败的详细信息都将在`configure.log.{time}`文件中找到。

      此外，请查看`/etc/message`日志以获取更多详细信息。

1. 查看自定义凭证代理 CloudWatch Lambda 日志：

   1. 登录到 AWS 管理控制台。

   1. 打开 CloudWatch 控制台并导航到**日志组**。

   1. 搜索日志组`/aws/lambda/<stack-name>-vdc-custom-credential-broker-lambda`。

   1. 检查第一个可用的日志组并在日志中找到所有错误。这些日志将包含有关为安装 S3 存储桶提供临时自定义凭证的潜在问题的详细信息。

1. 查看自定义凭证代理 API Gateway CloudWatch 日志：

   1. 登录到 AWS 管理控制台。

   1. 打开 CloudWatch 控制台并导航到**日志组**。

   1. 搜索日志组`<stack-name>-vdc-custom-credential-broker-lambdavdccustomcredentialbrokerapigatewayaccesslogs<nonce>`。

   1. 检查第一个可用的日志组并在日志中找到所有错误。这些日志将包含有关向 API Gateway 发出的挂载 S3 存储桶所需的自定义凭据的任何请求和响应的详细信息。

**如何在入职后编辑存储桶的 IAM 角色配置** 

1. 登录 [AWS DynamoDB 控制台](https://console.aws.amazon.com/dynamodbv2/home)。

1. 选择表格：

   1. 在左侧导航窗格中，选择 **表**。

   1. 查找并选择`<stack-name>.cluster-settings`。

1. 扫描桌子：

   1. 选择**浏览表项目**。

   1. 确保已选择 “**扫描**”。

1. 添加过滤器：

   1. 选择 “**过滤器**” 以打开 “筛选器条目” 部分。

   1. 将过滤器设置为与您的密钥相匹配-
      + **属性**：输入密钥。
      + **条件**：选择 “**开头为**”。
      + **值**：输入`shared-storage.<filesystem_id>.s3_bucket.iam_role_arn`*<filesystem\$1id>*替换为需要修改的文件系统的值。

1. 执行扫描：

   选择 “**运行**” 以使用过滤器运行扫描。

1. 检查值：

   如果该条目存在，请确保使用正确的 IAM 角色 ARN 正确设置该值。

   如果该条目不存在：

   1. 选择**创建项目**。

   1. 输入商品详情：
      + 对于关键属性，请输入`shared-storage.<filesystem_id>.s3_bucket.iam_role_arn`。
      + 添加正确的 IAM 角色 ARN。

   1. 选择 “**保存**” 以添加该项目。

1. 重新启动 VDI 实例：

   重启实例， VDIs 确保再次挂载受错误 IAM 角色 ARN 影响的实例。

# 正在启用 CloudTrail
<a name="S3-buckets-enabling-cloudtrail"></a>

要使用 CloudTrail 控制台 CloudTrail 在您的账户中启用，请按照*AWS CloudTrail 用户指南*中使用[ CloudTrail 控制台创建跟踪中提供的说明进行](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-a-trail-using-the-console-first-time.html)操作。 CloudTrail 将通过记录访问 S3 存储桶的 IAM 角色来记录对 S3 存储桶的访问权限。这可以链接回实例 ID，该实例ID链接到项目或用户。