使用AWS Elastic Beanstalk定期执行Django的自定义命令

本文是关于En Dimension株式会社2022年圣诞日历活动的第13篇文章。

 

使用Django × AWS Elastic Beanstalk构建个人Web应用程序时,我尝试实现Django自定义命令的定期执行,但遇到了一些困难,所以我将其作为备忘录发布。

Django的定时执行自定义命令的实现

需要的事情

    1. 创建一个想要定期执行的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 文件。
虽然我还在学习中,但官方文档非常充实,希望能充分利用它。

有參考文獻

 

广告
将在 10 秒后关闭
bannerAds