【问题标题】:Issue running linux AWS CodeDeploy agent in non root context在非根上下文中运行 linux AWS CodeDeploy 代理的问题
【发布时间】:2026-02-02 09:35:01
【问题描述】:

我正在使用 AWS CodeDeploy 将代码部署到我们的 AWS Amazon Linux 实例。我按照这篇知识库文章https://aws.amazon.com/premiumsupport/knowledge-center/codedeploy-agent-non-root-profile/ 让代理在 ec2-user 上下文而不是 root 中执行

在进行更改之前,yml 文件中的脚本按预期执行(但我们需要脚本在非 root 上下文中执行)并设置 runas:appspec.yml 文件的一部分似乎没有执行脚本预期的 ec2-user 上下文

appspec.yml:

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/veddor/api
    owner: ec2-user
hooks:
    AfterInstall:
      - location: deploy/script/deploy-veddor-api.sh
        timeout: 300
        runas: ec2-user

由于进行了更改,现在会显示此错误,而不是执行 appspec 文件中指定的脚本

LifecycleEvent - AfterInstall
Script - deploy/script/deploy-veddor-api.sh
[stderr]Password: su: Authentication failure

deploy-veddor-api.sh 的内容

cp /home/ec2-user/veddor/api/deploy/config/Config-roddev.php /home/ec2-user/veddor/api/app/config/Config.php
cd /home/ec2-user/veddor/api
chmod +x ./composer.phar
php ./composer.phar install

我正在寻求帮助以弄清楚我需要做什么才能让脚本 deploy-veddor-api.sh 在 ec2-user 上下文中实际运行。

【问题讨论】:

    标签: linux amazon-ec2 aws-code-deploy


    【解决方案1】:

    如果您已将 codedeploy 配置为非 root,则从 appspec.yml 删除 runas 命令。保存并重试!

    【讨论】:

      【解决方案2】:

      如果您使用 SDK 触发 CodeDeploy,这里有一个参数:ignoreApplicationStopFailures: true

      见:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CodeDeploy.html#createDeployment-property

      【讨论】:

        【解决方案3】:

        您可能以非 root 用户身份运行 AWS CodeDeploy 代理。只有 root 能够在您的 AfterInstall 挂钩中拥有一个 runas 用户,因为没有其他用户帐户可以在没有密码验证的情况下运行替代用户“su”命令。

        在 AWS 的 appspec 用户指南中查看“runas”的详细信息:

        https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html

        runas 可选。运行脚本时要模拟的用户。经过 默认情况下,这是在实例上运行的 AWS CodeDeploy 代理。 AWS CodeDeploy 不存储密码,因此用户不能 如果 runas 用户需要密码,则进行模拟。此要素适用 仅适用于 Amazon Linux 和 Ubuntu Server 实例。

        如果您已经以 ec2-user 运行 CodeDeploy 代理,则无需在 AfterInstall 挂钩中提供 runas 元素。

        【讨论】:

        • 就是这样!更换代理后,我没想到要删除 runas。一旦我删除了 appspec 中的 runas 语句,它就会按预期工作。非常感谢,