如何正确地将AWS CodeDeploy与AutoScaling组集成?

时间:2017-12-20 20:10:51

标签: amazon-web-services deployment aws-code-deploy

我正在试图弄清楚当Auto Scaling组创建一个新实例时如何将我的应用程序部署到我的实例,但是部署似乎没有工作,我尝试的任何东西似乎都没有用

我创建了一个Auto Scaling组,允许我在需要时向上和向下扩展。

我已经设置了我的应用程序所需的相关安全组。我已经设置了启动配置。

我创建了一个链接到S3存储桶中必要应用程序文件的应用程序,并创建了一个链接到Auto Scaling组的应用程序部署组。

当我缩放ASG以手动创建新实例时,实例创建得很好。但是,没有代码或应用程序部署到计算机上,也没有写入与CodeDeploy相关的日志。

当我尝试手动部署应用程序时,即使我的实例上的运行状况显示为正常

,我也始终会收到The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems. (Error code: HEALTH_CONSTRAINTS)

我创建了两个IAM。代码部署IAM与部署组绑定,并且EC2 IAM绑定到每个已启动的实例,提供对CodeDeploy,EC2,S3的完全访问权。

CodeDeployIAM: enter image description here

EC2 IAM: enter image description here

问题

有谁知道我做错了什么以及如何让CodeDeploy正常运行?

我在我的实例上安装了CodeDeploy并将其保存为AMI供ASG使用,现在它进一步发展。 CodeDeploy下载文件,我可以在其中一个文件夹/opt/codedeploy-agent/deployment-root/sha/d-L39JDN5MM/deployment-archive/内看到它们。这些文件按预期正确下载到这里,但是它们没有使用appspec.yml放入正确的文件位置,并且AWS上的部署说由于健康限制而失败

编辑2

我想我已经弄清楚了我的问题。我的手动部署使用6cf236f11cd获取正确的etag,但我的自动调度部署使用过时的etag,这不再存在导致错误...我该如何解决?

在我看到的日志中 2017-12-20 21:58:08 ERROR [codedeploy-agent(3896)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile即使我的实例是以IAM角色开始的

编辑3

目前看来缺少的凭证不是问题。我的凭据文件包含正确的数据,并且实例是使用有效的IAM用户启动的。我可以手动部署到实例,然后一旦完成手动部署,它就会在每次扩展时获取它。

但是,当我的appspec.yml中有AfterInstall挂钩时,这不起作用...格式是否有问题?

version: 0.0 os: linux files: - source: / destination: /opt/lobby hooks: AfterInstall: - location: scripts/bootstrap.sh timeout: 180

编辑4:

发现问题是我的脚本由于

而未在最后执行
2017-12-21 11:30:39 ERROR [codedeploy-agent(1285)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Error during perform: InstanceAgent::Plugins::CodeDeployPlugin::ScriptError - Script does not exist at specified location: /opt/codedeploy-agent/deployment-root/d74ccd1f-a398-4b43-9ee8-f5468b63bd8d/d-4L3N2ETIO/deployment-archive/opt/scripts/lobby-bootstrap.sh - /opt/codedeploy-agent/lib/instance_agent/plugins/codedeploy/hook_executor.rb:118:in `block (2 levels) in execute'
/opt/codedeploy-agent/lib/instance_agent/plugins/codedeploy/hook_executor.rb:116:in `each'
/opt/codedeploy-agent/lib/instance_agent/plugins/codedeploy/hook_executor.rb:116:in `block in execute'
/opt/codedeploy-agent/lib/instance_agent/plugins/codedeploy/hook_executor.rb:198:in `create_script_log_file_if_needed'

我现在已将我的脚本嵌入到部署文件夹中,但是当该文件在linux中部署到计算机上时,它不可执行,因此无法运行。如何运行安装前安装命令以使该文件可执行?

2017-12-21 11:44:57 WARN  [codedeploy-agent(1285)]: InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: bootstrap.sh is not executable.  Trying to make it executable.

尝试阅读appspec.yml格式以添加权限,因为这似乎是目前的问题。

尝试设置权限时出现此错误。

2017-12-21 12:00:19 ERROR [codedeploy-agent(1285)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Error during perform: Psych::SyntaxError - (<unknown>): mapping values are not allowed in this context at line 5 column 17 - /usr/lib/ruby/2.3.0/psych.rb:377:in `parse'

编辑5:

我修复了我的appspec.yml文件,现在我的部署成功了!但是,应用程序未按预期启动。我有一个应该启动应用程序的脚本,但是在部署完成后它们没有运行。

这些脚本的输出在哪里(即echo语句,因为它们不在codedeploy日志中)

也许我的剧本根本没有运行。如果我的脚本文件以#!/bin/bash开头,那么我会收到错误

deployment-archive/./bootstrap.sh: /bin/bash^M: bad interpreter: No such file or directory\\n\"}"}

但是,如果我删除第一行,部署成功,但似乎脚本没有运行。这看起来像dos2unix问题。

编辑6:

在linux机器上编写我的bash / appspec文件并将其打包到我的应用程序后,部署挂起并在控制台中打印警告

WARN  [codedeploy-agent(1285)]: InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: bootstrap.sh is not executable.  Trying to make it executable.

由于“HEALTH_CONSTRAINTS”,最终超时并显示部署失败。此后的任何更多部署都不会向日志打印任何内容。完全不知所措。

有谁知道为什么CodeDeploy挂在实例上并卡在这一行上????

0 个答案:

没有答案