首页 > 解决方案 > 为什么 AWS Classic Load Balancer 实例已停止服务,但 Auto Scale 组显示在服务中且运行良好?

问题描述

我试图避免问这个问题,但是在挣扎了几个小时(或几天)并阅读了所有相关材料之后,我拼命转向 SO。

因此,我正在尝试使用(经典)负载均衡器和自动扩展组将我的节点/反应项目部署到 AWS。我得到了所有单独的部分工作。不知何故,负载均衡器中的实例总是显示 OutOfService,尽管这些实例是 Auto Scaling 组中的 InService 和 Healty。为什么会出现这种断线?

然后,我向其中一个实例添加了一个弹性 IP。我 ssh 到它,然后手动运行“npm start”。现在此实例在负载均衡器中显示 InService 和 Healthy。

在我看来,这不是安全组问题,而是启动脚本没有被执行。这是我的脚本:

#!/bin/bash
cd /home/ec2-user/projectname
npm start

为什么不?

一些更新:

我为这个平衡器启用了访问日志,我得到了很多(相同的)错误日志。这是其中之一:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>BC0FA4BB97BA1557</RequestId>
    <HostId>r3wBXZLxJkTzm/SqcQnxEO+f9DhbtCxTLcVAn1vmllj6Dwa0xlO2psP3eEKOiuvNWY/Yb+Gt4C0=</HostId>
</Error>

这对我找出问题所在不是很有帮助。更令人困惑的是,当手动启动并运行实例时,我也得到这种错误日志,并且 LB 中的实例状态是健康的。

什么被拒绝?健康检查器?谁是健康检查员?这是我在平衡器中的健康检查设置:

Ping Target   HTTP:3000/
Timeout     5 seconds
Interval    30 seconds
Unhealthy threshold     2
Healthy threshold   10

侦听器将 HTTP 80 作为负载平衡端口,将 3000 作为实例端口。

再次更新:

在我看来,问题的真正原因是启动脚本没有运行。我发现了一些有关此问题的建议,例如清除 /var/lib/cloud 文件夹或将#cloud-boothook 添加到启动脚本的顶部,但对我没有任何作用。

更新(3):

经过几天的努力,我无法让它正常工作,现在放弃了。然而,这是我学到的总结。

首先,我设法跟进了 Ryan Lewis 的 PluralSight 视频并让它按预期工作:使用负载平衡和自动扩展部署到 AWS。我的项目非常接近他的“pizza-luvrs”项目,只是我使用的是 React 前端和 MongoDB。但是,由于某种原因,我无法使其适用于我自己的项目。

我的目标是使用预先创建的 AMI(安装了节点、pm2 和我的项目)让负载均衡器与 Auto Scaling 组一起工作。使用下面的 pm2 启动脚本,我让服务器在 3000 端口运行。

#!/bin/bash
echo "starting xxx..."
# restart pm2 and thus node app on reboot
crontab -l | { cat; echo "@reboot sudo pm2 start /home/ec2-user/xxx/server.js -i 0"; } | crontab -
# start the server on port 3000
pm2 start /home/ec2-user/xxx/server.js -i 0
echo "xxx started."

但是,负载均衡器中的实例一直显示“OutOfService”,尽管 Auto Scaling 组中的实例始终显示 InService。最奇怪的是,在我附加一个弹性 IP(因为我的 Auto Scaling 实例是私有的)并通过 SSH 连接到该实例并且不做任何其他事情之后,它最终变成了 InService(并非总是如此)。然后我可以取消关联弹性 IP 并保持 InService 状态。听起来安全组可能是导致此问题的原因,因此我将其与“pizza-luvrs”项目进行了数千次比较,并确保它们具有完全相同的设置。它仍然适用于他的项目,但不适用于我的项目。

顺便说一句,在 AWS 实例视图中,选择一个实例,然后选择菜单“实例设置”>“获取系统日志”,您可以看到该实例是如何启动的。这就是我如何判断“用户数据”中的启动脚本是否被执行的方法。

标签: amazon-web-servicesaws-load-balancer

解决方案


您放入用户数据的内容在首次启动时执行一次,仅此而已。它用于在第一次启动时设置实例。在随后的启动中它不会运行。如果您想安排脚本在启动时运行,请查看如何在您使用的任何操作系统上执行此操作。

假设您运行某种形式的使用 systemd 的 Linux,这是最流行的选择,请看这里

您还可以在每次启动时执行用户数据,但这真的不值得麻烦。


推荐阅读