3
0

More than 1 year has passed since last update.

別のLambdaを同時に呼び出して実行する方法【備忘録】

Last updated at Posted at 2022-03-03

背景

Lambdaを使って日付ごとにデータをスクレイピングすることがあった。
大量のデータであったが、繰り返し文で日付を変えながら行うプログラムとしていたため、非常に時間がかかった。

そこで、①実行指示Lambdaと②スクレイピングLambdaに分けてプログラムを作成し、①にて変数を入れ替えながら②に指示するような構成にすることで、Lambdaの同時実行が可能になったので、備忘録として記載する。

参考記事については複数層に分けて大量のLambda実行を可能としているが、今回はわかりやすさ優先で、(親)と(子)の2層構造でLambdaを同時実行してみる。

イメージ

image.png

親Lambda

parent

import json
import io

client = boto3.client('lambda')

date_list = ['2022/01','2022/02','2022/03','2022/04']
category_list = ['setosa','versicolor','virginica','other']

def lambda_handler(event, context):
    # 子Lambda の呼び出し
    for i in range(len(date_list)):
        response = client.invoke(
            FunctionName='children',#Lambdaで記載している関数名を記載
            InvocationType='Event',
            Payload=json.dumps({'DATE': date_list[i]
                                ,'CATEGORY': category_list[i]
                                })
        )

上記のように、親Lambda内で子Lambdaを呼び出している。for文でdate_listの数(4回)だけ呼び出しをするように指示している。

子Lambda

children

import json
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

def lambda_handler(event, context):
    date = str(event.get('DATE'))
    category = str(event.get('CATEGORY'))

    driver = headless_chrome()
    wait = WebDriverWait(driver, 30)

    driver.get("http://〇〇…")
    ・・・

親Lambdaで呼び出された子Lambdaは、event.getで親Lambdaから渡された変数を読み込むことができる。

終わりに

上記は基本形の形であるが、参考記事のように複数層で呼び出しー呼び出され構成にすることで、並列処理チックな構成を組むことが可能。
大量データのスクレイピングだけではなく、大量データの集計・解析作業の高速化につながることを期待。

参考記事

3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0