

# 教程：跨账户挂载 S3 文件系统
<a name="s3-files-cross-account"></a>

您可以通过与文件系统拥有者账户不同的 Amazon 账户中的计算资源访问 S3 文件系统。这称为跨账户访问。通过跨账户访问，不同账户中的团队可以共享同一个文件系统，而无需复制数据。

跨账户访问需要以下条件：
+ 端口 2049 上的网络访问
+ 解析文件系统挂载目标的 DNS
+ 支持从远程账户进行访问的 S3 Files 权限

在本教程中，您使用 Amazon 管理控制台从 Amazon EC2 实例配置跨账户访问。账户 A 拥有 S3 文件系统，账户 B 拥有连接到该文件系统的 EC2 实例。

## 先决条件
<a name="s3-files-cross-account-prerequisites"></a>

开始之前，请确保您拥有：
+ 在账户 A 中具有挂载目标的 S3 文件系统。有关更多信息，请参阅 [S3 Files 入门](s3-files-getting-started.md)。
+ 在账户 B 中运行的具有 [amazon-efs-utils](https://github.com/aws/efs-utils) v3.0.0 或更高版本的 EC2 实例。
+ [用于将文件系统附加到 Amazon 计算资源的 IAM 角色](s3-files-prereq-policies.md#s3-files-prereq-iam-compute-role)，该角色到附加到 EC2 实例。
+ 向账户 B 授予执行 `s3files:ClientMount` 和 `s3files:ClientWrite` 的权限的[文件系统策略](s3-files-file-system-policies-creating.md)。
+ 账户 A 和账户 B 中的 VPC CIDR 不重叠。
+ 两个账户都满足所有 S3 Files 先决条件。有关更多信息，请参阅 [S3 Files 先决条件](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-files-prereq-policies.html)。

### 本教程中使用的示例值
<a name="s3-files-cross-account-example-values"></a>

本教程使用以下示例值。将它们替换为您自己的值：


| 项目 | 值 | 
| --- | --- | 
| 账户 A（S3 Files 账户） | 111111111111 | 
| 账户 B（EC2 实例账户） | 222222222222 | 
| S3 文件系统 ID | fs-0123456abcdef0189 | 
| 区域 | us-east-1 | 
| S3 Files DNS 名称 | {{{az\_id}}}.fs-0123456abcdef0189.s3files.us-east-1.on.aws | 
| EC2 实例角色（账户 B） | ec2-instance-role | 

## 步骤 1：记录文件系统网络详细信息
<a name="s3-files-cross-account-step1"></a>

在账户 A 中，记录文件系统中的以下网络详细信息。

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择**通用存储桶**，然后选择链接到 S3 文件系统的存储桶。

1. 选择**文件系统**选项卡，选择您的文件系统，然后选择**挂载目标**选项卡。

1. 验证您计划从中进行连接的每个可用区中是否存在挂载目标。

1. 记录以下各值，供后续步骤中使用：
   + 文件系统的 VPC ID
   + 可用区 ID（例如 `use1-az1`、`use1-az2`）
   + 每个挂载目标的 IPv4 地址（映射到每个可用区 ID）
   + 挂载目标的安全组 ID

## 步骤 2：创建 VPC 对等连接
<a name="s3-files-cross-account-step2"></a>

**CIDR 范围不得重叠**  
VPC 对等连接要求您的 CIDR 范围不重叠。请先验证这一点，然后再继续操作。

1. 在这两个账户中，验证 VPC 是否启用了以下 DNS 设置。在 VPC 控制台中，选择您的 VPC，然后选择**编辑 VPC 设置**：
   + **DNS 解析（enableDnsSupport）：**已启用
   + **DNS 主机名（enableDnsHostnames）：**已启用

1. 在账户 B 中，打开 VPC 控制台，选择**对等连接**，然后选择**创建对等连接**。输入以下值：
   + **VPC ID（请求者）：**EC2 实例的 VPC（账户 B）
   + **账户：**另一个账户，然后输入 `111111111111`
   + **区域：**`us-east-1`
   + **VPC ID（接受者）：**S3 文件系统的 VPC（账户 A）

1. 在账户 A 中，打开 VPC 控制台，选择**对等连接**，找到待处理的请求，然后依次选择**操作**、**接受请求**。验证状态是否更改为**活动**。

## 步骤 3：添加路由
<a name="s3-files-cross-account-step3"></a>

**在账户 B（EC2 实例账户）中：**

1. 打开 VPC 控制台，选择**路由表**，然后为 EC2 实例的子网选择路由表。

1. 选择**编辑路由**选项卡，然后选择**添加路由**：
   + **目标：**账户 A 中 S3 Files VPC 的 CIDR
   + **目标：**选择**对等连接**，然后选择您在步骤 2 中创建的对等连接

**在账户 A（S3 Files 账户）中：**

1. 打开 VPC 控制台，选择**路由表**，然后选择 S3 Files VPC 的路由表。

1. 选择**编辑路由**选项卡，然后选择**添加路由**：
   + **目标：**账户 B 中 EC2 实例 VPC 的 CIDR
   + **目标：**选择**对等连接**，然后选择您在步骤 2 中创建的对等连接

## 步骤 4：配置安全组
<a name="s3-files-cross-account-step4"></a>

账户 A 中的挂载目标安全组必须支持来自账户 B 中 EC2 实例的入站 NFS 流量。账户 B 中的 EC2 实例安全组必须支持出站 NFS 流量流向挂载目标。

1. 在 VPC 控制台中，选择**安全组**，然后选择您在步骤 1 中记下的挂载目标安全组。

1. 选择**编辑入站规则**并添加以下规则：
   + **类型**：NFS
   + **端口：**2049
   + **源：**选择**自定义**，然后输入账户 B 中的 EC2 安全组 ID

1. 验证账户 B 中的 EC2 实例安全组是否在端口 2049 上支持出站 TCP。


| 安全组 | 规则类型 | 协议 | 端口 | 源/目标 | 
| --- | --- | --- | --- | --- | 
| EC2 实例（账户 B） | 出站 | TCP | 2049 | 挂载目标安全组（账户 A） | 
| 挂载目标（账户 A） | 入站 | TCP | 2049 | EC2 实例安全组（账户 B） | 

## 步骤 5：添加文件系统策略
<a name="s3-files-cross-account-step5"></a>

在账户 A 中，添加向账户 B 角色授予挂载权限的文件系统策略。S3 Files 会针对每个挂载请求评估此策略。无论网络或 DNS 配置如何，如果没有此策略，挂载都会失败。

1. 打开 Amazon S3 控制台并选择存储桶，然后选择**文件系统**选项卡。

1. 选择您的文件系统，然后选择**编辑文件系统策略**。

1. 添加向账户 B 角色授予挂载权限的策略。以下示例策略向账户 B 中的 EC2 实例角色授予 `s3files:ClientMount` 和 `s3files:ClientWrite`：

   ```
   {
       "Version": "2012-10-17",
       "Statement": [
           {
               "Sid": "AllowCrossAccountMount",
               "Effect": "Allow",
               "Principal": { "AWS": "arn:aws:iam::222222222222:role/ec2-instance-role" },
               "Action": [
                   "s3files:ClientMount",
                   "s3files:ClientWrite"
               ],
               "Resource": "arn:aws:s3files:us-east-1:111111111111:file-system/fs-0123456abcdef0189"
           }
       ]
   }
   ```

## 步骤 6：创建 Route 53 托管区
<a name="s3-files-cross-account-step6"></a>

在账户 B 中，创建私有托管区，这样 EC2 实例就可以解析文件系统 DNS 名称。S3 Files 使用以下格式的 DNS 名称来将挂载请求路由到正确的可用区：

```
{az_id}.{fs_id}.s3files.{region}.on.aws
```

为具有挂载目标的每个可用区 ID 创建一个私有托管区。对于每个可用区 ID：

1. 打开 Route 53 控制台，选择**托管区**，然后选择**创建托管区**。输入以下值：
   + **域名：**`{{{az_id}}}.fs-0123456abcdef0189.s3files.us-east-1.on.aws`
   + **类型：**私有托管区
   + **区域：**`us-east-1`
   + **VPC ID：**账户 B 中 EC2 实例的 VPC

1. 选择**创建托管区域**。

1. 选择**创建记录**并输入以下值：
   + **记录名称**：（留空）
   + **记录类型**：A
   + **值：**该可用区 ID 的挂载目标的 IPv4 地址（来自步骤 1）

1. 选择**创建记录**。

1. 对您计划从中进行连接的所有可用区 ID 重复此操作。

**示例：**


| 托管区域名 | A 记录值 | 
| --- | --- | 
| use1-az1.fs-0123456abcdef0189.s3files.us-east-1.on.aws | use1-az1 的挂载目标 IP | 
| use1-az2.fs-0123456abcdef0189.s3files.us-east-1.on.aws | use1-az2 的挂载目标 IP | 
| use1-az4.fs-0123456abcdef0189.s3files.us-east-1.on.aws | use1-az4 的挂载目标 IP | 

## 步骤 7：配置 IAM 权限
<a name="s3-files-cross-account-step7"></a>

将 IAM 角色附加到账户 B 中的 EC2 实例。该角色必须包含以下权限才能挂载和访问文件系统：
+ **`AmazonS3FilesClientFullAccess` 托管式策略（或等效策略）**：此策略向 EC2 实例授予连接到 S3 Files 文件系统并与之交互的权限。
+ **向 S3 对象授予访问跨账户存储桶的权限的内联策略**：此策略向 EC2 实例授予直接从账户 A 中的 S3 存储桶读取对象的权限。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3ObjectReadAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::BUCKET_NAME_ACCOUNT_A/*"
        },
        {
            "Sid": "S3BucketListAccess",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::BUCKET_NAME_ACCOUNT_A"
        }
    ]
}
```

将 {{BUCKET\_NAME\_ACCOUNT\_A}} 替换为账户 A 中 S3 存储桶的名称。

**注意**  
有关计算资源所需基本策略的完整列表，请参阅[用于将文件系统附加到 Amazon 计算资源的 IAM 角色](s3-files-prereq-policies.md#s3-files-prereq-iam-compute-role)。

## 步骤 8：装载文件系统
<a name="s3-files-cross-account-step8"></a>

在账户 B 中[连接到您的 EC2 实例](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/connect.html)并运行以下命令。

1. 创建挂载点：

   ```
   sudo mkdir /mnt/s3files
   ```

1. 挂载文件系统：

   ```
   sudo mount -t s3files fs-0123456abcdef0189 /mnt/s3files
   ```

1. 验证挂载：

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

## 问题排查
<a name="s3-files-cross-account-troubleshooting"></a>

使用以下信息可解决跨账户挂载 S3 文件系统时的常见问题。

挂载失败，出现 DNS 解析错误  
确认两个 VPC 都已启用 `enableDnsSupport` 和 `enableDnsHostnames`。验证 Route 53 私有托管区是否与账户 B 中的正确 VPC 相关联，以及 A 记录是否指向正确的挂载目标 IP 地址。

挂载挂起或超时  
验证 VPC 对等连接状态是否为**活动**。验证这两个账户中的路由表是否有用于对等 VPC CIDR（指向对等连接）的条目。验证挂载目标安全组是否在端口 2049 上支持来自 EC2 实例安全组的入站 TCP。

对文件操作的权限被拒绝  
验证 EC2 实例 IAM 角色是否同时附加了 `AmazonS3FilesClientFullAccess` 托管式策略和内联 S3 对象访问策略。验证账户 A 中的文件系统策略是否向账户 B 角色授予 `s3files:ClientMount` 和 `s3files:ClientWrite` 权限。