英文:
how to set interval in lambda start job
问题
我有一个Lambda函数,用于停止一个运行中的作业并启动一个不同的Glue作业。它的代码如下:
def lambda_handler(event, context):
client = boto3.client('glue')
body = json.loads(event['body'])
job_id_to_stop = body['job_id_to_stop']
job_to_start_argument = body['job_to_start_argument']
client.batch_stop_job_run( # 停止作业运行
JobName='job-to-stop',
JobRunIds=[
job_id_to_stop
]
)
# 在启动作业运行之前等待5秒钟
import time
time.sleep(5)
client.start_job_run( # 启动作业运行
JobName = 'job-to-start',
Arguments = {
'--job_to_start_argument': job_to_start_argument
}
)
return {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": "Success"
}
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:
def lambda_handler(event, context):
client = boto3.client('glue')
body = json.loads(event['body'])
job_id_to_stop = body['job_id_to_stop']
job_to_start_argument = body['job_to_start_argument']
client.batch_stop_job_run( #STOP JOB RUN
JobName='job-to-stop',
JobRunIds=[
job_id_to_stop
]
)
client.start_job_run( #START JOB RUN
JobName = 'job-to-start',
Arguments = {
'--job_to_start_argument': job_to_start_argument
}
)
return {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": "Success"
}
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论