In order to deploy a Python Lambda function with additional dependencies, we must use something that will install those dependencies. With NodeJS, we can use something like esbuild
to do this. In a Typescript CDK, we can use npm or yarn to install this as a development dependency. However, we do not have this option with a Python Lambda. To have this built during deployment, we can use the bundlingOptions interface.
this.queryLambda = new Function(this, "QueryLambda", { code: Code.fromAsset(path.join(__dirname, "resources/query_lambda"), { bundling: { image: Runtime.PYTHON_3_9.bundlingImage, command: [ "bash", "-c", "pip install -r requirements.txt -t /asset-output && cp -au . /asset-output", ], }, }), runtime: Runtime.PYTHON_3_9, vpc: props.vpc, vpcSubnets: { subnetType: SubnetType.PRIVATE_WITH_EGRESS }, architecture: Architecture.ARM_64, handler: "index.handler", timeout: Duration.minutes(5), role: props.role, layers: [props.powerToolsLayer], environment: { RDS_SECRET_NAME: props.dataBase.secret?.secretName!, }, });
In this example from the cdk-private-rds-with-lambda repository, we can see the QueryLambda
function is being created using Code
from the /resources/query_lambda
directory and bundled using a Docker image. This does require Docker desktop to be run locally or from the pipeline that is deploying this function.
When this Lambda function is deployed, pip install
will be used with the requirements.txt
file in the /query_lambda
directory to create the zip file that will be uploaded as the Lambda function.
resources/ ├── initialize_lambda/ │ ├── index.py │ └── requirements.txt └── query_lambda/ ├── index.py └── requirements.txt