Попытка запустить простой сценарий резервного копирования 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
Я добавил эту строку в файл конфигурации только после того, как начал видеть ошибку, думая, что это может исправить ее (хотя я почти уверен, что AWS выглядит по умолчанию именно так).
Сценарий оболочки выполняется от имени пользователя root. Я вижу файл конфигурации AWS в указанном месте. И мне все это хорошо (как я уже сказал, отлично работает вне CRON).
Когда вы запускаете задание из crontab, ваш $HOME
переменная окружения /
Клиент Amazon ищет либо
~/.aws/config
или
~/.aws/credentials
Если $HOME
знак равно /
, то клиент не найдет эти файлы
Чтобы он работал, обновите ваш скрипт, чтобы он экспортировал реальный домашний каталог для $HOME
export HOME=/root
а затем поместите файлы конфигурации или учетных данных в
/root/.aws/
Если он работает, когда вы запускаете его напрямую, но не из cron, вероятно, что-то другое в среде. Вы можете сохранить среду в интерактивном режиме, выполнив
set | sort > env.interactive
И сделайте то же самое в своем сценарии
set | sort > /tmp/env.cron
А потом diff /tmp/env.cron env.interactive
и посмотрим, что важно. Вещи как PATH
являются наиболее вероятными виновниками.
Мне удалось решить эту проблему с помощью последующий:
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
Бинарные файлы инструмента 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
Этот метод у меня сработал.
Эта строка по умолчанию .bashrc
файл для пользователя не позволит неинтерактивным оболочкам получить полную пользовательскую среду (включая переменную PATH):
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Закомментируйте строку, чтобы разрешить $HOME/.bashrc
для выполнения из неинтерактивного контекста.
Мне также пришлось добавить явный source
к моему сценарию оболочки, чтобы правильно настроить среду:
#!/bin/bash
source $HOME/.bashrc
Видеть этот ответ для дополнительной информации.
Все мы знаем, что переменная пути к среде $ PATH имеет расположение двоичных файлов. $ PATH Crontab может не иметь местоположения awscli.
Что вы можете сделать, так это найти путь к двоичному файлу awscli.
# which aws
/usr/local/bin/aws
и добавьте путь в $ PATH crontab, добавив строку ниже в начале вашего скрипта (после shebang).
PATH=$PATH:/usr/local/bin/
Это сработало для меня !!!
Я знаю, что это не идеальное решение, но оно сработало для меня:
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 при использовании awscli
инструмент, установленный через PIP, я обнаружил, что ничего не будет работать с этим инструментом с новыми версиями bash.
Я смог решить, установив aws-apitools-ec2
это может быть установлено
yum install -y aws-apitools-ec2
Я прилагаю его руководство для справки.
http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf
У меня была такая же проблема, но после удаления перенаправления stderr из моей записи cron (2>@1
), Я видел aws: command not found
в журнале.
Это связано с тем, что клиент AWS был установлен в домашней папке пользователя, и я добавил строку в свой пользовательский .bash_profile
чтобы добавить путь к AWS cli в $PATH
. Как ни странно, именно так Документация по установке AWS cli говорит вам установить его. Но пользователь .bash_profile
не используется при выполнении crontab пользователя (по крайней мере, не в моей среде).
Поэтому все, что я сделал, чтобы исправить это, - это убедиться, что в моем скрипте crontab также есть aws cli на своем пути. Итак, ниже шебанг моего сценария у меня теперь есть PATH=~/.local/bin:$PATH
.
Для меня это сработало:
#!/bin/bash
HOME=/home/ubuntu
AWS_CONFIG_FILE="/home/ubuntu/.aws/config"
aws ec2 describe-instances #or whatever command you need to use.
В современных экземплярах EC2 по умолчанию используется ubuntu, а корневой папкой - это домашняя папка пользователя. Вот где и существует aws cli.
Не лучший вариант, но мне пришлось предоставить конфигурацию непосредственно в моем сценарии оболочки / bash перед командами клиента AWS. лайк:
#!/bin/bash
export AWS_ACCESS_KEY_ID=<ZZZ>
export AWS_SECRET_ACCESS_KEY=<AAA>
export AWS_DEFAULT_REGION=<BBB>
aws s3 cp ....
Предполагая, что вы используете Ubuntu и пытаетесь добавить задание cron для пользователя root.
export HOME=/root
/usr/local/bin/aws s3 cp <from> <to>
.sudo mkdir /root/.aws
sudo cp ~/.aws/credentials /root/.aws/