【发布时间】: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