Некоторое время назад я написал небольшое приложение 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()
, это не так. Хотите знать, если кто-нибудь знает что-нибудь об этой ситуации?