错误:由于太多的单个实例未能部署,因此整个部署失败。

12
我正在尝试使用CircleCI -> S3 -> CodeDeploy -> EC2进行部署。我已经成功从CircleCI上传了部署镜像到S3,但是无法将S3部署到EC2实例。以下是错误信息。

总体部署失败,因为太多个别实例未能完成部署、可用于部署的健康实例太少或者你的部署组中的某些实例遇到问题。(错误代码: HEALTH_CONSTRAINTS)

这个错误来自CodeDeploy。我无法找出原因和具体情况,希望您能给出一些建议。
9个回答

20

如果您正在使用Ubuntu操作系统,可能有很多原因导致问题,以下是检查清单可供验证:

检查是否已在您的EC2实例上安装了代码部署代理。请参考此文档进行代码部署代理的安装。https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html

$ sudo service codedeploy-agent status

如果你正在运行Ubuntu 20.x版本并遇到以下错误:

./install:22:in block in method_missing': undefined method path' for #<IO:> (NoMethodError)

请尝试通过以下脚本运行安装文件。

sudo ./install auto > /tmp/logfile
  1. 检查您是否拥有 EC2 实例代码部署角色 -> 创建一个代码部署角色并将其分配给实例,https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-service-role.html

如果在启动后分配 EC2 角色,请重启服务器。

  1. 按照置顶答案检查您的 appspec.yml 文件的放置位置,并尽量避免其中的任何长时间超时。

  2. 登录到您的实例并检查错误日志。

$ tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log


2
那个 tail 命令救了我,谢谢。 - d8aninja

4

6
在审查了 /var/log/aws/codedeploy-agent/codedeploy-agent.log 后,我注意到 IAM 服务角色出现了一些错误。但看起来已经正确配置了,CodeDeploy Full Access 已经存在于其中。有什么想法吗? - Noriaki Takamizawa
针对分配给您的EC2实例的角色,您需要配置其具有从S3中拉取权限:http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html。它不应该需要CodeDeploy完全访问权限。 - Josh McFarlane
谢谢。终于成功了。这是YAML格式的问题。我查看了一些CodeDeploy配置日志,并根据您的文档进行了修改。 - Noriaki Takamizawa
@NoriakiTakamizawa,你能分享一下你的解决方案吗? - Adnan
@Adnan 对不起,我写了我的解决方案。希望它有所帮助。 - Noriaki Takamizawa

4

这个错误通常是由于 appSpec.ymlappSpec.json 文件的配置问题引起的(取决于您使用的格式)。

如果您有任何 Hook,建议您将其删除,检查是否可以正常工作,然后逐个添加(Hook),这样您就可以识别错误。

appspec.yml 文件应位于项目的根目录中:

   │-- appspec.yml
   │-- index.html
   └-- scripts
       │-- install_dependencies
       │-- start_server
       └-- stop_server

scripts 文件夹中,您需要放置要根据 Hook 执行的进程。
这是appspec.yml文件的一个示例。
version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root

我希望我能帮助你。

2

确保在您的目标 EC2 实例中运行了 CodeDeploy Host Agent Service

enter image description here


1
你面临的错误是一个通用的错误消息,会在事件失败之前发生,包括beforeblockTraffic、blockTraffic、ApplicationStop等。

enter image description here

在这种情况下,第一步 将是检查代码部署代理是否正在运行,如果第一个事件即 BeforeBlockTraffic 事件失败。
正如您可以在下面的截图中看到的那样,事件失败消息将告诉您背后的确切错误。

enter image description here


0
请检查给予 EC2 机器(代理程序运行的地方)的角色。它应该具有 S3 访问权限。这解决了我的问题。

0
检查Code Deploy代理的状态。在我的情况下,代理没有开启。

1
之前的答案副本。 - james.garriss

0

根据失败的部署,我可以看到所有的生命周期事件都被跳过了。实例i-0bcc36e73851297f2当前处于停止状态,但是我发现IAM实例配置文件丢失了。您的Amazon EC2实例需要访问存储AWS CodeDeploy将要部署的应用程序的Amazon S3存储桶或GitHub仓库的权限。为了启动与AWS CodeDeploy兼容的Amazon EC2实例,您必须创建一个额外的IAM角色,即实例配置文件。 1

对于此类故障,您可以始终使用一般的故障排除检查清单来解决失败的部署2,然后寻找有关部署问题和实例问题的故障排除指南3

1[http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html]1

2 [http://docs.aws.amazon.com/codedeploy/latest/userguide/troubleshooting-general.html]2

3 [http://docs.aws.amazon.com/codedeploy/latest/userguide/troubleshooting.html]3


程序相关内容,返回翻译文本。

-1

"CodeDeploy代理在解压缩的修订目录中未找到AppSpec文件,相对路径为'appspec.yml'"

请将您的appspec.yml文件放置在根目录中以解决此错误

要访问您的after脚本和before脚本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接