EC2_HOME не установлен. Запускать команды AWS из Cron

По сути, я не уверен, как заставить мои команды aws запускаться в crontab. Я знаю, что должен дать crontab некоторые переменные окружения, чтобы он мог выполнять команды aws, но я не совсем знаю, как это сделать. Кто-нибудь мог сделать это раньше?

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/bin
* * * * * export EC2_HOME=/opt/aws/apitools/ec2
* * * * * export JAVA_HOME=/usr/lib/jvm/jre
0 8 * * 1-5 ec2-start-instances instance_id
0 7 * * 1-5 ec2-start-instances instance_id
0 7 * * 1-5 ec2-start-instances instance_id

Я нахожусь на машине Amazon EC2 и могу запускать команды aws в пользовательской оболочке EC2. У меня просто проблемы с запуском команд из crontab.

Письмо, отправленное пользователю ec2, гласит: "/opt/aws/bin/ec2-start-instances: строка 9: EC2_HOME: EC2_HOME не установлен"

3 ответа

Решение

Это должно работать для вас... Необходимо настроить несколько систем с автоматическими сценариями cron git pull, которые затем выполняли бы сценарии bash crontab / anacron run-parts, которые вызывали инструменты ec2 java. Обычно в amz-linux-ami (их клон RH) создание env vars происходит следующим образом:

(собираюсь придерживаться соответствующих файлов)

Сделать оболочку логин -> source /etc/profile который будет перебирать /etc/profile.d и source *.{users shell extension} в этом случае aws-apitools-common.sh

$cat aws-apitools-common.sh 
 export AWS_PATH=/opt/aws
 export PATH=$PATH:$AWS_PATH/bin
 #Prefer JDK if present (i pulled the condition to de-clutter this info)
 export JAVA_HOME=/usr/lib/jvm/java
 export JAVA_HOME=/usr/lib/jvm/jre

Вот соответствующая строка:

for aws_product in $(find /opt/aws/apitools /opt/aws/amitools -maxdepth 1 -type l 2>/dev/null); do
[ -e $aws_product/environment.sh ] && source $aws_product/environment.sh; done

Итак, сценарий aws-apitools-common.sh ищет apitools и amitools, а затем ищет эти инструменты $aws_product/environment.sh, например: source /opt/aws/apitools/ec2/environment.sh

Теперь это, вероятно, то, что вы ищете (/opt/aws/apitools/ec2/environment.sh):

$cat environment.sh
# Set EC2_HOME.  Called from /etc/profile.d/aws-product-common
[ -z "$EC2_HOME" ] && EC2_HOME="/opt/aws/apitools/ec2"
export EC2_HOME

Короче говоря, переменные среды, которые вы хотите установить / экспортировать в своем скрипте crontab, или ваши скрипты anacron run-parted будут (лично я загружаю файлы key.conf, которые генерируются из git-репо, и каждый раз запускаю git час, так что ключи и кошка env обновляются так же, как и сами сценарии. Затем сценарий задания получает файл conf):

AWS_ACCESS_KEY="blah-blah-dingle-smith"
AWS_SECRET_KEY="yankee-doodle-shit-no-stank"
JAVA_HOME="/usr/lib/jvm/java"
EC2_HOME="/opt/aws/apitools/ec2"
EC2_URL="https://us-west-2.ec2.amazonaws.com/"
PATH="$PATH:/opt/aws/bin"  # is dir contains a symlinks of tool binaries

Ура!

Во-первых, вам нужно перейти на новый интерфейс командной строки AWS.

Затем вы можете поместить свои ключи доступа и секретные ключи в ~/.aws/config, и у вас не будет проблем. Новые инструменты поддерживают несколько профилей и не зависят от переменных env.

Редактировать: Если ваша проблема просто установить env для заданий, запускаемых из cron, взгляните на:

Где я могу установить переменные окружения, которые будет использовать crontab?

Я нашел этот ответ на форуме разработчиков AWS, который работал на меня. Просто скопируйте его сюда, чтобы было легче добраться:

Вы можете источник /opt/elasticbeanstalk/support/envvars установить обычные переменные среды (RDS_HOSTNAME так далее). Следующая запись cron работает для нас:

30 2 * * * root . /opt/elasticbeanstalk/support/envvars && php /var/www/bin/some_command.php

Другие вопросы по тегам