【问题标题】:AWS Lambda: Get current retry attempt count at runtimeAWS Lambda:在运行时获取当前重试次数
【发布时间】:2021-01-18 05:49:11
【问题描述】:

我有一个运行特定任务的 AWS Lambda(python3.7 运行时),它的 MaximumRetryAttempts 设置为 1(这意味着它可能会失败一次,然后再尝试 1 次)。

出于一个我不会进入的原因,我想知道,在运行时,这是第一次尝试还是第二次尝试。有什么方法可以实现吗?

【问题讨论】:

    标签: python-3.x aws-lambda


    【解决方案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 和重试计数的映射。

    【讨论】:

    • 首先,感谢即插即用解决方案。就我而言,我认为轮询不太相关,但可能是使用 AWS System Parameter Store。我一直在寻找更简单的东西,但似乎没有其他选择。
    猜你喜欢
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多