AWSIaCPython

AWS CDKでLambdaLayerもまとめてアップロードする

AWS

以前にLambda上でSeleniumとheadless-chromiumを動作させる方法について紹介いたしました。

AWS Lambda PythonでSeleniumとheadless-chromiumを使ってスクレイピングする方法
https://qiita.com/nodathon1/items/0f946bcb329e3b09bbfb

その際は手動でLambdaLayerにモジュールをアップロードしてから、Lambda関数に紐づけをしていました。
今回はAWS CDKを使ってLambdaとLambdaLayerをコード化して構築する方法について紹介します。

1. 前提

  • Pythonはインストール済
  • AWS CDKはインストール済
  • PythonでCDKプロジェクト作成済(例としてプロジェクト名はcdk-project)

2. LambdaLayerフォルダ内へファイルの配置

まずはLambdaLayerで利用するファイルを手動で配置します。

今回は2つのLambdaLayerを作成します。
1つ目はchromedriverとheadless-chromeのファイルを配置して、2つ目はSeleniumのモジュールを以下のコマンドで配置します。

cd lambda_layer
pip install -t ./python/lib/python3.7/site-packages selenium

最終的には以下のようなlambda_layerディレクトリの構成となります。

├─cdk-project
│  └─cdk_project_stack.py
├─lambda
└─lambda_layer
    ├─chromedriver
    │   ├─chromedriver
    │   └─headless-chrome
    └─selenium
        └─python
            └─lib
                └─python3.7
                    └─site-packages
                        └─selenium

3. AWS CDKファイル

LambdaLayerの準備ができたらCDKで記載します。以下のようになります。
Lambda側で定義したLayerと紐づけしています。
あわせて、Lambda関数のタイムアウト値はデフォルト5秒なので300秒に変更してます。

class CdkProjectStack(cdk.Stack):

    def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # The code that defines your stack goes here
        # lambda_layer
        layer_selenium = _lambda.LayerVersion(
            self,
            "layer_selenium",
            compatible_runtimes=[_lambda.Runtime.PYTHON_3_7],
            code=_lambda.AssetCode("lambda_layer/selenium"),
        )

        layer_chromedriver = _lambda.LayerVersion(
            self,
            "layer_chromedriver",
            compatible_runtimes=[_lambda.Runtime.PYTHON_3_7],
            code=_lambda.AssetCode("lambda_layer/chromedriver"),
        )

        # lambda
        lambda_fn = _lambda.Function(
            self, 'TestHandler',
            function_name="test_lambda_layer_function",
            runtime=_lambda.Runtime.PYTHON_3_7,
            code=_lambda.Code.asset('lambda'),
            handler='main.lambda_handler',
            memory_size=256,
            timeout=core.Duration.seconds(300),
            layers=[layer_selenium, layer_chromedriver],
        )

4. まとめ

これでLambdaLayerも含めてコード管理できるようになりました。AWS CDKは便利ですね。

ちなみにLambdaのPythonバージョンが3.9だと以下の方法を実施してもSeleniumは動作しないようです。Seleniumの実行エラーになります。
Python3.7にすると動作するようになりましたのでご注意ください。

今回は以上となります。

コメント