我正在使用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用户上下文
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用户环境中运行。
答案 0 :(得分:0)
您可能以非root用户身份运行AWS CodeDeploy代理。只有root才能在AfterInstall
挂钩中拥有ec2-user
用户,因为没有其他用户帐户可以在没有密码身份验证的情况下运行替代用户“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实例。
如果您已经以runas
运行CodeDeploy代理,则无需在AfterInstall
挂钩中提供 let now = Date()
let cal = Calendar.current
var start = cal.startOfDay(for: Date())
let inYesterday = cal.date(byAdding: .day, value: -5, to: now)!
start = cal.startOfDay(for: inYesterday)
var end = cal.startOfDay(for: Date())
let inTomorrow = cal.date(byAdding: .day, value: 1, to: now)!
end = cal.startOfDay(for: inTomorrow)
元素。
答案 1 :(得分:0)
如果您使用SDK触发CodeDeploy,请使用以下参数:services:
- xvfb
请参阅:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CodeDeploy.html#createDeployment-property
答案 2 :(得分:0)
如果您已将 codedeploy 配置为非 root,则从 appspec.yml 中删除 runas
命令。保存并重试!