EC2_HOME 未设置。从 Cron 运行 AWS 命令

Posted

技术标签:

【中文标题】EC2_HOME 未设置。从 Cron 运行 AWS 命令【英文标题】:EC2_HOME is not set. Run AWS Commands from Cron 【发布时间】:2014-01-28 08:14:20 【问题描述】:

基本上,我不确定如何让我的 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

我在 EC2 Amazon 机器上,并且能够在 EC2 用户 shell 中运行 aws 命令。我只是无法让命令从 crontab 运行。

发送给 ec2 用户的邮件显示“/opt/aws/bin/ec2-start-instances: line 9: EC2_HOME: EC2_HOME is not set”

【问题讨论】:

【参考方案1】:

这应该对您有用...需要使用自动 cron git pull 脚本设置一些系统,然后执行调用 ec2 java 工具的 crontab/anacron run-parts bash 脚本。通常在 amz-linux-ami(他们的 RH 克隆)中,环境变量的创建过程如下:

(将坚持相关文件)

执行 shell 登录 --> 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 脚本将是(我个人加载从 git repo 生成的 key.conf 文件,并具有 git pull每小时触发一次,因此密钥和 env cat 会像脚本本身一样更新。然后作业脚本获取 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

干杯!

【讨论】:

哎呀,一定要导出这些变量:export AWS_ACCESS_KEY AWS_SECRET_KEY EC2_URL JAVA_HOME EC2_HOME EC2_URL PATH 如果你走源配置路径,最好不要在那里执行导出。 还要更改 /etc/crontab SHELL=/bin/bash 和 /etc/anacrontab SHELL=/bin/bash 中的 shell 我不信任 shebangs,尤其是当 cronie 参与其中时。【参考方案2】:

首先,您应该升级到新的 AWS CLI。

然后你可以把你的访问密钥和秘密密钥放到 ~/.aws/config 中,你不会有问题的。新工具支持多个配置文件,并且不依赖环境变量。

编辑:如果您的问题只是为从 cron 运行的作业设置环境,请查看:

Where can I set environment variables that crontab will use?

【讨论】:

我在 EC2 亚马逊机器上,并且能够在 EC2 用户 shell 中运行 aws 命令。我只是无法让命令从 crontab 运行。【参考方案3】:

我发现 this answer on the AWS Developer Forum 对我有用。只是复制到这里以便更容易获得:

您可以使用/opt/elasticbeanstalk/support/envvars 来设置常用的环境变量(RDS_HOSTNAME 等)。以下 cron 条目适用于我们:

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

【讨论】:

以上是关于EC2_HOME 未设置。从 Cron 运行 AWS 命令的主要内容,如果未能解决你的问题,请参考以下文章

centos 8利用crontab设置定时任务,crontab每秒运行

cron 作业未在 ubuntu 上的 docker 容器内运行

如何在 cPanel 上运行 CRON 作业?

仅在未运行时使用 cron 运行 python 脚本

如何运行 rake 任务,未使用 cron [重复]

Wordpress Cron作业未运行