AWS CodeDeploy 失败:部署失败,因为此位置已存在指定的文件

AWS CodeDeploy Fail: The deployment failed because a specified file already exists at this location

我正在尝试使用 Github 设置 AWS 代码部署以自动执行我的部署。我遇到的问题是 ec2 实例已经处于活动状态并且具有 Web 应用程序代码。问题是实例上还有其他我不希望在源代码管理下的内容。 代码部署失败并出现以下错误:

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

这是因为源代码在实例上,并没有作为修订添加。

所以我的问题是有什么方法可以让代码部署将实例上的当前文件识别为初始修订吗?

我在使用 EC2 实例的 CodeDeploy 中工作时遇到了同样的问题。

  • 我从 AWS CodeDeploy 部署组中删除了 EC2 实例。我向部署组添加了新的 EC2 实例。
  • 否则,将新部署组替换为现有部署组。

这是可能的!这是部署期间的一个选项:“内容选项: 当目标实例上的文件与应用程序修订中的文件同名且目标位置相同时,选择 AWS CodeDeploy 在部署期间采取的操作。"

您可以选择失败、覆盖和保留。保留可能是您的最佳选择。

您可以找到更多信息

您可以简单地删除 Web 根目录的全部内容并允许 CodeDeploy 对其进行更新。任何类型的部署都将替换全部内容。

如果您不确定,请将 webroot 复制到另一个文件夹,万一出现故障,您可以将其全部复制回来。

当磁盘上的文件被修改时,部署经常失败,我假设 CodeDeploy 正在检查文件的修改时间。

问题是 CodeDeploy 会维护一个清理文件,它会在每次部署后更新该文件。这些是它将在安装新文件之前删除的文件。您当然可以自己创建它,但这很难。 CodeDeploy 的目的是让事情变得简单。这就是我所做的(注意:我的应用程序有很多文件,我正要找到除 CodeDeploy 之外的其他东西,它实际上使过渡到它变得容易而不是痛苦和愚蠢,然后我制定了这种方法;如果你有一个小文件数量,创建 BeforeInstall 脚本或手动删除它们可能更容易):

  1. 创建一个 free-tier EC2 实例 (t2.micro)。如果您的应用程序很大,您可能需要更多磁盘 space,因此请根据需要进行调整。这不会是 运行 您的应用程序!

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

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

  4. 部署后,ssh进入ec2实例(记得在Security Group中允许SSH!)然后进入/opt/codedeploy-agent/deployment-root/deployment-instructions/

  5. 您将看到{deployment-group-identifier}-清理。将此 scp 到您实际想要 运行 您的应用程序的 ec2 实例。或者,将 FileZilla 放到您的主机上,然后放到主 ec2 实例上。这对我来说是最简单的选择,因为我的本地机器已经有了所有正确的密钥。

  6. SSH 进入主要的 ec2 实例,并将清理文件移至 /opt/codedeploy-agent/deployment-root/deployment-instructions/(如果尚不存在)。请注意失败的 {deployment-group-identifier} 并将清理文件的 {deployment-group-identifier} 替换为失败的标识符。

  7. 再运行部署。

8.????

  1. 利润。

我会在有时间的时候为每个步骤提供更多 in-depth 说明(8 和 9 除外......它们将消失)。

如果您只是想让错误消失,您可以使用早期的生命周期挂钩脚本之一(可能是 BeforeInstall)在源被重新添加到以后的挂钩中之前删除该文件夹。如果源代码没有在以后的 Hook 中重新添加,请自己添加。

我什至在新实例上也收到此错误,因此 CodeDeploy 必须以某种方式缓存该文件夹,然后因为这样做而感到不安。

这是我的样本appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/wordpress/
    overwrite: true
file_exists_behavior: OVERWRITE

这是Updated AWS User Guide for AppSpec 'files' section (EC2/On-Premises deployments only)。在那里你会找到三个选项,DISALLOW,OVERWRITE 和 RETAIN。