Lambdaレイヤー(#Scrapy)

<タイトル> Lambdaレイヤー(#Scrapy)

2025年06月17日 2025年07月28日 カテゴリ: python

Lambda×Scrapy(構築手順)

 Lambda 関数を採用するケース(軽量・リアルタイム)

  • データサイズ:XXMB程度
  • 実行:軽量な処理
  • トリガー:イベント駆動処理(API Gateway や S3 など)
  • ランタイム:最大15分以内
  • ライブラリ:Lamdaレイヤーを作成する(Docker)

○事例(Lambda×Scrapy)

  • 定期実行(毎日, 毎週)
  • 毎日相当分だけのスクレイピングを実行する

×事例(Lambda×Scrapy)

  • スクレイピングが1回で済む
  • スクレイピング実行ごとに膨大な処理時間を費やす
  • ブラウザ処理のためにメモリ使用量が大きい場合

Lambda レイヤー作成関数(Docker-compose.yml)

AWS Lambda では、scrapy ライブラリはデフォルトで提供されていないため、これらのライブラリを利用する場合には、Lambda レイヤーを各自で作成し、関数に追加する必要がある。本記事では、ローカルPC環境を壊さないDockerコンテナを利用して Lambdaレイヤーを作成する。docker-compose.yml にまとめてコーディングしたメモです。

#ディレクトリ構造#

amazonlinux
   - Mount_Directory    # マウント先ディレクトリ(任意名)
   - docker-compose.yml # コード実行($'docker-compopse up --build')

#Lamda レイヤー(#Scrapy)

# 採用バージョン(#2025年6月):Python(3.11), Scrapy(2.12.0)
services:
  build-layer:
    image: public.ecr.aws/lambda/python:3.11 # AWS公式イメージを利用すること
    container_name: lambda-layer-builder
    volumes:
      - ./Mount_Directory:/lambda-layer
    working_dir: /lambda-layer
    entrypoint: ["/bin/sh", "-c"]
    command: |
      "yum install -y gcc make autoconf libtool python3-devel zip && \
      pip3 install --upgrade pip && \
      pip3 install Scrapy==2.12.0 --no-cache-dir -t /lambda-layer/python && \
      cd /lambda-layer && \
      zip -r9 py3.11_scrapy.zip python"
    tty: true

「docker-compose up --build」コマンドを実行すると、マウント先ディレクトリに「py3.11_scrapy.zip python」ZIPファイルが作成される。このZIPファイルを利用することで Lambda×Scrapy実行環境を準備することができる。

#Lamdaレイヤー基本手順

  1. Scrapyを含むZIPファイルが50MBを超える場合、AWS S3 にアップロードする
  2. AWS画面:[Lambda]→[その他のリソース/レイヤー]→「レイヤーを作成」
  3. 作成済みZIPファイルをレイヤー設定に適用する。
  4. Pythonスクリプトを実行する場合、アーキテクチャ(x86_64)&ランタイム(Python3.XX)

#Scrapyスクリプト作成手順

# このようなScrapyスクリプトを作成済みと仮定する

myspider/
├── myspider/
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── settings.py
    └── spiders/                 # ディレクトリ(スパイダー)
        ├── __init__.py
        └── developed_scraper.py # ファイル(スパイダー)
├── scrapy.cfg
├── lambda_function.py           # Lambda専用関数
  1. Scrapy作成済みディレクトリに移動する (cd  myspider)
  2. Lambda専用関数を別途作成する (lambda_function.py)
  3. ScrapyスクリプトをZIPファイル化する ( zip -r myspider.zip . )
  4. 作成済みZIPファイルをlambda関数にアップロードする ※「アップロード」→「zipファイル」

lambda_function.py(起動コーディング例)

import logging
from xxxxx.spiders.xxxxx import xxxxxSpider # 各自Scrapyスクリプトに合わせる
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

def lambda_handler(event, context):
    logging.basicConfig(level=logging.INFO)
    logging.info('OpenloadSpiderのクロールを開始します')
    # Scrapy:出力ファイル設定内容
    settings = get_project_settings()
    settings.set('FEEDS', {
        local_path: {
            'format': 'json',
            'encoding': 'utf8',
            'overwrite': True,
            'ensure_ascii': False,
        }
    }) 
    process = CrawlerProcess(settings)
    process.crawl(xxxxxSpider)
    process.start()
    logging.info('//クロールが終了しました//')

この関数内容を修正して、スクレイピング結果をS3に保存することもできる。



コメント(一覧)

コメント(入力画面)

空港MAP(#WIKI)
※現在の時刻 週間天気予報 (東京)
バックナンバー(年別)