【问题标题】:Recursive API Calls using AWS Lambda Functions Python使用 AWS Lambda 函数 Python 的递归 API 调用
【发布时间】:2020-02-18 10:27:28
【问题描述】:

我以前从未编写过递归 python 脚本。我习惯于将单体函数拆分为子 AWS Lambda 函数。但是,我正在编写的这个特定脚本很难分解成更小的函数。

这是我目前用于上下文的代码。我正在使用一个 api 请求来返回表中的对象列表。

url_pega_EEvisa = requests.get('https://cloud.xxxx.com:443/prweb/api/v1/data/D_pxCaseList?caseClass=xx-xx-xx-xx', auth=(username, password))
pega_EEvisa_raw = url_pega_EEvisa.json()
pega_EEvisa = pega_EEvisa_raw['pxResults']

这会将特定表中的每个对象(主键)作为列表返回。例如,

['XX-XXSALES-WORK%20PO-1', 'XX-XXSALES-WORK%20PO-10', 'XX-XXSALES-WORK%20PO-100', 'XX-XXSALES-WORK%20PO-101', 'XX-XXSALES-WORK%20PO-102', 'XX-XXSALES-WORK%20PO-103', 'XX-XXSALES-WORK%20PO-104', 'XX-XXSALES-WORK%20PO-105', 'XX-XXSALES-WORK%20PO-106', 'XX-XXSALES-WORK%20PO-107']

然后我使用这个列表使用 for 循环填充更多的 get 请求,然后获取每个对象的所有数据。

for t in caseid:
    url = requests.get(('https://cloud.xxxx.com:443/prweb/api/v1/cases/{}'.format(t)), auth=(username, password)).json()
    data.append(url)

这个特定的 lambda 函数大约需要 15 分钟,这是一个 AWS Lambda 函数的限制。理想情况下,我想将列表分成更小的部分并运行相同的过程。我正在努力标记它在失败前最后一次运行的点并将该信息传递给下一个函数。

感谢任何帮助!

【问题讨论】:

  • 我不太了解您要执行的操作,但您是否考虑过将工作推送到 Amazon SQS 队列,并让它为每条消息触发 Lambda 函数,而不是使用递归 Lambda 函数?
  • 嗨,约翰,这是最终目标!我们的架构师正在使用 SQS 队列。我正在尝试将条目列表拆分为较小的列表,并将剩余的条目传递给另一个 lambda 函数。
  • @Bigmoose70 是我在您正在寻找的内容下方的答案,还是我不在基地?只是想知道我是否错过了什么:)
  • @TravisHaby 我同意伪代码,但是,我不太确定如何实现它。这种使用递归 lambda 函数的方法可能不是最好的方法。
  • 我认为在某些情况下它可能非常有用,但对您的具体用例了解不足而无法发表意见。看看这个关于使用递归调用创建视频转码系统的讨论,作为一个有意义的例子:) acloud.guru/series/serverlessconf-nyc-2019/view/…

标签: python amazon-web-services api aws-lambda tail-recursion


【解决方案1】:

我不确定我是否完全理解您在获取有关案例的所有信息后想要对数据做什么,但是一旦 lambda 将工作分解为多个 lambda,您应该能够将案例列表分块并将它们传递给相同 lambda 的新调用。下面的 Python 伪代码,希望它有助于说明这个想法。我stole the chunks method from this answer 这将有助于将列表分成批次

import boto3
import json

client = boto3.client('lambda')

def handler
  url_pega_EEvisa = requests.get('https://cloud.xxxx.com:443/prweb/api/v1/data/D_pxCaseList?caseClass=xx-xx-xx-xx', auth=(username, password))
  pega_EEvisa_raw = url_pega_EEvisa.json()
  pega_EEvisa = pega_EEvisa_raw['pxResults']

  for chunk in chunks(pega_EEvisa, 10)
    client.invoke(
      FunctionName='lambdaToHandleBatchOfTenCases',
      Payload=json.dumps(chunk)
    )

希望这有帮助吗?让我知道这是否没有达到目标?

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2023-04-04
    • 2014-12-30
    • 2010-11-07
    相关资源
    最近更新 更多