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

bin*_*nic 34 shell bash cron amazon-web-services

尝试运行一个简单的 AWS CLI 备份脚本。它遍历包含文件中的行,将这些路径备份到 S3,并将输出转储到日志文件。当我直接运行此命令时,它运行没有任何错误。当我通过 CRON 运行它时,我的输出日志中出现“无法找到凭据”错误。

外壳脚本:

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
Run Code Online (Sandbox Code Playgroud)

我只是在开始看到错误后才将这一行添加到配置文件中,我认为这可能会解决它(尽管我很确定这是 AWS 默认的样子)。

Shell 脚本以 root 身份运行。我可以在指定位置看到 AWS 配置文件。我觉得这一切都很好(就像我说的,它在 CRON 之外运行良好)。

Gar*_*aid 41

当您从 crontab 运行作业时,您的$HOME环境变量是/

亚马逊客户寻找

~/.aws/config
Run Code Online (Sandbox Code Playgroud)

或者

~/.aws/credentials
Run Code Online (Sandbox Code Playgroud)

如果$HOME= /,则客户端将找不到这些文件

为了让它工作,更新你的脚本,以便它导出一个实际的主目录 $HOME

export HOME=/root
Run Code Online (Sandbox Code Playgroud)

然后将配置或凭据文件放入

/root/.aws/
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。 (4认同)

chi*_*cks 23

如果它在您直接运行而不是从 cron 运行时有效,则环境中可能有些不同。您可以通过执行以下操作以交互方式保存您的环境

set | sort > env.interactive
Run Code Online (Sandbox Code Playgroud)

在你的脚本中做同样的事情

set | sort > /tmp/env.cron
Run Code Online (Sandbox Code Playgroud)

然后diff /tmp/env.cron env.interactive看看什么是重要的。诸如此类PATH的事情最有可能是罪魁祸首。

  • 谢谢!能够自行解决问题的一步基本上是无价的。PATH 变量肯定存在一些差异,我认为在这种情况下,是 HOME 中的差异导致了问题。至于我的具体问题,我最终只是从用户的 cron 文件中运行它,而不是 /etc/crontab,它解决了我的所有问题。再次感谢! (4认同)

小智 6

我能够通过以下方式解决这个问题:

export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID=XXXX
export AWS_SECRET_ACCESS_KEY=YYYY
Run Code Online (Sandbox Code Playgroud)

  • 不要在脚本中存储 `AWS_ACCESS_KEY_ID` 和 `AWS_SECRET_ACCESS_KEY` 值。第一行应该已经提供了这些值。 (5认同)
  • 但是执行`aws configure` 的全部意义在于,您不必将凭据放入例如脚本中。请参阅@chicks 发布的答案以正确解决此问题。 (3认同)