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

尝试运行简单的AWS CLI备份脚本。 它通过包含文件中的行循环,将这些path备份到S3,并将输出转储到日志文件。 当我直接运行这个命令时,它运行没有任何错误。 当我通过CRON运行时,在输出日志中出现“Unable to locate credentials”错误。

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 

我开始看到这个错误之后,我只添加了行到configuration文件,认为这可能会解决它(即使我非常确定这是AWS默认情况下)。

Shell脚本以root身份运行。 我可以在指定的位置看到AWSconfiguration文件。 而且这一切对我来说都很好(就像我说的,它在CRON以外运行良好)。

如果它直接运行而不是从cron运行,那么环境中可能有不同的东西。 你可以通过交互来保存你的环境

 set | sort > env.interactive 

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

 set | sort > /tmp/env.cron 

然后diff /tmp/env.cron env.interactive ,看看有什么关系。 像PATH这样的事情是最有可能的罪魁祸首。

当你从crontab运行一个作业时,你的$HOME环境variables是/

亚马逊客户也在寻找

 ~/.aws/config 

要么

 ~/.aws/credentials 

如果$HOME = / ,那么客户端将不会find这些文件

要使其工作,请更新您的脚本,以便为$HOME导出实际的主目录

 export HOME=/root 

然后放置一个configuration或凭证文件

 /root/.aws/ 

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

 export AWS_CONFIG_FILE="/root/.aws/config" export AWS_ACCESS_KEY_ID=XXXX export AWS_SECRET_ACCESS_KEY=YYYY 

把这个代码放在你的命令行之前,执行到crontab -e

 SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 

用户的默认.bashrc文件中的这一行将阻止非交互式shell获取完整的用户环境(包括PATHvariables):

 # If not running interactively, don't do anything [ -z "$PS1" ] && return 

将该行注释掉以允许从非交互式上下文执行$HOME/.bashrc

我还必须添加一个显式的source命令到我的shell脚本来正确设置环境:

 #!/bin/bash source $HOME/.bashrc 

看到这个答案的其他信息。

aws cli工具的二进制文件安装在/usr/local/bin/aws

我遇到的错误是,cron用户在运行时无法访问/usr/local/bin/aws ; 它只能访问/usr/bin/

我所做的是用下面的命令在/usr/bin为aws创build一个链接。

 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 

这种方法为我工作。

我知道这不是一个完美的解决scheme,但对我来说,

 export HOME=/home/user export AWS_CONFIG_FILE="/home/user/.aws/config" export AWS_ACCESS_KEY_ID=XXX export AWS_SECRET_ACCESS_KEY=XXX 

只是添加一些附加价值,我有新的bash版本的问题,同时使用通过PIP安装的awscli工具,我发现没有什么可以使用这个工具与新的bash版本。

我能够通过安装aws-apitools-ec2来解决这个问题

 yum install -y aws-apitools-ec2 

我附上其指南以供参考。

http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf