如何使用 boto3 获取 AWS/Lambda 函数的状态?

时间:2021-03-06 12:46:02

标签: aws-lambda boto3

有没有办法使用 boto3 来发现 lambda 函数是否成功完成?通常,等待 lambda 完成的最佳方法是什么?

lambda 函数是异步调用的(所以 function makeLinks($str, $w) { $reg_exUrl = "/(http|https)\\:\\/\\/[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,3}(\\/\\S*)?/"; $urls = array(); $urlsToReplace = array(); if (preg_match_all($reg_exUrl, $str, $urls)) { $numOfMatches = count($urls[0]); $numOfUrlsToReplace = 0; for ($i = 0;$i < $numOfMatches;$i++) { $alreadyAdded = false; $numOfUrlsToReplace = count($urlsToReplace); for ($j = 0;$j < $numOfUrlsToReplace;$j++) { if ($urlsToReplace[$j] == $urls[0][$i]) { $alreadyAdded = true; } } if ((!$alreadyAdded) AND (strpos($urls[0][$i], $w) !== false)){ array_push($urlsToReplace, $urls[0][$i]); } } $numOfUrlsToReplace = count($urlsToReplace); for ($i = 0;$i < $numOfUrlsToReplace;$i++) { $urlsToReplace[$i] = str_replace("/w/", "/w".cryp($urlsToReplace[$i])."/", $urlsToReplace[$i]); $str = str_replace($urlsToReplace[$i], $urlsToReplace[$i]."cocococo", $str); } return $str; } else { return $str; } } )。

2 个答案:

答案 0 :(得分:0)

如果您想确保 Lambda 成功并可能对结果执行某些操作,您需要同步调用。在 Lambda 中,您为此使用 RequestResponse 调用类型。

您可以在下面看到一个示例。

import boto3

def run_lambda_and_wait_for_it() -> bool:
    lambda_client = boto3.client("lambda")

    response = lambda_client.invoke(
        FunctionName="LambdaDemo",
        InvocationType="RequestResponse",  # Synchronous Invocation
    )

    return response["StatusCode"] == 200

if __name__ == "__main__":
    invocation_successful = run_lambda_and_wait_for_it()
    print(f"Was the invocation successful? {invocation_successful}")
$ python3 boto3_lambda_invoke.py
Was the invocation successful? True

参考:


更新:

错误计数指标是否足以满足您的用例?您也可以直接从 CloudWatch 获取。

Lambda error and success rate

答案 1 :(得分:0)

@Randomize

我必须假设您的 Lambda 函数可能无法成功完成。为什么会这样?

  1. 它正在处理来自您无法控制的其他系统的输入
  2. 如果接收到太多数据可能会超时
  3. 您可能会超过您的concurrency

让我们假设 concurrency 是一个更广泛的话题。因此,让我们假设您有一个偶尔会失败的函数。

考虑以下 Lambda 函数:

import time
import random

def lambda_handler(event, context):
    sleep_time = random.randint(1,20)
    time.sleep(sleep_time)
    
    return {
        "sleepTime": sleep_time,
        "result": int(event['x']/event['y'])
    }

显然,这可能会因不同原因而失败:除以零并输入错误(我将超时设置为 21 秒)。

我们可以跟踪失败的一种方法是 Dead Letter Queue (DLQ)

这里我创建了一个队列:$ aws sqs create-queue --queue-name divideFunctionDLQ

然后我附加了一个允许 Lambda 函数发布到相关队列的策略,然后我将 Lambda 函数设置为将其用作死信队列:

$ aws lambda update-function-configuration --function-name divideFunction --dead-letter-config TargetArn=arn:aws:sqs:us-east-1:************:divideFunctionDLQ(从 ARN 中删除的帐户 #)

然后我可以触发一些调用:

$ aws lambda invoke --function-name divideFunction --invocation-type Event --payload '{"x": 16, "y": 2}' out.json
$ aws lambda invoke --function-name divideFunction --invocation-type Event --payload '{"x": 16, "y": 0}' out.json
$ aws lambda invoke --function-name divideFunction --invocation-type Event --payload '{"x": "a", "y": 1}' out.json
$ aws lambda invoke --function-name divideFunction --invocation-type Event --payload '{"x": 10, "y": 5}' out.json

现在我们可以使用我们的 DLQ 进行检索:

$ aws sqs receive-message --max-number-of-messages 10 --queue-url https://sqs.us-east-1.amazonaws.com/829583023482/divideFunctionDLQ
{
    "Messages": [
        {
            "MessageId": "237c9c2d-7819-4fe5-b9ea-37e98492a937",
            "ReceiptHandle": "AQEBIEtrcofsSAVfqL75/aerGwZiJ/4QXfBv1awBwVsnVCv3x5Qnex/nySgHLukCfuIt8YmWDAbEjOsj2M/IN1Grm+zRY5eenOkRvJkFUBURkrK2JBUQuOTx1rnkO2N3YJQlNvEwiKPscbuemNNoEq7MRVNLhxIxjOuhS0kjTxhYhtZZhVwSel0wkbN5dVsfkmqI/uaDO/mzGD4n70pKZM3cqL+GFTJhnvgREKur80D0AKNrr0NGHkcL/xJBz5G8FRfWqaoe2ApJ7vC0iGdrOgXWWlHFz9k2xutMe5WCa2IwiwcHVP794F1PfsWsQZDsmT35nJsXFFhsSnyLt3b4Nld/ZcF22jhogOkkktr2S0DxGnGP6Wx8Hqds8Xmhj3/pdLHr4LR8nkYWUDBnl+cfEUa6/A==",
            "MD5OfBody": "313101ffd6812ca97574075448169c1b",
            "Body": "{\"x\": \"a\", \"y\": 1}"
        }
    ]
}

为什么要异步运行函数?他们可能正在做 ETL 或编码/重新编码之类的工作,这可能很适合异步模型。