How to set environment variables in Amazon Elastic

2019-07-15 02:49发布

问题:

I have been working on configuring a cron job while deploying an environment on Elastic Beanstalk. The purpose of the job is to run every 30 minutes and execute a Node.js script that processes SMS schedules in our system; when a schedule is ready, an SMS message is sent via the Twilio api.

Unfortunately, Node.js environments don't have the file /opt/elasticbeanstalk/support/envvars containing the environment variables defined (Maybe I am missing something?).

To work around this issue, I am loading the environment variables from /opt/elasticbeanstalk/bin/get-config in Python and then executing my Node.js script.

Everything is working as expected so hopefully this can help someone in the same situation; however, I am wondering if there is a better way to accomplish this... Open to suggestions.

In my .ebextensions folder I have the config file for the 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"

Here is the Python script that gets executed as part of the cron job:

#!/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"])

Thanks in advance for any feedback.

References

Cron Job Elastic Beanstalk

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

回答1:

I had this issue while trying to execute a PHP file inside an Elastic Beanstalk environment. In particular I was trying to execute wp-cron.php file.

Basically you should write a cron job like this:

/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

Explained:

  • 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'.

Also:

.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"

Maybe is not the same for a Node.js environment but I am pretty sure they are similar.