Рекурсивные вызовы API с использованием AWS лямбда-функций Python - PullRequest
0 голосов
/ 17 февраля 2020

Я никогда раньше не писал рекурсивный python скрипт. Я привык разбивать монолитную c функцию на суб AWS лямбда-функции. Однако этот конкретный скрипт, над которым я работаю, сложно разбить на более мелкие функции.

Вот код, который я сейчас использую для контекста. Я использую один запрос 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 для l oop, который затем собирает все данные для каждого объекта.

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)

Этот конкретный Лямбда-функция занимает около 15 минут, что является пределом для одной AWS Лямбда-функции. В идеале я хотел бы разделить список на более мелкие части и запустить тот же процесс. Я с трудом отмечаю точку, в которой он работал в последний раз до сбоя, и передаю эту информацию следующей функции.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 18 февраля 2020

Я не уверен, что я полностью понимаю, что вы хотите делать с данными после того, как вы получили всю информацию о деле, но с точки зрения разделения работы после того, как лямбда выполняет много лямбд, вы должны быть в состоянии разделить список дел и передать их новым вызовам той же самой лямбды. Python psuedocode ниже, надеюсь, это поможет проиллюстрировать идею. Я украл метод chunks из этого ответа , который помог бы разбить список на партии

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)
    )

Надеюсь, это поможет? Дайте мне знать, если это не было целью ?

...