【问题标题】:APscheduler job not firing when run in Flask on AWS Lambda在 AWS Lambda 上的 Flask 中运行时,APscheduler 作业未触发
【发布时间】:2020-03-14 22:28:10
【问题描述】:

不久前,我编写了一个小型 Flask 应用程序(通过无服务器部署为 AWS lambda),通过 Slack 斜杠命令进行一些动态 DynamoDB 更新。一位同事建议添加一个组件,以便可以提前安排更新。

我使用 APscheduler 查找并向应用程序添加了一个新组件。在下面的简短示例中,Slack 斜杠命令会向应用的“/scheduler”端点发送 POST 请求:

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()

我在本地进行了测试,一切正常——我可以安排作业并且它们会准时运行;用于检查计划作业和删除计划作业的其他应用程序端点 [上面未显示] 也按预期工作。

但是,一旦我启动了运行 Flask 应用程序的 AWS lambda,调度程序就不会真正为这些作业运行 pass_through() 函数。当然,作业被添加了——我也可以在作业列表中看到它并将其从计划中删除——但是当 lambda 实际运行 pass_through() 时,它没有。想知道有没有人知道这种情况?

【问题讨论】:

    标签: amazon-web-services flask aws-lambda aws-serverless apscheduler


    【解决方案1】:

    Lambda 执行将在您返回值后立即停止,因此即使您在此处安排作业:

    sched.add_job(pass_through, "date", run_date=incoming["run_date"],
                      id=incoming["id_0"], args=[incoming])
        return "success", 200
    

    lambda 执行将停止,作业将不再运行。

    如果您需要安排作业,您可能需要另一个不是 lambda 的解决方案,但是您可以使用 cloudwatch 来按时触发您的 lambda:https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      相关资源
      最近更新 更多