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