有没有办法使用 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;
}
}
)。
答案 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 获取。
答案 1 :(得分:0)
@Randomize
我必须假设您的 Lambda 函数可能无法成功完成。为什么会这样?
让我们假设 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 或编码/重新编码之类的工作,这可能很适合异步模型。