AWS Elasticbeanstalk(EB)でdjango manage.py
タスクをcron経由で実行しようとしています。ファイルへのAWS環境変数の保存方法 - & '
*/10 * * * * root /usr/local/bin/notification_cron.sh > /dev/null
notification_cron.sh
スクリプトはジャンゴmanage.py
タスクを呼び出します。
Djangoには、EBの環境変数(RDS_PORT、RDS_DB_NAME、RDS_PASSWORDなど)が必要です。ですから、これらの環境変数をデプロイ時にファイルに保存し、それらをmanage.pyタスクを呼び出すbashスクリプトに再ロードします。
これは.ebextensions
で私の展開の設定の一部です:
commands:
001_envvars_to_bash_source_file:
command: |
# source our elastic beanstalk environment variables
/opt/elasticbeanstalk/bin/get-config --output YAML environment|perl -ne "/^\w/ or next; s/: /=/; print qq|\$_|" > /usr/local/bin/envvars
chmod 755 /usr/local/bin/envvars
files:
"/usr/local/bin/notification_cron.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
AWS_CONFIG_FILE="/home/ec2-user/.aws/config"
set -o allexport
# Loading environment data
source /usr/local/bin/envvars
set +o allexport
cd /opt/python/current/app/
source /opt/python/run/venv/bin/activate
python manage.py my_management_task
問題が
/opt/elasticbeanstalk/bin/get-config --output YAML environment|perl -ne "/^\w/ or next; s/: /=/; print qq|\$_|" > /usr/local/bin/envvars
または代替同等
/opt/elasticbeanstalk/bin/get-config environment --output yaml | sed -n '1!p' | sed -e 's/^\(.*\): /\1=/g' > /usr/local/bin/envvars
内容のをsedの行によって引き起こされます/usr/local/bin/envvars
は常に引用符で囲まれているわけではありません:
PYTHONPATH="/opt/python/current/app/mydjangoapp:$PYTHONPATH"
DJANGO_SETTINGS_MODULE=mydjangoapp.settings
AWS_ACTIVE='true'
RDS_PORT='5432'
RDS_HOSTNAME=hostname.host.us-east-1.rds.amazonaws.com
RDS_USERNAME=master
RDS_DB_NAME=ebdb
RDS_PASSWORD=My&Password
これは、環境変数が "&"という文字を持つ場合に問題を引き起こします。
'RDS_PASSWORD': My&Password
I source /usr/local/bin/envvars
は、Djangoのmanage.pyを呼び出す前に戻って私のスクリプトにインポートするとき、bashは「&」の文字でこれを分割します。
Phew。私の質問は:
どのように私はRDS_PORT='5432'
のような他の線を壊すことなく(必要な二重引用符に注意してください)/usr/local/bin/envvars
ファイルにRDS_PASSWORD="My&Password"
を得るのですか?あなたは以下のような何かを行うことができますGNU sed
を使用
のですか? – Inian
envvarsファイルは、AWSのget-config(YAMLの環境変数をダンプする)を使用して配備中に自動的に作成され、with =と置き換えてファイルに配管します。それはPYTHONPATHを二重引用符で囲み、一重引用符RDS_PORTを引用し、RDS_PASSWORDを引用符で囲まない。すでに引用符で囲まれた変数を二重引用符で囲まずに、すべてを引用符で囲むか、RDS_PASSWORDだけを二重引用符で囲みますか? – Pranab
私がこれを尋ねた理由は、これに対してどのように解決策が期待されますか?別のスクリプトを手動で実行するか、他のスクリプトと組み合わせるか? – Inian