在 AWS 之外挂载弹性文件系统 (EFS)

在 AWS 之外挂载弹性文件系统 (EFS)

我有一台位于 AWS 之外的服务器。我希望能够将 EFS 卷安装到该服务器,但我不确定这是否可行。

也许如果您创建一个 VPC,然后通过 VPN 创建一个隧道?

有人知道这是否可能吗?

答案1

重要更新:

2018 年 10 月,AWS 扩展了 EFS 所依赖的网络技术的功能,使其现在可以跨托管 VPN 连接和跨区域 VPC 对等连接本地运行,而无需借助下面详述的代理解决方法。

https://aws.amazon.com/about-aws/whats-new/2018/10/amazon-efs-now-supports-aws-vpn-and-inter-region-vpc-peering/

EFS 于 2016 年底增加了通过 AWS Direct Connect 电路进行连接的支持。

https://aws.amazon.com/blogs/aws/amazon-efs-update-on-premise-access-via-direct-connect-vpc/


评论提出了一些有趣的问题,因为在我最初阅读这个问题时,我可能比你更熟悉 EFS。

首先,介绍一下背景:

Elastic File System 中的“Elastic”主要指存储空间和吞吐量的自动扩展——而不是外部访问的灵活性。

EFS 似乎对您可以存储的数据量没有任何有意义的限制。EFS 卷上任何单个文件的最大大小记录为52,673,613,135,872 字节 (52 TiB). 其他大部分限制也同样宽松。

EFS 的计费方式特别“灵活”。与 EBS 卷上的文件系统不同,EFS 上的空间不是预先分配的,您只需按小时平均支付存储的费用。您的费用会根据您存储的内容增加和减少(它们是“弹性的”)。当您删除文件时,您将停止为它们在一小时内占用的空间付费。如果您存储 1 GB 750 小时(≅1 个月)然后删除它,或者如果您存储 375 GB 2 小时然后删除它,您的每月账单将相同......0.30 美元。这当然与 EBS 完全不同,EBS 会很乐意向您收取 37.50 美元,用于0x00在本月剩余的时间内存储 375 GB。

S3 的存储定价模型与 EFS 非常相似,因为一旦您删除对象,存储计费就会停止,成本约为 EFS 成本的 1/10,但正如我和其他人多次提到的那样,S3 不是文件系统。像 s3fs-fuse 这样的实用程序试图提供“阻抗桥”,但试图将不是真正文件系统的东西当作文件系统来处理存在固有的困难(覆盖的最终一致性不是其中最不重要的)。因此,如果您需要一个真正的“文件系统”,并且它适用于需要共享访问的应用程序,或者难以确定所需的存储空间,或者您希望它按需扩展,那么 EFS 可能会很有用。

而且,当您拥有 8.0 EiB 的可用空间时,它看起来很酷。

$ df -h | egrep '^Filesystem|efs'
Filesystem                                            Size  Used Avail Use% Mounted on
us-west-2a.fs-5ca1ab1e.efs.us-west-2.amazonaws.com:/  8.0E  121G  8.0E   1% /srv/efs/fs-5ca1ab1e
us-west-2a.fs-acce55ed.efs.us-west-2.amazonaws.com:/  8.0E  7.2G  8.0E   1% /srv/efs/fs-acce55ed

但当然,使用最适合您应用程序的存储服务非常重要。每个选项都有其有效的用例。EFS 可能是 AWS 提供的最专业的存储解决方案,其用例比 EBS 或 S3 更窄。


但是你能在 VPC 外面使用它吗?

官方答案是否定的

不支持通过 VPC 私有连接机制(例如 VPN 连接、VPC 对等和 AWS Direct Connect)挂载文件系统。

http://docs.aws.amazon.com/efs/latest/ug/limits.html

EFS 目前仅限于 EC2 Linux 访问。而且是在 VPC 内。很快会添加更多功能。您可以关注 AWS 公告以了解新推出的功能。

https://forums.aws.amazon.com/thread.jspa?messageID=732749

但实际答案是肯定的,尽管这不是官方支持的配置。要使其工作,需要一些特殊步骤。

每个 EFS 文件系统都使用弹性网络接口 (ENI) 在您的 VPC 中分配端点 IP 地址,通常每个可用区域一个,并且您要确保在与实例匹配的可用区域中安装一个,这不仅是出于性能原因,还因为跨可用区域边界传输数据时会产生带宽费用。

