如何使用系统策略来控制对我的 EFS 文件系统的访问?

上次更新时间:2022 年 11 月 17 日

我想跨账户访问我的 Amazon Elastic File System(Amazon EFS)文件系统,以便共享文件。如何使用适用于 NFS 客户端和 EFS 访问点的 AWS Identity and Access Management(IAM)授权来执行此操作?

简短描述

您可以将适用于 NFS 客户端和访问点的 IAM 授权与 Amazon EFS 挂载帮助程序结合使用,从而挂载您的 Amazon EFS 文件系统。默认情况下,挂载帮助程序会使用 DNS 来解析挂载目标的 IP 地址。因此,如果您从其他账户或 Amazon Virtual Private Cloud(Amazon VPC)挂载,则必须手动解析 Amazon EFS 挂载目标 IP。

先决条件

  1. 您的 NFS 客户端和 EFS 文件系统的 VPC 使用 VPC 对等连接或 VPC Transit Gateway 进行连接。这允许来自相同或不同账户的 Amazon Elastic Compute Cloud(Amazon EC2)实例访问不同 VPC 中的 Amazon EFS 文件系统。

  2. 您的 IAM 角色(实例角色或任何其他角色)拥有对 Amazon EFS 和 NFS 客户端资源的控制台或读取访问权限。

  3. Amazon EFS 客户端botocore 软件包安装在 NFS 客户端中。

解决方法

注意:如果您在运行 AWS CLI 命令时遇到错误,请确保您运行的是最新版本的AWS 命令行界面(AWS CLI)

在此示例中,EFS 文件系统位于账户 A 中,而 NFS 客户端位于账户 B 中。    

1.    要访问和挂载跨账户 EFS 文件系统,请在 IAM policy 中添加与以下类似的策略语句:

{
            "Sid": "EfsPermissions",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite",
                "elasticfilesystem:ClientRootAccess"
            ],
            "Resource": "arn:aws:elasticfilesystem:region:account-id:file-system/file-system-id"
        }

此语句将向此 IAM 角色授予对 EFS 文件系统的挂载、写入和根访问权限。如果您的 NFS 客户端是一个 EC2 实例,请将此 IAM 角色附加到该实例。

2.    您还可以使用 AWS CLI 代入该角色。请注意,AWS CLI 无法解析位于另一个 VPC 中的 EFS 文件系统的 DNS。因此,请首先确定客户端的正确挂载目标 IP。然后,将客户端配置为使用该 IP 挂载 EFS 文件系统。

为确保高可用性,使用的挂载目标 IP 地址应始终与 NFS 客户端位于同一可用区(AZ)。可用区名称映射可能因账户而异。由于您要在另一个账户中挂载 EFS 文件系统,因此 NFS 客户端和挂载目标必须位于相同的可用区 ID 中。

要确定 EC2 实例所在的可用区,请使用以下任意一种方法调用 DescribeAvailabilityZone API:

  • 登录到 Amazon EC2 控制台,然后选择 Instances(实例)。选择 EC2-Instance-ID(EC2 实例 ID),然后选择 Networking(联网)。在 Networking details(联网详细信息)下,您可以找到您所在的可用区。

    –或者–

  • 从具有充分 Amazon EC2 读取权限的 IAM 实体运行类似的命令,并获得类似的输出:

$ aws ec2 describe-availability-zones --zone-name `curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
{
    "AvailabilityZones": [
        {
            "State": "available", 
            "ZoneName": "us-east-2b", 
            "Messages": [], 
            "ZoneId": "use2-az2", 
            "RegionName": "us-east-2"
        }
    ]
}

3.    要确定本地可用区的挂载目标 IP,使用下面的任意一种方法调用 DescribeMountTargets API:

  • 登录到 Amazon EFS 控制台,然后选择 File Systems(文件系统)。选择 EFS-File-System-ID(EFS 文件系统 ID),然后在 Network(网络)下,记下您的可用区的 IP 地址。

    –或者–

  • 从具有充分 Amazon EC2 读取权限的 IAM 实体运行类似的命令,并获得类似的输出:

$ aws efs describe-mount-targets --file-system-id fs-cee4feb7
{
    "MountTargets": [
        {
            "MountTargetId": "fsmt-a9c3a1d0", 
            "AvailabilityZoneId": "use2-az2", 
            "NetworkInterfaceId": "eni-048c09a306023eeec", 
            "AvailabilityZoneName": "us-east-2b", 
            "FileSystemId": "fs-cee4feb7", 
            "LifeCycleState": "available", 
            "SubnetId": "subnet-06eb0da37ee82a64f", 
            "OwnerId": "958322738406", 
            "IpAddress": "10.0.2.153"
        }, 
...
        {
            "MountTargetId": "fsmt-b7c3a1ce", 
            "AvailabilityZoneId": "use2-az3", 
            "NetworkInterfaceId": "eni-0edb579d21ed39261", 
            "AvailabilityZoneName": "us-east-2c", 
            "FileSystemId": "fs-cee4feb7", 
            "LifeCycleState": "available", 
            "SubnetId": "subnet-0ee85556822c441af", 
            "OwnerId": "958322738406", 
            "IpAddress": "10.0.3.107"
        }
    ]
}

4.    从您获得的输出中,记下与 EC2 实例所在可用区中的挂载目标对应的 IP 地址。

5.    使用您获得的 IP 地址并在 NFS 客户端的 /etc/hosts 文件中添加 hosts 条目。DNS 名称的格式为 mount-target-IP-Address file-system-ID.efs.region.amazonaws.com

参见以下示例命令:

$ echo "10.0.2.153 fs-cee4feb7.efs.us-east-2.amazonaws.com" | sudo tee -a /etc/hosts

6.    使用挂载帮助程序挂载 EFS 文件系统。

注意:在跨账户场景中,您不能使用通常的 NFS 命令,因此需要使用 botocore 和 Amazon EFS 客户端。

完成这些步骤后,您便可以挂载 EFS 文件系统并开始使用。如果您遇到任何错误,请参阅问题排查指南


这篇文章对您有帮助吗?


需要更多帮助?