尝试运行一个简单的 AWS CLI 备份脚本。它循环遍历包含文件中的行,将这些路径备份到 S3,并将输出转储到日志文件。当我直接运行此命令时,它运行没有任何错误。当我通过 CRON 运行它时,我的输出日志中出现“无法找到凭证”错误。
shell脚本:
AWS_CONFIG_FILE="~/.aws/config"
while read p; do
/usr/local/bin/aws s3 cp $p s3://PATH/TO/BUCKET --recursive >> /PATH/TO/LOG 2>&1
done </PATH/TO/INCLUDE/include.txt
在我开始看到错误后,我只将该行添加到配置文件中,认为这可能会修复它(即使我很确定那是 AWS 默认查找的位置)。
Shell 脚本以 root 身份运行。我可以在指定位置看到 AWS 配置文件。在我看来,一切看起来都很好(就像我说的,它在 CRON 之外运行良好)。
答案1
如果直接运行它时可以正常工作,但从 cron 运行它时却不行,则可能是环境中存在一些差异。您可以通过以下方式以交互方式保存环境:
set | sort > env.interactive
并在脚本中执行同样的事情
set | sort > /tmp/env.cron
然后diff /tmp/env.cron env.interactive
看看什么是重要的。诸如此类的事情PATH
是最有可能的罪魁祸首。
答案2
当你从 crontab 运行作业时,你的$HOME
环境变量是/
亚马逊客户寻找
~/.aws/config
或者
~/.aws/credentials
如果$HOME
= /
,则客户端将找不到这些文件
为了使其工作,请更新您的脚本,以便它导出实际的主目录$HOME
export HOME=/root
然后将配置或凭证文件放入
/root/.aws/
答案3
我能够通过以下方式解决这个问题下列:
export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID=XXXX
export AWS_SECRET_ACCESS_KEY=YYYY
答案4
aws cli 工具的二进制文件安装在 下/usr/local/bin/aws
。
我遇到的错误是 cron 用户/usr/local/bin/aws
在运行时无法访问;它只能访问/usr/bin/
/usr/bin
我所做的是使用以下命令为 aws创建一个链接。
root@gateway:~# ln -s /usr/local/bin/aws /usr/bin/aws
我还在脚本中添加了一些更改;这是一个示例函数:
starter () {
echo "
==================================================
Starting Instance
==================================================
"
/usr/bin/aws ec2 start-instances --instance-ids $instance --region us-east-1
sleep 30
echo "Assigning IP Address "
/usr/bin/aws ec2 associate-address --instance-id $instance --region us-east-1 --public-ip XX.XX.XX.XX
}
以及 cron 条目:
30 5 * * * sh /usr/local/cron/magentocron.sh
这个方法对我很有效。