🔧
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
解決方法
BundlingOptions
のasset_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