Задание APscheduler не запускается при запуске в Flask на AWS Lambda - PullRequest
0 голосов
/ 15 марта 2020

Некоторое время назад я написал небольшое приложение Flask (развернутое как лямбда AWS через Serverless) для выполнения некоторых динамических обновлений DynamoDB с помощью команд Slack sla sh. Коллега предложил добавить компонент, чтобы обновления могли быть запланированы заранее.

Я посмотрел с помощью APscheduler и добавил новый компонент в приложение. В следующем сокращенном примере команда Slack sla sh будет отправлять POST-запрос конечной точке приложения "/ scheduler":

from flask import Flask, request
from apscheduler.schedulers.background import BackgroundScheduler
from pytz import timezone
[etc...]


app = Flask(__name__)
city = timezone([my timezone])
sched = BackgroundScheduler(timezone=city)
sched.start()


def success_webhook(markdown):
    webhook_url = os.environ["webhook_url"]
    data = json.dumps({"text": {"type": "mrkdwn", "text": markdown}})
    headers = {"Content-Type": "application/json"}
    r.post(webhook_url, data=data, headers=headers)


def pass_through(package):
    db = boto3.resource(
        "dynamodb",
        region_name=os.environ["region_name"],
        aws_access_key_id=os.environ["aws_access_key_id"],
        aws_secret_access_key=os.environ["aws_secret_access_key"],
    )
    table = db.Table(table_name)
    update_action = table.update_item(
                Key={"id": "[key]"},
                UpdateExpression="SET someValue = :val1",
                ExpressionAttributeValues={":val1": package["text"]},
            )
    if update_action["ResponseMetadata"]["HTTPStatusCode"] == 200:
        success_webhook("success")


@app.route("/scheduler", methods=["POST"])
def scheduler():
    incoming = (request.values).to_dict()
    sched.add_job(pass_through, "date", run_date=incoming["run_date"],
                  id=incoming["id_0"], args=[incoming])
    return "success", 200


if __name__ == "__main__":
    app.run()

Я тестировал локально, и все работало нормально - я мог планировать задания и они бегут вовремя; другие конечные точки приложения для проверки запланированных заданий и удаления запланированных заданий [не показано выше] также работали, как и ожидалось.

Но как только я запускаю AWS лямбду, запускающую приложение Flask, планировщик фактически никогда не запускает pass_through() функция для рабочих мест. Конечно, задание добавляется - я также вижу его в списке заданий и удаляю его из расписания - но когда наступает время для запуска лямбды pass_through(), это не так. Хотите знать, если кто-нибудь знает что-нибудь об этой ситуации?

...