AWS CodeDeploy失败:部署失败,因为指定位置已经存在一个文件。

25

我正在尝试使用Github设置AWS CodeDeploy以自动化我的部署。我遇到的问题是EC2实例已经处于活动状态并且具有Web应用程序代码。问题是实例上还有其他内容,我不想在源代码控制下进行管理。
CodeDeploy失败并显示以下错误:

The deployment failed because a specified file already exists at this location

这是因为源代码在实例上,并没有作为版本进行添加。

我的问题是,有没有办法让代码部署将实例上的当前文件识别为初始版本?

6个回答

31

这是可以实现的!在部署期间,您可以选择在目标实例上存在与应用程序版本中同一位置的文件时,AWS CodeDeploy 在部署期间采取的操作:"内容选项"。

您可以选择失败、覆盖和保留。在您的情况下,保留可能是最好的选择。

您可以找到更多信息:


3
如果使用CodePipeline,您不能在部署操作中设置此选项。但是,由于5月份的最新更新,现在您可以在appspec.yml中使用file_exists_behavior: OVERWRITE来强制执行此行为,具体请参阅https://github.com/aws/aws-codedeploy-agent/issues/14。 - Daryl Teo

13

2

您可以简单地删除网站根目录下的全部内容,然后允许 CodeDeploy 进行更新。任何类型的部署都将替换整个内容。

如果您感到不确定,那么请将 webroot 复制到另一个文件夹中,在极少数情况下出现失败的情况下,您可以将其全部复制回来。

当磁盘上的文件被修改时,往往会导致部署失败,我想 CodeDeploy 正在检查文件的修改时间。


2
如果你只是想让错误消失,你可以使用早期的生命周期钩子脚本(可能是BeforeInstall)来在后续的钩子中重新添加源代码之前删除该文件夹。如果源代码没有在后续的钩子中被重新添加,请自行添加。
即使在新实例上,我仍然会遇到这个错误,所以CodeDeploy一定以某种方式缓存了该文件夹,然后因此而感到不安。

1
问题在于CodeDeploy维护一个清理文件,每次部署后都会更新。这些是它将在安装新文件之前删除的文件。当然,您可以自己创建此文件,但这很困难。CodeDeploy的重点是使事情变得简单。这就是我所做的(注意:我的应用程序有很多文件,我即将找到其他比CodeDeploy更容易过渡的东西,而不是痛苦和愚蠢,然后我制定了这种方法;如果您只有少量文件,则可能更容易创建BeforeInstall脚本或手动删除它们):
  1. 创建一个免费的 EC2 实例 (t2.micro)。如果您的应用程序很大,可能需要更多的磁盘空间,请根据需要进行调整。这不会运行您的应用程序!

  2. 创建一个新的部署组,指向该新实例。

  3. 创建一个新的 YAML 文件,实际上不执行任何 BeforeInstall 或 AfterInstall 任务。您不是在尝试运行您的应用程序。您只是在移动文件。这样您就可以获取清理文件。

  4. 部署后,ssh 进入 EC2 实例 (记得在安全组中允许 SSH!),并进入 /opt/codedeploy-agent/deployment-root/deployment-instructions/ 目录。

  5. 您将看到 {deployment-group-identifier}-cleanup。将其复制到您实际想要运行应用程序的 EC2 实例上。或者,使用 FileZilla 将其传输到您的主机上,然后再传输到主要的 EC2 实例上。对我来说,这是最简单的选择,因为我的本地计算机已经拥有了所有正确的密钥。

  6. SSH 进入主要的 EC2 实例,并将清理文件移动到 /opt/codedeploy-agent/deployment-root/deployment-instructions/,如果它还没有在那里。注意失败的 {deployment-group-identifier},并将清理文件的 {deployment-group-identifier} 替换为失败的标识符。

  7. 重新运行部署。

8.???

  1. 利润。

我会在有时间的时候为每个步骤提供更深入的说明(除了第8和第9步...它们将消失)。


0

在使用 CodeDeploy 和 EC2 实例时,我遇到了同样的问题。

  • 我将 EC2 实例从 AWS CodeDeploy 部署组中移除,并将新的 EC2 实例添加到部署组中。
  • 或者,用现有的部署组替换新的部署组。

我不确定这是否是相同的问题。在一个没有预先存在代码的新实例上它可以工作,但当存储库中的代码已经手动添加到实例时,就会出现错误。 - Lonergan6275

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