View a markdown version of this page

教程:跨账户挂载 S3 文件系统 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

教程:跨账户挂载 S3 文件系统

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

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

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

先决条件

开始之前,请确保您拥有:

本教程中使用的示例值

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

项目
账户 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 中,记录文件系统中的以下网络详细信息。

  1. 通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

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

  3. 选择文件系统选项卡,选择您的文件系统,然后选择挂载目标选项卡。

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

  5. 记录以下各值,供后续步骤中使用:

    • 文件系统的 VPC ID

    • 可用区 ID(例如 use1-az1use1-az2

    • 每个挂载目标的 IPv4 地址(映射到每个可用区 ID)

    • 挂载目标的安全组 ID

步骤 2:创建 VPC 对等连接

CIDR 范围不得重叠

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

  1. 在这两个账户中,验证 VPC 是否启用了以下 DNS 设置。在 VPC 控制台中,选择您的 VPC,然后选择编辑 VPC 设置

    • DNS 解析(enableDnsSupport):已启用

    • DNS 主机名(enableDnsHostnames):已启用

  2. 在账户 B 中,打开 VPC 控制台,选择对等连接,然后选择创建对等连接。输入以下值:

    • VPC ID(请求者):EC2 实例的 VPC(账户 B)

    • 账户:另一个账户,然后输入 111111111111

    • 区域:us-east-1

    • VPC ID(接受者):S3 文件系统的 VPC(账户 A)

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

步骤 3:添加路由

在账户 B(EC2 实例账户)中:

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

  2. 选择编辑路由选项卡,然后选择添加路由

    • 目标:账户 A 中 S3 Files VPC 的 CIDR

    • 目标:选择对等连接,然后选择您在步骤 2 中创建的对等连接

在账户 A(S3 Files 账户)中:

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

  2. 选择编辑路由选项卡,然后选择添加路由

    • 目标:账户 B 中 EC2 实例 VPC 的 CIDR

    • 目标:选择对等连接,然后选择您在步骤 2 中创建的对等连接

步骤 4:配置安全组

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

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

  2. 选择编辑入站规则并添加以下规则:

    • 类型:NFS

    • 端口:2049

    • 源:选择自定义,然后输入账户 B 中的 EC2 安全组 ID

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

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

步骤 5:添加文件系统策略

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

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

  2. 选择您的文件系统,然后选择编辑文件系统策略

  3. 添加向账户 B 角色授予挂载权限的策略。以下示例策略向账户 B 中的 EC2 实例角色授予 s3files:ClientMounts3files: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:

  1. 打开 Route 53 控制台,选择托管区,然后选择创建托管区。输入以下值:

    • 域名:{az_id}.fs-0123456abcdef0189.s3files.us-east-1.on.aws

    • 类型:私有托管区

    • 区域:us-east-1

    • VPC ID:账户 B 中 EC2 实例的 VPC

  2. 选择创建托管区域

  3. 选择创建记录并输入以下值:

    • 记录名称:(留空)

    • 记录类型:A

    • 值:该可用区 ID 的挂载目标的 IPv4 地址(来自步骤 1)

  4. 选择创建记录

  5. 对您计划从中进行连接的所有可用区 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 实例并运行以下命令。

  1. 创建挂载点:

    sudo mkdir /mnt/s3files
  2. 挂载文件系统:

    sudo mount -t s3files fs-0123456abcdef0189 /mnt/s3files
  3. 验证挂载:

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

问题排查

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

挂载失败,出现 DNS 解析错误

确认两个 VPC 都已启用 enableDnsSupportenableDnsHostnames。验证 Route 53 私有托管区是否与账户 B 中的正确 VPC 相关联,以及 A 记录是否指向正确的挂载目标 IP 地址。

挂载挂起或超时

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

对文件操作的权限被拒绝

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