AWS CDK で外部パッケージを含む Python の AWS Lambda 関数をデプロイする場合,requirements.txt
から依存関係を解決して,デプロイするアセットとして ZIP にまとめる(バンドルする)必要がある💡
今回は aws-cdk-lib.aws_lambda module と @aws-cdk/aws-lambda-python-alpha module を使う方法を試す❗️
前提
今回はサンプルとして requests に依存したコードを以下のディレクトリ構成で置いてある前提とする \( 'ω')/
functions/requests ├── app.py └── requirements.txt
aws_lambda module を使う
まず,AWS CDK で AWS Lambda 関数をデプロイするときによく使う aws_lambda module では Code.fromAsset
のオプションとして BundlingOptions を設定できる.
実装としてはザッとこんな感じになる 👾
Python のコンテナ内で pip install
コマンドを実行して /asset-output
ディレクトリに依存関係をインストールしたら,後はそのまま ZIP にまとめて(バンドルして)デプロイされる👌
new aws_lambda.Function(this, 'PythonFunction', { functionName: 'sandbox-python-function', runtime: aws_lambda.Runtime.PYTHON_3_12, handler: 'app.lambda_handler', code: aws_lambda.Code.fromAsset(path.join(__dirname, '../functions/requests'), { bundling: { image: aws_lambda.Runtime.PYTHON_3_12.bundlingImage, command: [ 'bash', '-c', 'pip install -r requirements.txt -t /asset-output && cp -au . /asset-output' ] } }) })
aws-lambda-python-alpha module を使う
まだ alpha ではあるけど aws-lambda-python-alpha module を使うと entry
に指定したディレクトリにある requirements.txt
や Pipfile
から自動的に依存関係を解決してくれる👌
実装としてはザッとこんな感じになる 👾
new aws_lambda_python_alpha.PythonFunction(this, 'PythonFunctionAlpha', { functionName: 'sandbox-python-function-alpha', runtime: aws_lambda.Runtime.PYTHON_3_12, index: 'app.py', handler: 'lambda_handler', entry: path.join(__dirname, '../functions/requests'), })
aws_lambda.Function のプロパティもサポートされてるし,Lambda Layer も簡単にデプロイできるし便利〜 \( 'ω')/
デプロイ確認
期待通りに requirements.txt
に定義した requests
をデプロイできている❗️