AWS CodeDeploy
User Guide (API Version 2014-10-06)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

解决实例问题

必须正确设置标签

使用 list-deployment-instances 命令确认已正确标记用于部署的实例。如果输出中缺少 Amazon EC2 实例,请使用 Amazon EC2 控制台确认已在实例上设置标签。有关更多信息,请参阅Amazon EC2 用户指南(适用于 Linux 实例) 中的在控制台中使用标签

注意

如果您标记一个实例并立即使用 AWS CodeDeploy 将一个应用程序部署到该实例,则该实例可能不会包含在部署中。这是因为 AWS CodeDeploy 可能要在几分钟后才能读取标签。建议您在标记实例和尝试对实例进行部署之间等待至少 5 分钟。

必须安装并在实例上运行 AWS CodeDeploy 代理

要验证 AWS CodeDeploy 代理是否已安装并在实例上运行,请参阅验证 AWS CodeDeploy 代理是否正在运行

要安装、卸载或重新安装 AWS CodeDeploy 代理,请参阅安装或重新安装 AWS CodeDeploy 代理

如果实例在部署期间终止,在最多 1 小时内部署不会失败。

AWS CodeDeploy 为每个部署生命周期事件提供 1 小时的时段来完成运行。这为长时间运行的脚本提供了足够的时间。

如果生命周期事件正在进行时发生阻止脚本完成运行的任何情况(例如,如果实例终止或 AWS CodeDeploy 代理关闭),部署状态可能需 1 小时后才显示为 Failed。即使脚本中指定的超时时段不到 1 小时,也会发生此情况。这是因为,当实例终止后,AWS CodeDeploy 代理将关闭,并且无法处理任何其他脚本。

不过,如果实例在生命周期事件之间或在第一个生命周期事件步骤开始之前终止,则超时将在 5 分钟后发生。

分析日志文件以调查针对实例的部署失败

如果部署中的实例具有 Succeeded 以外的任何状态,您可以查看部署日志文件数据来帮助确定问题。有关访问部署日志数据的信息,请参阅查看部署日志数据

如果 AWS CodeDeploy 日志文件被意外删除,请创建一个新的日志文件

如果您意外删除了实例的部署日志文件,AWS CodeDeploy 不会创建替代日志文件。要创建新的日志文件,请登录到实例,然后运行以下命令:

对于 Amazon Linux、Ubuntu Server 或 RHEL 实例,按此顺序运行这些命令(一次运行一个):

Copy
sudo service codedeploy-agent stop
Copy
sudo service codedeploy-agent

对于 Windows Server 实例

Copy
powershell.exe -Command Restart-Service -Name codedeployagent

将相同的文件部署或重新部署到相同的实例位置失败,出现错误“File already exists at location”

如果 AWS CodeDeploy 尝试将文件复制到指定位置中已存在的 Amazon EC2 实例,则该实例的部署将失败,并且您可能看到错误消息“File already exists at location location-name”。

当您尝试重新部署具有相同的名称和位置的文件时,如果指定应用程序名称和具有之前使用的相同基础部署组 ID 的部署组,则重新部署获得成功的可能性会更大。AWS CodeDeploy 使用基础部署组 ID 标识要在重新部署前删除的文件。

将新文件部署到实例上的相同位置或将相同的文件重新部署到实例上的相同位置可能会因以下原因而失败:

  • 您为将相同修订重新部署到同一实例的操作指定不同的应用程序名称。重新部署将失败,因为即使部署组名称相同,使用其他应用程序名称意味着将使用不同的基础部署组 ID。

  • 您已删除并重新创建应用程序的部署组,然后尝试将同一修订重新部署到该部署组。重新部署将失败,因为即使部署组名称相同,AWS CodeDeploy 也将引用不同的基础部署组 ID。

  • 您在 AWS CodeDeploy 中删除了某个应用程序和部署组,然后创建了与已删除的应用程序和部署组同名的应用程序和部署组。之后,您尝试重新将已部署到上一个部署组的修订部署到同名的新部署组。重新部署将失败,因为即使应用程序和部署组的名称相同,AWS CodeDeploy 仍将引用已删除的部署组的 ID。

  • 您已将一个修订部署到一个部署组,然后将对另一个部署组的同一修订部署到相同的实例。第二次部署将失败,因为 AWS CodeDeploy 将引用不同的基础部署组 ID。

  • 您已将一个修订部署到一个部署组,然后将对另一个部署组的其他修订部署到相同的实例。至少有一个文件具有相同名称且位于第二个部署组尝试部署的相同位置。第二次部署将失败,因为在第二次部署开始之前,AWS CodeDeploy 将不会删除现有文件。两个部署都将引用不同的部署组 ID。

  • 您在 AWS CodeDeploy 中部署了一个修订,但至少有一个文件具有相同名称且位于相同位置。部署将失败,因为默认情况下,在部署开始之前,AWS CodeDeploy 将不会删除现有文件。

要处理这些情况,请执行下列操作之一:

  • 从文件之前部署到的位置和实例中删除文件,然后尝试重新部署。

  • 在修订的 AppSpec 文件中,在 ApplicationStopBeforeInstall 部署生命周期事件中,指定一个自定义脚本以删除与您的修订即将安装的文件匹配的任何位置的文件。

  • 将文件部署或重新部署到不属于之前的部署的位置或实例。

  • 在您删除应用程序或部署组之前,部署一个包含未指定要复制到实例的文件的 AppSpec 文件的修订。对于该部署,指定使用您即将删除的基础应用程序和部署组的 ID 的应用程序名称和部署组名称。(您可以使用 get-deployment-group 命令检索部署组 ID。)AWS CodeDeploy 将使用该基础部署组 ID 和 AppSpec 文件来删除它在上一个成功部署中安装的所有文件。

排查“InvalidSignatureException – Signature expired: [time] is now earlier than [time]”部署错误

AWS CodeDeploy 需要准确的时间引用以便执行其操作。如果实例的日期和时间设置不正确,它们可能与部署请求的签名日期不匹配,从而导致 AWS CodeDeploy 拒绝请求。

要避免与不正确的时间设置相关的部署失败,请参阅以下主题: