CodeDeploy运行过时的appspec文件?

5
我是AWS CodeDeploy的新手,实际上,我只是在试验。
我正在尝试使用CircleCI 2.0和AWS CodeDeploy处理持续集成,以便当我将更改推送到github中的开发环境时,它会在CircleCI中进行构建,然后将部署推送到S3,之后将更改部署到EC2。
我在CodeDeploy中进行了所有配置,并从github上的一个人那里复制了appspec,他使用Django/DRF项目(与我的类似)使用CodeDeploy。唯一的区别是他在EC2实例中使用另一个内核(我认为是AWS Linux),而我正在使用ubuntu。因此,我必须更改每个钩子部分中runas部分中的用户名。当我第一次在aws cli中运行create-deployment命令时,部署失败,并显示以下消息:
LifecycleEvent - ApplicationStop
Script - scripts/stop_application.sh
[stderr]No passwd entry for user 'ec2-user'

事实证明,我忘记在 ApplicationStop 钩子中更改 runas 用户。然后我进行了更改,执行了 push 和 create-deployment,但错误仍然相同。我需要做些其他的事情才能考虑 appspec 中的更改,或者为什么会发生这种情况?

这是 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 $2}' | xargs kill
1个回答

11
你需要做的唯一一件事就是成功部署来解决你的问题。当你进行部署时,看起来好像没有更新,但实际上它会从之前的版本中运行ApplicationStop。虽然这经常让人困惑,但它的工作方式是只有一个版本应该知道如何停止自己的应用程序 - 如果停止命令在版本之间发生了变化,那么新的停止命令就不会起作用。
话虽如此,客户端由于脚本问题导致ApplicationStop脚本失败,这不是一个罕见的问题,因此在没有干预的情况下,部署将继续失败。如果你遇到了这个问题,请按照这个指南来解决。

谢谢!那是一段时间之前的事了。我通过删除应用程序并使用新的appspec创建另一个应用程序来解决它。但是你的解决方案似乎更好(我的不是真正的解决方案,而是一种变通方法)。我会尝试一下。 - Adolfo Esparza

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