CodeDeploy 运行 过时的 appspec 文件?

CodeDeploy running outdated appspec file?

我是 AWS CodeDeploy 的新手,事实上,我只是在试验。

我正在尝试使用 CircleCI 2.0 和 AWS CodeDeploy 处理持续集成,这样当我将对我的 django 项目的更改推送到 github 中的开发时,它会在 CircleCI 中构建,然后将部署推送到 S3然后将更改部署到 EC2。

我在 CodeDeploy 中完成了所有配置,并且我从 github 中的一个人那里复制了 appspec,他将 CodeDeploy 与 Django/DRF 项目(例如我的)一起使用。唯一的区别是他在他的 EC2 实例中使用了另一个内核(我认为是 AWS linux)而我使用的是 ubuntu。所以我不得不在每个 hooks 部分的 runas 部分更改用户名。我第一次 运行 aws cli 中的 create-deployment 命令部署失败并显示此消息:

LifecycleEvent - ApplicationStop
Script - scripts/stop_application.sh
[stderr]No passwd entry for user 'ec2-user'

事实证明,我忘记更改 ApplicationStop 挂钩中的 runas 用户。然后我改变了它,再次进行了推送和创建部署,但错误仍然是一样的。我是否需要执行其他操作才能考虑应用规范中的更改,或者为什么会发生这种情况?

这里是 appspec.yml 文件:

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/taptop_web
permissions:
  - object: /home/ubuntu
    pattern: "**"
    owner: ubuntu
    group: ubuntu
hooks:
  BeforeInstall:
    - location: scripts/clean_instance.sh
      timeout: 6000
      runas: root
  AfterInstall:
    - location: scripts/install_os_dependencies.sh
      timeout: 6000
      runas: root
    - location: scripts/install_python_dependencies.sh
      timeout: 6000
      runas: ubuntu
    - location: scripts/migrate.sh
      timeout: 6000
      runas: ubuntu
  ApplicationStart:
    - location: scripts/start_application.sh
      timeout: 6000
      runas: ubuntu
  ApplicationStop:
    - location: scripts/stop_application.sh
      timeout: 6000
      runas: ubuntu

还有stop_application.sh

#!/usr/bin/env bash
cd /home/ubuntu/taptop_web
ps auxw | grep runserver | awk '{print }' | xargs kill

要解决您的问题,您唯一需要做的就是成功部署。它只是看起来好像没有更新,因为当您进行部署时,它将 运行 ApplicationStop 来自以前的修订版。这常常令人困惑,但它是这样工作的,因为只有一个修订版应该知道如何停止它自己的应用程序——如果停止命令在修订版之间发生变化,新的停止命令将不起作用。

话虽如此,客户的 ApplicationStop 脚本由于脚本中的问题而失败的情况并不少见,因此部署将在没有干预的情况下不断失败。如果您有问题,请按照 this guide 摆脱困境。