无法从 CRON 运行 AWS CLI(凭证)

无法从 CRON 运行 AWS CLI(凭证)

尝试运行一个简单的 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

这个方法对我很有效。

相关内容