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

Posted

技术标签:

【中文标题】运行 cron 作业 (Node.js) 时如何在 Amazon Elastic Beanstalk 中设置环境变量?【英文标题】:How to set environment variables in Amazon Elastic Beanstalk when running a cron job (Node.js)? 【发布时间】:2018-01-03 18:51:53 【问题描述】:

在 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】:

我在尝试在 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 分钟以用户“ec2-user”执行命令:'*/5 * * * * ec2-user' 加载 elasticbeanstalk 环境变量:'. /opt/elasticbeanstalk/support/envvars;'。 不打印任何输出:'> /dev/null 2>&1'。

还有:

.ebextensions/wp-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 环境来说是不一样的,但我很确定它们是相似的。

【讨论】:

如果它对任何人有帮助,我的 Node.js Amazon Linux 2 环境没有 envvars 文件。 get-config 是一种替代方案,但它还没有在 Amazon Linux 2 上。在这里可以找到对我有帮助的解决方法:github.com/awsdocs/elastic-beanstalk-samples/issues/…

以上是关于运行 cron 作业 (Node.js) 时如何在 Amazon Elastic Beanstalk 中设置环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

当代码在其他文件中时如何运行 Cron 作业 - Node JS

你怎么得到运行Node.js脚本的cron作业从.env文件中读取变量?

如何通过 cron 作业执行 Node.js 脚本?

如何在Node.js中管理Cron作业

在 Node.js 与 Cron 作业中设置间隔?

仅在机器空闲时运行 cron 作业(linux)