昨天我在 AWS 中设置了我的第一个 Autoscaling Group。我编写了一个 cloud-init/userdata 脚本来安装我的应用程序,并对其进行了约 40 次测试,没有任何错误。就在我回家之前,它突然停止工作,启动的新实例从未恢复正常,并且在其宽限期到期后最终被终止。
今天早上我进来发现问题仍然存在。我通过 SSH 进入一个实例并查看了 cloud-init-output.log 文件,发现了以下内容:
Err:1 http://ap-southeast-2.ec2.archive.ubuntu.com/ubuntu xenial InRelease
Could not connect to ap-southeast-2.ec2.archive.ubuntu.com:80 (54.253.131.141), connection timed out [IP: 54.253.131.141 80]
Err:2 http://ap-southeast-2.ec2.archive.ubuntu.com/ubuntu xenial-updates InRelease
Unable to connect to ap-southeast-2.ec2.archive.ubuntu.com:http: [IP: 54.253.131.141 80]
Err:3 http://ap-southeast-2.ec2.archive.ubuntu.com/ubuntu xenial-backports InRelease
Unable to connect to ap-southeast-2.ec2.archive.ubuntu.com:http: [IP: 54.253.131.141 80]
Err:4 http://security.ubuntu.com/ubuntu xenial-security InRelease
Cannot initiate the connection to security.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80]
Reading package lists...
W: Failed to fetch http://ap-southeast-2.ec2.archive.ubuntu.com/ubuntu/dists/xenial/InRelease Could not connect to ap-southeast-2.ec2.archive.ubuntu.com:80 (54.253.131.141), connection timed out [IP: 54.253.131.141 80]
W: Failed to fetch http://ap-southeast-2.ec2.archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease Unable to connect to ap-southeast-2.ec2.archive.ubuntu.com:http: [IP: 54.253.131.141 80]
W: Failed to fetch http://ap-southeast-2.ec2.archive.ubuntu.com/ubuntu/dists/xenial-backports/InRelease Unable to connect to ap-southeast-2.ec2.archive.ubuntu.com:http: [IP: 54.253.131.141 80]
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/xenial-security/InRelease Cannot initiate the connection to security.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.
这是由sudo apt-get update
我脚本顶部的命令引起的。随后,我的sudo apt-get -y install
命令中的多个包无法安装,从而导致我的应用程序无法运行。
奇怪的是,如果我sudo apt-get update
通过 SSH 运行,它会正常工作,没有任何错误,只有在 cloud-init 脚本中它不起作用。我的直觉是,也许在脚本执行时实例还没有连接到网络?如果是这种情况,我该如何解决这个问题?
编辑:我无法再重现此问题。我已将其添加到脚本顶部,以尝试防止问题再次发生:
until ping -c1 ap-southeast-2.ec2.archive.ubuntu.com &>/dev/null; do echo "waiting for networking to initialise"; done
但是 cloud-init-output.log 中没有显示“正在等待网络初始化”消息,因此这段代码似乎没有执行任何操作,问题可能是暂时的。如果有人知道导致此问题的原因以及缓解此问题的更可靠方法,请告诉我。
答案1
我搞清楚了问题所在,但感觉有点可笑。原来,实例需要公共 IP 才能访问 VPC 之外的服务器。我猜我假设会有某种 NAT 允许服务器在没有公共 IP 的情况下拨出,但现在我发现如果我想要这样做,我必须自己使用 NAT 网关进行设置。
这个问题难以解决的原因是,为了通过 SSH 进入并查看日志,我为实例分配了一个弹性 IP,这导致脚本成功执行。