

# 在 Amazon EC2 上挂载 S3 文件系统
<a name="s3-files-mounting"></a>

要在 EC2 实例上挂载 S3 文件系统，必须使用 S3 Files 挂载助手。挂载助手有助于您在运行受支持发行版的 EC2 实例上挂载 S3 文件系统。在挂载文件系统时，挂载帮助程序定义了新的网络文件系统类型（称为 `s3files`），它与 Linux 中的标准 `mount` 命令完全兼容。挂载助手还支持通过在 EC2 Linux 实例上使用 `/etc/fstab` 配置文件中的条目，在实例引导时自动挂载 S3 文件系统。挂载助手是您在安装 S3 Files 客户端时安装的开源工具集的一部分（amazon-efs-utils）。

![该图显示了 S3 存储桶、S3 文件系统和 Amazon EC2 实例之间的数据流。](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/S3Files_EC2_dataflow.png)


## 在 EC2 实例上挂载的先决条件
<a name="s3-files-mounting-prereqs"></a>
+ 您拥有至少包含一个可用挂载目标的 S3 文件系统。
+ 您的 EC2 实例与将用于挂载文件系统的挂载目标位于相同的可用区中。
+ IAM 实例配置文件附加到 EC2 实例上，该实例具有 S3 Files 所需的权限。有关更多信息，请参阅 [用于将文件系统附加到 AWS 计算资源的 IAM 角色](s3-files-prereq-policies.md#s3-files-prereq-iam-compute-role)。
+ 您已经配置了所需的[安全组](s3-files-prereq-policies.md#s3-files-prereq-security-groups)。
+ 您已在 EC2 实例上安装了 amazon efs-utils 软件包。有关更多信息，请参阅 [S3 Files 客户端](s3-files-prereq-policies.md#s3-files-prereq-client)。

## 挂载助手是如何工作的？
<a name="s3-files-mounting-how-it-works"></a>

当您发出挂载命令时，挂载助手会执行以下操作：
+ 从 EC2 实例配置文件中检索 IAM 凭证。
+ 初始化 efs-proxy 进程以建立与挂载目标的 TLS 加密连接。
+ 启动 amazon-efs-mount-watchdog 主管进程，该进程监控 TLS 挂载的运行状况。首次挂载 S3 文件系统时，此进程自动启动。
+ 在指定的挂载点挂载文件系统。

挂载帮助程序使用 TLS 1.2 版与您的文件系统进行通信。使用 TLS 需要具有证书，并且这些证书需要由受信任的 Amazon 证书颁发机构进行签名。有关加密的工作方式的更多信息，请参阅[S3 Files 的安全性](s3-files-security.md)。

挂载助手使用以下针对 S3 Files 进行优化的挂载选项：


| Option | 值 | 说明 | 
| --- | --- | --- | 
| nfsvers | 4.2 | NFS 协议版本。 | 
| rsize | 1048576 | 将 NFS 客户端可以为每个网络 READ 请求接收的最大数据字节数设置为 1048576（1 MB，最大可用字节数），以避免性能下降。 | 
| wsize | 1048576 | 将 NFS 客户端可以为每个网络 WRITE 请求发送的最大数据字节数设置为 1048576（1 MB，最大可用字节数），以避免性能下降。 | 
| hard | — | 设置 NFS 客户端在 NFS 请求超时之后的恢复行为，以便 NFS 请求在服务器回复之前无限次重试，从而确保数据完整。 | 
| timeo | 600 | 将 NFS 客户端在重试 NFS 请求之前用于等待响应的超时值设置为 600 分秒（60 秒），以避免性能下降。 | 
| retrans | 2 | 将 NFS 客户端重试请求的次数设置为 2，超过此次数之后将尝试进一步的恢复操作。 | 
| noresvport | — | 告知 NFS 客户端在重新建立网络连接时，使用新的非特权 TCP 源端口。使用 noresvport 有助于确保文件系统在重新连接或网络恢复事件后保持不间断的可用性。 | 

此外，挂载助手在挂载 S3 文件系统时会自动使用 `tls` 和 `iam` 挂载选项，因为 S3 Files 需要这些选项才能建立连接。这是因为 S3 Files 始终使用 TLS 加密和 IAM 身份验证来挂载文件系统，并且无法禁用这些功能。

## 如何在 EC2 实例上挂载 S3 文件系统？
<a name="s3-files-mounting-steps"></a>
+ 通过 Secure Shell（SSH）或 EC2 控制台上的 EC2 Instance Connect 连接到您的 EC2 实例。有关更多信息，请参阅[连接到您的 EC2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect.html)。
+ 使用以下命令创建要用作文件系统装载点的目录 `/mnt/s3files`：

  ```
  sudo mkdir /mnt/s3files
  ```
+ 挂载 S3 文件系统：

  ```
  FS="{{{YOUR_FILE_SYSTEM_ID}}}"
  sudo mount -t s3files $FS:/ /mnt/s3files
  ```
+ 确认已挂载文件系统。

  ```
  df -h /mnt/s3files
  ```

  您可以看到类似以下内容的响应：

  ```
  Filesystem      Size  Used Avail Use% Mounted on
  {{{s3files-dns}}}    8.0E  129M  8.0E   1% {{{path/to/mount}}}
  ```

  还可以通过列出本地挂载点的内容来验证文件系统挂载和检查挂载选项。如果挂载成功，此命令将显示特定目录的挂载详细信息，包括您的挂载选项。

  ```
  findmnt -T /mnt/s3files
  ```

有关挂载命令的详细信息，请访问 [GitHub 文档](https://github.com/aws/efs-utils/blob/master/README.md#mountefs)。

现在，您可以使用标准文件系统操作在本地挂载路径上将 S3 对象作为文件进行读写。如果您的 S3 存储桶中有对象，则可以使用以下命令将它们作为文件进行查看。

```
ls /mnt/s3files
```

您可以使用 [CloudWatch 指标](s3-files-monitoring-cloudwatch.md)监控文件系统存储、性能、客户端连接和同步错误。

## 如何使用接入点在 EC2 实例上挂载 S3 文件系统
<a name="s3-files-mounting-access-points-inline"></a>

在使用接入点挂载文件系统时，挂载命令包括 `access-point-id` 挂载选项。

```
sudo mount -t s3files -o accesspoint={{access-point-id}} {{file-system-id}} /mnt/s3files
```

其中：
+ {{access-point-id}} 是接入点的 ID。
+ {{file-system-id}} 是 S3 文件系统的 ID。

## 在 EC2 实例启动时自动挂载 S3 文件系统
<a name="s3-files-mounting-auto"></a>

您可以将 EC2 实例配置为在实例启动时自动挂载 S3 文件系统，或者通过更新 `/etc/fstab` 文件在实例重启时自动挂载 S3 文件系统。`/etc/fstab` 文件包含有关文件系统的信息，操作系统使用该文件来确定在启动时要挂载哪些文件系统。

**警告**  
请在自动挂载文件系统时使用 `_netdev` 选项，它用于指定网络文件系统。如果缺少 `_netdev`，您的 EC2 实例可能会停止响应。出现该结果是因为，需要在计算实例启动其网络后初始化网络文件系统。有关更多信息，请参阅[自动挂载失败，并且实例没有响应](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/builtInFS-fstab-issues.html)。

可以使用挂载助手将 Amazon EC2 实例配置为在实例启动时自动挂载 S3 文件系统：
+ 使用 S3 文件系统的条目更新 EC2 `/etc/fstab` 文件。
+ 在使用 EC2 启动实例向导创建新的 EC2 实例时附加 S3 文件系统。

### 更新 /etc/fstab 文件
<a name="s3-files-mounting-auto-fstab"></a>

执行以下步骤，以更新 EC2 Linux 实例上的 `/etc/fstab`，以便该实例在实例重启时使用挂载助手自动重新挂载 S3 文件系统。
+ [连接到您的 EC2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect.html)。
+ 在编辑器中打开 `/etc/fstab` 文件，并将以下行添加到文件中：

  ```
  {{file-system-id}}:/ {{mount-directory}} s3files _netdev 0 0
  ```

  其中：
  + {{file-system-id}} 是 S3 文件系统的 ID（例如 `fs-0123456789abcdef0`）。
  + {{mount-directory}} 是 EC2 实例上的挂载点目录（例如 `/mnt/s3files`）。
  + `_netdev` 指定文件系统为网络文件系统，确保实例在尝试挂载之前等待网络可用性。
+ 保存文件，然后关闭编辑器。
+ 通过在 fstab 中挂载所有文件系统来测试 fstab 条目：

  ```
  sudo mount -a
  ```
+ 验证文件系统是否已挂载：

  ```
  findmnt -T {{mount-directory}}
  ```

**使用 nofail 选项**

我们建议在生产环境中将 `nofail` 选项添加到 fstab 条目中。此选项支持实例即使在无法挂载文件系统的情况下也能引导：

```
{{file-system-id}}:/ {{mount-directory}} s3files _netdev,nofail 0 0
```

**使用接入点自动挂载**

要使用 S3 Files 接入点自动挂载，请包含以下 `accesspoint` 选项：

```
{{file-system-id}}:/ {{mount-directory}} s3files _netdev,accesspoint={{access-point-id}} 0 0
```

**使用子目录自动挂载**

要自动挂载文件系统的特定子目录，请指定路径：

```
{{file-system-id}}:/path/to/directory {{mount-directory}} s3files _netdev 0 0
```

### 使用 EC2 启动实例向导
<a name="s3-files-mounting-auto-wizard"></a>
+ 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。
+ 选择 **Launch Instance（启动实例）**。
+ 按照此文档，使用 AWS 控制台中的启动实例向导启动 EC2 实例。在选择**启动实例**之前，配置您的网络并添加 S3 文件系统，如以下步骤所示。
+ 请务必在**网络设置**中选择子网。
+ 选择默认安全组，以确保 EC2 实例可以访问 S3 文件系统。您不能使用该安全组通过安全外壳 (SSH) 访问您的 EC2 实例。对于通过 SSH 进行访问，您稍后可以编辑默认安全性并添加一个允许 SSH 的规则/新安全组。您可以使用以下设置：
  + 类型：SSH
  + 协议：TCP
  + 端口范围：22
  + 源：任何位置 0.0.0.0/0
+ 在**存储**部分下，选择**文件系统**，然后选择 **S3 Files**。
+ 在文件系统下拉列表下，您将在可用区中看到您的文件系统，这些文件系统基于您之前在网络设置中选择的子网。选择要挂载的 S3 文件系统。如果没有任何文件系统，请选择“创建新的文件系统”来创建一个新的文件系统。
+ 在 EC2 实例上输入要在其中挂载文件系统的本地挂载路径（例如 `/mnt/s3files`）。
+ 将生成一个命令来挂载文件系统并将其添加到 fstab。您可以选择将命令添加到用户数据，也可以在启动后在您的 EC2 实例上手动运行该命令。然后，您的 EC2 实例将配置为在启动或重启时挂载 S3 文件系统。
+ 选择**启动实例**。

## 从另一个 VPC 挂载 S3 文件系统
<a name="s3-files-mounting-cross-vpc"></a>

使用 VPC 对等连接或中转网关连接 VPC 时，一个 VPC 中的 Amazon EC2 实例可以访问另一个 VPC 中的 S3 文件系统。

中转网关是网络中转中心，您可用它来互连 VPC 和本地网络。有关使用 VPC 中转网关的信息，请参阅《Amazon VPC 中转网关指南》**中的[中转网关入门](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-getting-started.html)。VPC 对等连接是两个 VPC 之间的网络连接。使用此类连接，您能够使用专用 Internet 协议版本 4（IPv4）或 Internet 协议版本 6（IPv6）地址，在它们之间路由流量。您可以使用 VPC 对等来连接位于同一 AWS 区域或两个 AWS 区域中的 VPC。有关 VPC 对等的更多信息，请参阅《Amazon VPC 用户指南》**中的[什么是 VPC 对等？](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)。

从其它 VPC 挂载文件系统时，您需要手动解析挂载目标。您应按如下方式使用相应可用区中挂载目标的 IP 地址，并将 {{mount-target-ip-address}}、{{file-system-id}} 和 {{mount-directory}} 替换为您的值。

```
sudo mount -t s3files -o mounttargetip={{mount-target-ip-address}} {{file-system-id}} {{mount-directory}}
```

为了确保文件系统的高可用性，我们建议您始终使用与 NFS 客户端位于相同可用区的挂载目标 IP 地址。

或者，您可以使用 Amazon Route 53 作为您的 DNS 服务。在 Route 53 中，您可以通过创建私有托管区和资源记录集来解析其它 VPC 中的挂载目标 IP 地址。有关如何执行此操作的更多信息，请参阅《Amazon Route 53 开发人员指南》**中的[私有托管区的使用](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)。

有关从其它 VPC 进行挂载的更多详细信息，请访问 [GitHub 自述文件](https://github.com/aws/efs-utils/blob/master/README.md)。

## 从不同 AWS 区域挂载 S3 文件系统
<a name="s3-files-mounting-cross-region"></a>

如果从与文件系统所在不同的 AWS 区域中的另一个 VPC 挂载 S3 文件系统，则需要编辑 `s3files-utils.conf` 文件。在 `/etc/amazon/efs/s3files-utils.conf` 中找到以下行：

```
#region = us-east-1
```

取消该行注释，如果文件系统不在 us-east-1 中，则替换文件系统所在区域的 ID 值。

然后，在配置中更改区域后，您需要在挂载命令中指定挂载目标 IP：

```
sudo mount -t s3files -o mounttargetip={{mount-target-ip-address}} {{file-system-id}} {{mount-directory}}
```

## 卸载 S3 文件系统
<a name="s3-files-mounting-unmount"></a>

要卸载连接到运行 Linux 的 EC2 实例的 S3 文件系统，请使用 `umount` 命令，如下所示：

```
umount {{mount-directory}}
```

建议您不要指定任何其他 `umount` 选项。避免设置不同于默认值的任何其他 `umount` 选项。您可以通过运行 `findmnt` 命令，验证 S3 文件系统是否已卸载。如果卸载成功，则针对挂载目录的 `findmnt` 命令将不会产生任何输出。