使用AWS Elastic Beanstalk定期执行Django的自定义命令
本文是关于En Dimension株式会社2022年圣诞日历活动的第13篇文章。
使用Django × AWS Elastic Beanstalk构建个人Web应用程序时,我尝试实现Django自定义命令的定期执行,但遇到了一些困难,所以我将其作为备忘录发布。
Django的定时执行自定义命令的实现
需要的事情
-
- 创建一个想要定期执行的Django自定义命令
- 创建一个cron.config文件
生成Django自定义命令
创建一个希望定期执行的Django自定义命令。
从Web API获取信息,并实现更新数据库数据的处理(从实际代码中进行了简化)。
import os
import requests
from django.core.management.base import BaseCommand
from django.utils import timezone
from main.models import Team,Match
from django import setup
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Sampleproject.settings')
setup()
class Command(BaseCommand):
help = 'Update data from webapi'
def handle(self, *args, **options):
leagues = League.objects.all()
league_codes = [league.code for league in leagues]
for league_code in league_codes:
self.update_standing(league_code)
self.update_match(league_code)
def get_dict_from_api(self, url):
# webapiへリクエスト、レスポンスデータの加工など
return data
def update_match(self, league_code):
target_url = 'webapi_url'
input_dict = self.get_dict_from_api(target_url)
for match_info in input_dict['matches']:
# updateしたいオブジェクトをDBからselect
match = Match.objects.get(match_day=match_info['matchday'],
# ...
# 中略(データの更新処理など)
# ...
match.save()
配置config文件
在.ebextensions目录下创建一个config文件。在这里,
-
- 環境変数の設定、Djangoカスタムコマンドを実行するシェルスクリプトの作成
-
- Cronの設定ファイルの作成
-
- クリーンアップ
- を行っています。
files:
# シェルスクリプトの作成
/usr/local/bin/update_data_script.sh:
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
source /var/app/venv/staging-LQM1lest/bin/activate
cd /var/app/current
# DB接続情報を環境変数へセッティング
RDS_USERNAME=`/opt/elasticbeanstalk/bin/get-config environment -k RDS_USERNAME`
export RDS_USERNAME
RDS_PASSWORD=`/opt/elasticbeanstalk/bin/get-config environment -k RDS_PASSWORD`
export RDS_PASSWORD
RDS_HOSTNAME=`/opt/elasticbeanstalk/bin/get-config environment -k RDS_HOSTNAME`
export RDS_HOSTNAME
RDS_PORT=`/opt/elasticbeanstalk/bin/get-config environment -k RDS_PORT`
export RDS_PORT
RDS_DB_NAME=`/opt/elasticbeanstalk/bin/get-config environment -k RDS_DB_NAME`
export RDS_DB_NAME
# Djangoコマンドの実行
python manage.py update_data
# cronの設定
/etc/cron.d/update_data_cron:
mode: "000644"
owner: root
group: root
# UTC22:30に定時実行(日本時間7:30)
content: |
30 22 * * * root /usr/local/bin/update_data_script.sh
# クリーンアップ
commands:
rm_old_cron:
command: "rm -fr /etc/cron.d/*.bak"
ignoreErrors: true
注意事项
如果要执行涉及对RDS访问的自定义命令,则需要将RDS连接信息放入命令执行环境的环境变量中。
在ElasticBeanstalk中,可以使用get-config命令获取RDS连接信息,并将其设置为环境变量中的连接信息。
我误以为它会自动进行设置,结果卡住了。
所感
觉得
AWS Elastic Beanstalk 是一项方便的服务,可以自动设置 EC2、VPC、RDS 等功能,但要设置其他扩展性功能,需要配置各种 config 文件。
虽然我还在学习中,但官方文档非常充实,希望能充分利用它。
有參考文獻