🔧

AWS CDK でPython ランタイムLambda デプロイ時のrsyncエラー

に公開

AWS CDK でaws-lambda-python-alphaを使用して Lambda をデプロイしようとした際、次のようなエラーが発生しました。

rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.4.0]

原因

原因は、Lambda の index ファイルと同じ場所に.venvが存在したことでした。

この状態でデプロイしようとすると、.venvが Lambda にバンドルされます。
仮想環境内の実行ファイルは、ホストマシン上の Python インタープリタへのシンボリックリンクとして作成されています。しかし、コンテナ内では、これらのリンク先が存在しないためエラーが発生します。

エラー発生時のディレクトリ構成は以下

.
├── README.md
├── app.py
├── cdk.json
├── cdk_test
│   ├── __init__.py
│   └── cdk_test_stack.py
├── lambda
│   ├── index.py
│   └── .venv
├── requirements-dev.txt
├── requirements.txt
├── source.bat
└── tests
    ├── __init__.py
    └── unit
        ├── __init__.py
        └── test_cdk_test_stack.py

解決方法

BundlingOptionsasset_excludesパラメータで.venvを無視するように設定できます。

from aws_cdk import Stack
from aws_cdk.aws_lambda_python_alpha import PythonFunction
import aws_cdk.aws_lambda_python_alpha as lambda_python
from constructs import Construct

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

        PythonFunction(
            self,
            "MyFunction",
            entry="./lambda",
            bundling=lambda_python.BundlingOptions(
                asset_excludes=[".venv"]  # これを追加
            )
        )

このオプション追加で.venvディレクトリがバンドル対象から除外され、エラーを回避できます。

Discussion