我试图避免问这个问题,但是在奋斗了几个小时(或几天)并阅读了所有相关材料之后,我拼命求助于SO。
因此,我正在尝试使用(经典)负载平衡器和自动扩展组将节点/反应项目部署到AWS。我得到了所有单独的作品。以某种方式,负载平衡器中的实例始终显示OutOfService,尽管这些实例是自动伸缩组中的InService和Healty。为什么断开连接?
然后,我向其中一个实例添加了一个弹性IP。我ssh'd到它,然后手动运行“ 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和我的项目)使负载平衡器与自动伸缩组一起工作。使用下面的启动脚本和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."
但是,尽管自动缩放组中的实例始终显示InService,但负载平衡器中的实例始终说“ OutOfService”。最奇怪的是,在我附加了一个弹性IP(因为我的自动伸缩实例是私有的)并通过SSH加密到该实例之后,并且不做其他任何事情,它最终变成了InService(并非总是如此)。然后,我可以取消关联弹性IP,并保持InService状态。听起来好像是安全组可能是导致此问题的原因,所以我将其与“ pizza-luvrs”项目进行了千次比较,并确保它们具有完全相同的设置。仍然适用于他的项目,但不适用于我的项目。
在AWS实例视图中,选择一个实例,然后选择菜单“实例设置”>“获取系统日志”,您可以看到实例的启动方式。这就是我如何确定“用户数据”中的启动脚本是否得到执行的方法。
答案 0 :(得分:0)
您在user data is executed once, on first boot中输入的内容就是这样。它旨在用于在实例首次启动时对其进行设置。在随后的启动中,它将无法运行。如果要安排脚本在启动时运行,请查看如何在所使用的任何操作系统上执行该脚本。
假设您运行的是使用systemd(这是最受欢迎的选择)的某种形式的Linux,请查看here
您也可以execute user data on every boot,但这确实不值得麻烦。