教程:跨账户挂载 S3 文件系统
您可以通过与文件系统拥有者账户不同的 Amazon 账户中的计算资源访问 S3 文件系统。这称为跨账户访问。通过跨账户访问,不同账户中的团队可以共享同一个文件系统,而无需复制数据。
跨账户访问需要以下条件:
端口 2049 上的网络访问
解析文件系统挂载目标的 DNS
支持从远程账户进行访问的 S3 Files 权限
在本教程中,您使用 Amazon 管理控制台从 Amazon EC2 实例配置跨账户访问。账户 A 拥有 S3 文件系统,账户 B 拥有连接到该文件系统的 EC2 实例。
先决条件
开始之前,请确保您拥有:
-
在账户 A 中具有挂载目标的 S3 文件系统。有关更多信息,请参阅 S3 Files 入门。
-
在账户 B 中运行的具有 amazon-efs-utils
v3.0.0 或更高版本的 EC2 实例。 -
用于将文件系统附加到 Amazon 计算资源的 IAM 角色,该角色到附加到 EC2 实例。
-
向账户 B 授予执行
s3files:ClientMount和s3files:ClientWrite的权限的文件系统策略。 -
账户 A 和账户 B 中的 VPC CIDR 不重叠。
-
两个账户都满足所有 S3 Files 先决条件。有关更多信息,请参阅 S3 Files 先决条件。
本教程中使用的示例值
本教程使用以下示例值。将它们替换为您自己的值:
| 项目 | 值 |
|---|---|
| 账户 A(S3 Files 账户) | 111111111111 |
| 账户 B(EC2 实例账户) | 222222222222 |
| S3 文件系统 ID | fs-0123456abcdef0189 |
| 区域 | us-east-1 |
| S3 Files DNS 名称 | |
| EC2 实例角色(账户 B) | ec2-instance-role |
步骤 1:记录文件系统网络详细信息
在账户 A 中,记录文件系统中的以下网络详细信息。
-
通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
选择通用存储桶,然后选择链接到 S3 文件系统的存储桶。
-
选择文件系统选项卡,选择您的文件系统,然后选择挂载目标选项卡。
-
验证您计划从中进行连接的每个可用区中是否存在挂载目标。
-
记录以下各值,供后续步骤中使用:
-
文件系统的 VPC ID
-
可用区 ID(例如
use1-az1、use1-az2) -
每个挂载目标的 IPv4 地址(映射到每个可用区 ID)
-
挂载目标的安全组 ID
-
步骤 2:创建 VPC 对等连接
CIDR 范围不得重叠
VPC 对等连接要求您的 CIDR 范围不重叠。请先验证这一点,然后再继续操作。
-
在这两个账户中,验证 VPC 是否启用了以下 DNS 设置。在 VPC 控制台中,选择您的 VPC,然后选择编辑 VPC 设置:
-
DNS 解析(enableDnsSupport):已启用
-
DNS 主机名(enableDnsHostnames):已启用
-
-
在账户 B 中,打开 VPC 控制台,选择对等连接,然后选择创建对等连接。输入以下值:
-
VPC ID(请求者):EC2 实例的 VPC(账户 B)
-
账户:另一个账户,然后输入
111111111111 -
区域:
us-east-1 -
VPC ID(接受者):S3 文件系统的 VPC(账户 A)
-
-
在账户 A 中,打开 VPC 控制台,选择对等连接,找到待处理的请求,然后依次选择操作、接受请求。验证状态是否更改为活动。
步骤 3:添加路由
在账户 B(EC2 实例账户)中:
-
打开 VPC 控制台,选择路由表,然后为 EC2 实例的子网选择路由表。
-
选择编辑路由选项卡,然后选择添加路由:
-
目标:账户 A 中 S3 Files VPC 的 CIDR
-
目标:选择对等连接,然后选择您在步骤 2 中创建的对等连接
-
在账户 A(S3 Files 账户)中:
-
打开 VPC 控制台,选择路由表,然后选择 S3 Files VPC 的路由表。
-
选择编辑路由选项卡,然后选择添加路由:
-
目标:账户 B 中 EC2 实例 VPC 的 CIDR
-
目标:选择对等连接,然后选择您在步骤 2 中创建的对等连接
-
步骤 4:配置安全组
账户 A 中的挂载目标安全组必须支持来自账户 B 中 EC2 实例的入站 NFS 流量。账户 B 中的 EC2 实例安全组必须支持出站 NFS 流量流向挂载目标。
-
在 VPC 控制台中,选择安全组,然后选择您在步骤 1 中记下的挂载目标安全组。
-
选择编辑入站规则并添加以下规则:
-
类型:NFS
-
端口:2049
-
源:选择自定义,然后输入账户 B 中的 EC2 安全组 ID
-
-
验证账户 B 中的 EC2 实例安全组是否在端口 2049 上支持出站 TCP。
| 安全组 | 规则类型 | 协议 | 端口 | 源/目标 |
|---|---|---|---|---|
| EC2 实例(账户 B) | 出站 | TCP | 2049 | 挂载目标安全组(账户 A) |
| 挂载目标(账户 A) | 入站 | TCP | 2049 | EC2 实例安全组(账户 B) |
步骤 5:添加文件系统策略
在账户 A 中,添加向账户 B 角色授予挂载权限的文件系统策略。S3 Files 会针对每个挂载请求评估此策略。无论网络或 DNS 配置如何,如果没有此策略,挂载都会失败。
-
打开 Amazon S3 控制台并选择存储桶,然后选择文件系统选项卡。
-
选择您的文件系统,然后选择编辑文件系统策略。
-
添加向账户 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 托管区
在账户 B 中,创建私有托管区,这样 EC2 实例就可以解析文件系统 DNS 名称。S3 Files 使用以下格式的 DNS 名称来将挂载请求路由到正确的可用区:
{az_id}.{fs_id}.s3files.{region}.on.aws
为具有挂载目标的每个可用区 ID 创建一个私有托管区。对于每个可用区 ID:
-
打开 Route 53 控制台,选择托管区,然后选择创建托管区。输入以下值:
-
域名:
{az_id}.fs-0123456abcdef0189.s3files.us-east-1.on.aws -
类型:私有托管区
-
区域:
us-east-1 -
VPC ID:账户 B 中 EC2 实例的 VPC
-
-
选择创建托管区域。
-
选择创建记录并输入以下值:
-
记录名称:(留空)
-
记录类型:A
-
值:该可用区 ID 的挂载目标的 IPv4 地址(来自步骤 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 权限
将 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 角色。
步骤 8:装载文件系统
在账户 B 中连接到您的 EC2 实例并运行以下命令。
-
创建挂载点:
sudo mkdir /mnt/s3files
-
挂载文件系统:
sudo mount -t s3files fs-0123456abcdef0189 /mnt/s3files
-
验证挂载:
df -h /mnt/s3files ls /mnt/s3files
问题排查
使用以下信息可解决跨账户挂载 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权限。