You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

跨VPC对等连接挂载Amazon EFS失败,寻求EFS内容同步排查方案

跨VPC挂载EFS失败:DNS解析问题排查与方案可行性分析

首先,你的同步方案本身是可行的——通过VPC对等连接跨VPC挂载EFS,再用rsync同步内容,是部署期间同步用户生成内容的合理方式。现在核心问题出在跨VPC的EFS DNS解析上,下面是具体的排查方向和修复建议:

一、核心排查步骤

1. 确认VPC的DNS基础配置是否开启

EFS的域名解析依赖VPC的内置DNS服务,生产VPC必须满足两个条件:

  • 开启enableDnsSupport(默认开启,但可能被修改):这个选项允许VPC内的实例使用AWS提供的DNS服务器(VPC CIDR段的第二个IP,比如10.0.0.2)。
  • 开启enableDnsHostnames:这个选项允许EC2实例获取公有DNS hostname,同时也影响跨VPC的DNS解析能力。

你可以在AWS控制台的VPC详情页,检查“DNS选项”部分是否同时开启了这两项。

2. 检查VPC对等连接的DNS解析权限

这是跨VPC解析EFS域名最容易遗漏的配置:

  • 对于预发布VPC的对等连接端:需要开启「允许来自对等VPC的DNS解析」(Allow DNS resolution from peer VPC)。这会让预发布VPC的DNS服务器响应来自生产VPC的EFS域名查询。
  • 对于生产VPC的对等连接端:需要开启「允许向对等VPC发送DNS查询」(Allow DNS queries to peer VPC)。这会让生产VPC的EC2实例发起的DNS查询能够通过对等连接传递到预发布VPC的DNS服务器。

如果这两个选项没开,生产VPC的DNS服务器无法向预发布VPC的DNS查询EFS域名,自然会返回“Name or service not known”。

3. 验证DNS查询的网络通路

虽然你能ping通预发布EC2,但DNS查询使用的是UDP 53端口,需要确保:

  • 生产EC2所在的安全组:允许出站UDP 53流量到预发布VPC的CIDR范围。
  • 预发布VPC的网络ACL(NACL):允许入站UDP 53流量来自生产VPC的CIDR,同时允许出站UDP 53流量返回生产VPC。
  • 生产VPC的NACL:允许出站UDP 53到预发布VPC,以及入站UDP 53的响应。

可以在生产EC2上执行dig eu-west-1b.fs-123456.efs.eu-west-1.amazonaws.comnslookup fs-123456.efs.eu-west-1.amazonaws.com,查看输出是否有解析结果。如果直接用预发布VPC的DNS服务器查询(比如nslookup fs-123456.efs.eu-west-1.amazonaws.com 10.x.x.2,其中10.x.x.2是预发布VPC的DNS地址)能得到结果,那基本可以确定是对等连接的DNS权限没开。

4. 检查EFS挂载目标的可用性

你使用的是带可用区前缀的EFS域名(eu-west-1b.fs-123456.efs.eu-west-1.amazonaws.com),需要确保预发布EFS在eu-west-1b可用区已经创建了挂载目标。如果该可用区没有挂载目标,这个域名会解析失败。

你可以尝试使用不带可用区的EFS域名挂载:fs-123456.efs.eu-west-1.amazonaws.com,这个域名会自动解析到预发布VPC内最近的可用挂载目标,减少可用区匹配的问题。

5. 尝试IP直接挂载(排除DNS问题)

如果通过上述步骤还是无法解析DNS,可以先手动解析EFS的IP:

  • 在预发布VPC内的EC2上执行nslookup fs-123456.efs.eu-west-1.amazonaws.com,获取对应的挂载目标IP。
  • 然后在生产EC2上尝试用IP挂载:
    mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport <EFS挂载目标IP>:/ /mnt/efs-preprod
    

如果能挂载成功,就完全确认是DNS解析的问题,回到前面的步骤排查DNS配置。

二、方案可行性确认

你的同步方案是完全可行的:

  1. 跨VPC挂载EFS是AWS支持的场景,只要VPC对等连接、安全组、DNS配置正确,就能实现。
  2. 部署期间临时挂载两个EFS,用rsync(比如rsync -avz /mnt/efs-preprod/ /mnt/efs-prod/)同步内容,同步完成后卸载预发布EFS,不会影响生产集群的正常运行。
  3. 如果后续需要定期同步,也可以考虑将这个流程自动化(比如用AWS Lambda+EC2 Run Command,或者在生产VPC内保留一台专用的同步实例)。

内容的提问来源于stack exchange,提问作者Bravehartk2

火山引擎 最新活动