如何在Lambda启动任务中设置间隔。

huangapple go评论132阅读模式
英文:

how to set interval in lambda start job

问题

我有一个Lambda函数,用于停止一个运行中的作业并启动一个不同的Glue作业。它的代码如下:

  1. def lambda_handler(event, context):
  2. client = boto3.client('glue')
  3. body = json.loads(event['body'])
  4. job_id_to_stop = body['job_id_to_stop']
  5. job_to_start_argument = body['job_to_start_argument']
  6. client.batch_stop_job_run( # 停止作业运行
  7. JobName='job-to-stop',
  8. JobRunIds=[
  9. job_id_to_stop
  10. ]
  11. )
  12. # 在启动作业运行之前等待5秒钟
  13. import time
  14. time.sleep(5)
  15. client.start_job_run( # 启动作业运行
  16. JobName = 'job-to-start',
  17. Arguments = {
  18. '--job_to_start_argument': job_to_start_argument
  19. }
  20. )
  21. return {
  22. "statusCode": 200,
  23. "headers": {
  24. "Content-Type": "application/json"
  25. },
  26. "body": "Success"
  27. }

Lambda函数在运行后会自动终止,所以你不需要让它无限期运行。然而,你可以使用time.sleep(5)来在停止作业运行和启动作业运行之间添加5秒的延迟。这样,Lambda函数会在停止作业后等待5秒,然后再启动新的作业。

英文:

I have lambda that stops a running job and start a different glue job. It goes like this:

  1. def lambda_handler(event, context):
  2. client = boto3.client('glue')
  3. body = json.loads(event['body'])
  4. job_id_to_stop = body['job_id_to_stop']
  5. job_to_start_argument = body['job_to_start_argument']
  6. client.batch_stop_job_run( #STOP JOB RUN
  7. JobName='job-to-stop',
  8. JobRunIds=[
  9. job_id_to_stop
  10. ]
  11. )
  12. client.start_job_run( #START JOB RUN
  13. JobName = 'job-to-start',
  14. Arguments = {
  15. '--job_to_start_argument': job_to_start_argument
  16. }
  17. )
  18. return {
  19. "statusCode": 200,
  20. "headers": {
  21. "Content-Type": "application/json"
  22. },
  23. "body": "Success"
  24. }

Now I know that lambda dies after running and I don't need it to run indefinitely. However, I want to add a delay between stop_job_run and start_job_run. So after stopping the first glue job, I want lambda to wait at least 5 seconds before running the start_job_run. How do i do that?

答案1

得分: 2

只需在调用之间添加time.sleep(5),并确保 Lambda 的超时时间足够长,以便提交两个请求并等待 5 秒,例如将超时时间设置为 10 秒。

英文:

Just add a time.sleep(5) in between the calls and ensure the lambda has a timeout that is large enough to submit both requests and wait for 5s, e.g. have the timeout be 10 seconds.

答案2

得分: 2

我会在Lambda函数中谨慎使用显式的sleep():Lambda的计费模型基于执行时间,故意暂停执行N秒会不必要地增加成本。

在这种情况下,我会改用Step Function,编排多个Lambda来停止/启动相应的作业(如果我记得正确,您还可以直接在Step Functions中管理Glue作业,但我不知道它是否适合您的用例)。这也会提供更多的自定义、配置和重用空间。

英文:

I would use an explicit sleep() within a Lambda function with great caution: the billing model for Lambda is based on execution time, and deliberately pausing execution for N seconds would unnecessarily increase the cost.

In this scenario, I would instead use a Step Function, orchestrating multiple Lambdas to stop/start the respective jobs (if I recall correctly you can also manage Glue jobs directly in Step Functions, but I don't know if it fits your use case).<br/>This would also provide more room for customization, configuration, and reuse.

huangapple
  • 本文由 发表于 2023年8月10日 15:29:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/76873495.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定