如何在运行cron作业(Node.js)时在Amazon Elastic Beanstalk中设置环境变量?

时间:2017-07-27 21:05:42

标签: amazon-web-services cron amazon elastic-beanstalk amazon-elastic-beanstalk

我在Elastic Beanstalk上部署环境时一直在配置cron作业。这项工作的目的是每30分钟运行一次并执行一个Node.js脚本,该脚本处理我们系统中的SMS计划;当计划准备就绪时,通过Twilio api发送SMS消息。

不幸的是,Node.js环境没有包含定义的环境变量的文件/opt/elasticbeanstalk/support/envvars (也许我错过了什么?)

要解决此问题,我将在Python中从/opt/elasticbeanstalk/bin/get-config加载环境变量,然后执行我的Node.js脚本。

一切都按预期工作所以希望这可以帮助处于相同情况的人;然而,我想知道是否有更好的方法来实现这一目标......愿意接受建议。

在我的.ebextensions文件夹中,我有cron的配置文件:

files:
    "/etc/cron.d/process-sms-schedules":
        mode: "000644"
        owner: root
        group: root
        content: |
            */30 * * * * root /usr/local/bin/process-sms-schedules.sh

    "/usr/local/bin/process-sms-schedules.sh":
        mode: "000755"
        owner: root
        group: root
        content: |
            #!/bin/bash

            # Execute script to process schedules
            python /var/app/current/process-sms-schedules.py > /var/log/process-sms-schedules.log

            exit 0

commands:
    remove_old_cron:
        command: "rm -f /etc/cron.d/*.bak"

以下是作为cron作业的一部分执行的Python脚本:

#!/usr/bin/env python

import os
import subprocess
from subprocess import Popen, PIPE, call
import simplejson as json

envData = json.loads(Popen(['/opt/elasticbeanstalk/bin/get-config', 'environment'], stdout = PIPE).communicate()[0])

for k, v in envData.iteritems():
    os.environ[k] = v

call(["babel-node", "/var/app/current/process-sms-schedules.js"])

提前感谢您的任何反馈。

参考

Cron Job Elastic Beanstalk

How to set environment variable in Amazon Elastic Beanstalk (Python)

1 个答案:

答案 0 :(得分:1)

尝试在Elastic Beanstalk环境中执行PHP文件时遇到此问题。特别是我试图执行wp-cron.php文件。

基本上你应该写一个这样的cron工作:

/etc/cron.d/wp-cronjob

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin
*/5 * * * * ec2-user . /opt/elasticbeanstalk/support/envvars; /usr/bin/php /var/www/html/wp-cron.php > /dev/null 2>&1

<强>解释

  • 每5分钟执行一次命令为用户&#34; ec2-user&#34;:&#39; * / 5 * * * * ec2-user&#39;
  • 加载elasticbeanstalk环境变量:&#39;。的/ opt / elasticbeanstalk /支持/ envvars中;&#39;
  • 不打印任何输出:&#39;&gt; / dev / null 2&gt;&amp; 1&#39;。

此外:

<强> .ebextensions /可湿性粉剂cronjob.txt

# Load paths
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin

# Every 5 minutes executes commands as user "ec2-user": '*/5 * * * * ec2-user'.
# Loads elasticbeanstalk environment variables: '. /opt/elasticbeanstalk/support/envvars;'.
# Do not print any output: '> /dev/null 2>&1'.
*/5 * * * * ec2-user . /opt/elasticbeanstalk/support/envvars; /usr/bin/php /var/www/html/wp-cron.php > /dev/null 2>&1

<强> .ebextensions / cronjob.config

container_commands:
  add_wp_cronjob:
    command: "cat .ebextensions/wp-cronjob.txt > /etc/cron.d/wp-cronjob && chmod 644 /etc/cron.d/wp-cronjob"
    leader_only: true

commands:
  remove_old_cron:
    command: "rm -f /etc/cron.d/*.bak"

对于Node.js环境可能不一样,但我很确定它们是相似的。