以前に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にすると動作するようになりましたのでご注意ください。
今回は以上となります。
コメント