python-3.x - AWS Lambda:在运行时获取当前重试次数
问题描述
我有一个python3.7
运行特定任务的 AWS Lambda(运行时),它MaximumRetryAttempts
设置为1
(意味着它可能会失败一次,然后再尝试 1 次)。
出于一个我不会进入的原因,我想知道,在运行时,这是第一次尝试还是第二次尝试。有没有办法做到这一点?
解决方案
import json
import boto3
from datetime import datetime, timedelta
import time
aws_cloud_watch_logs_client = boto3.client('logs')
lambda_invocation_count_query = "fields @retry_count | filter @message like 'REPORT' AND @requestId = '{lambda_request_id}' | stats count(@message) as retry_count"
aws_cloud_watch_log_group = '/aws/lambda/mylambdaname' # Set aws cloudwatch log group name as per your setup
def lambda_handler(event, context):
lambda_retry_counts=get_lambda_retry_count(context)
print("lambda_retry_counts=",lambda_retry_counts)
#TODO : your logic here
# refactor to reduce complexity, might extract method to cover single responsibility principle
def get_lambda_retry_count(context):
print("context.aws_request_id=", context.aws_request_id)
qry=lambda_invocation_count_query.format(lambda_request_id=context.aws_request_id)
print(qry)
start_query_response = aws_cloud_watch_logs_client.start_query(
logGroupName=aws_cloud_watch_log_group,
startTime=int((datetime.today() - timedelta(hours=1)).timestamp()), # Refactor as per your requirement
endTime=int(datetime.now().timestamp()),
queryString=qry,
)
query_id = start_query_response['queryId']
response = None
while response == None or response['status'] == 'Running':
print('Waiting for cloud watch query to complete ...')
time.sleep(10) # Refactor as per your requirement
response = aws_cloud_watch_logs_client.get_query_results(
queryId=query_id
)
if response['results']:
return response['results'][0][0]['value'] # refactor for readability, maintenance
else:
return 0
或者,要查询 aws cloud watch,您还可以使用 AWS System Parameter Store 和 aws_request_id 作为参数名称的一部分来唯一标识它。此外,保持 lambda 重试计数作为此参数的值。根据 aws_request_id 每次执行 lambda 递增。如果达到阈值,则根据您的逻辑进行处理,并删除名称具有达到阈值的 aws_request_id 的 AWS 系统参数存储。摘要-您只需要一些存储 aws_request_id 和重试计数的映射。
推荐阅读
- c# - 字段列表实体框架中的未知列
- javascript - 使用 Visual Studio Code 调试 ASP.net Web 表单项目中的 JS
- google-sheets - 尝试根据特定单元格计算赢/输比
- python - 在Tensorflow中获得欧几里得距离的所有组合?
- reactjs - 我正在尝试使用 react js 在我的投资组合中为我的简历添加一个下载按钮。单击该按钮时,它显示“失败 - 无文件”
- json - Scala Argonaut 在列表中折叠?
- html - Webkit 滚动条拇指在 Safari 14 上不起作用
- javascript - 如何读取从 Spring ModelAndView 控制器传回的 HTML 页面中的 Flash 属性参数
- sass - SCSS if/else 大于
- json - 如何更新以“@”开头的 JSonProperty