Назад | Перейти на главную страницу

Не удается запустить AWS CLI из CRON (учетные данные)

Попытка запустить простой сценарий резервного копирования 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.

  1. Добавьте это в начало сценария оболочки export HOME=/root
  2. Убедитесь, что при использовании любой команды aws в своем сценарии вы используете полный путь, т.е. /usr/local/bin/aws s3 cp <from> <to>.
  3. sudo mkdir /root/.aws
  4. sudo cp ~/.aws/credentials /root/.aws/