这些 ENI 的有趣之处在于它们似乎不使用它们所连接的子网的路由表。它们似乎只能响应 VPC 内的实例,而不管安全组设置如何(每个 EFS 文件系统都有自己的安全组来控制访问)。

由于没有外部路由可访问,我无法通过硬件 VPN 直接访问 EFS 端点……因此我求助于我的老朋友 HAProxy,它确实(正如 @Tim 所预测的那样)是实现此功能所必需的。这是一个简单的配置,因为 EFS 仅使用 TCP 端口 2049。

我在 t2.nano 上使用 HAProxy(HAProxy 非常高效),其配置如下:

listen fs-8d06f00d-us-east-1
    bind :2049
    mode tcp
    option tcplog
    timeout tunnel 300000 
    server fs-8d06f00d-us-east-1b us-east-1b.fs-8d06f00d.efs.us-east-1.amazonaws.com:2049 check inter 60000 fastinter 15000 downinter 5000
    server fs-8d06f00d-us-east-1c us-east-1c.fs-8d06f00d.efs.us-east-1.amazonaws.com:2049 check inter 60000 fastinter 15000 downinter 5000 backup
    server fs-8d06f00d-us-east-1d us-east-1d.fs-8d06f00d.efs.us-east-1.amazonaws.com:2049 check inter 60000 fastinter 15000 downinter 5000 backup

该服务器位于 us-east-1b,因此它使用 us-east-1b 端点作为主端点,如果 1b 中的端点健康检查失败,则使用另外两个端点作为备份。

如果您的 VPC 中有 VPN,则可以使用此代理实例的 IP 地址作为目标来挂载卷(而不是直接使用 EFS 终端节点),并且您已经从 VPC 外部挂载了 EFS 文件系统。

我已经成功地将它安装在外部 Ubuntu 机器以及 Solaris¹ 服务器上(EFS 已被证明非常方便,因为它可以更轻松地将服务从它们身上迁移出去,从而加速它们的退役)。

对于某些情况,例如将数据移动到 AWS 或在迁移期间在特定数据上并行运行遗留系统和云系统,EFS 似乎是赢家。

当然,传统系统具有更高的往返时间,因此性能不如 EC2 实例,但这是意料之中的——物理定律没有例外。尽管如此,EFS 和 HAProxy 网关似乎是使其在外部工作的稳定解决方案。

如果您没有 VPN,那么一对 HAProxy 机器(一台在 AWS,一台在您的数据中心)也可以通过 TLS 隧道传输 EFS,建立单独的 TCP 连接,将有效负载包装在 TLS 中,以便在 Internet 上传输每个单独的 EFS 连接。从技术上讲,这不是 VPN,而是加密的连接隧道。这似乎也表现得相当不错。


¹Solaris 10 默认情况下(毫不奇怪)有些问题 - 最初,root 似乎没有特殊权限 - root 创建的 EFS 卷上的文件归 root 所有,但无法chown从 Solaris 计算机(Operation not permitted)分配给其他用户,即使 Ubuntu 客户端的一切都按预期运行。在这种情况下,解决方案是使用 击败 Solaris 计算机上的 NFS ID 映射守护程序。停止此服务可使一切按预期运行。此外,每次登录时都需要在 中禁用svcadm disable svc:/network/nfs/mapid:default的调用。可能有更好或更正确的解决方案,但这是 Solaris,所以我的好奇心不足以进行调查。/usr/sbin/quota/etc/profile

答案2

截至 2016 年 12 月 20 日,亚马逊宣布推出 AWS Direct Connect,可用于在本地服务器上安装 EFS 文件系统。因此,基本上,有一个本机功能可让您在 VPC 之外使用 AWS EFS。

作为先决条件,您必须启用并建立 AWS Direct Connect 连接,然后使用 nfs-utils,就像在 EC2 实例中安装 EFS 时一样。

更多信息可以在这里找到Amazon EFS 更新 – 通过 Direct Connect 进行本地访问。我刚刚发布了这个,因为我也在搜索这个未来,让其他人知道在 VPC 之外有针对 EFS 连接的本机解决方案。

相关内容