Source code for aws_lambda_artifact_builder.layer.pip_builder
# -*- coding: utf-8 -*-"""Pip-based Lambda layer builder implementation.This module provides Lambda layer creation using pip's ``--target`` installation method,supporting both local and containerized builds. It offers the simplest approach to layercreation since pip is universally available with Python installations.**Command Pattern Classes:**- :class:`PipBasedLambdaLayerLocalBuilder`: Local pip-based builds- :class:`PipBasedLambdaLayerContainerBuilder`: Containerized pip-based builds"""importsubprocessimportdataclassesfrompathlibimportPathfromfunc_args.apiimportREQfrom..vendor.better_pathlibimporttemp_cwdfrom..constantsimportLayerBuildToolEnumfrom..pathsimportpath_build_lambda_layer_using_pip_in_container_scriptfrom.builderimport(BasedLambdaLayerLocalBuilder,BasedLambdaLayerContainerBuilder,)
[docs]@dataclasses.dataclass(frozen=True)classPipBasedLambdaLayerLocalBuilder(BasedLambdaLayerLocalBuilder,):""" Command class for local pip-based Lambda layer builds (Internal API). .. seealso:: :class:`~aws_lambda_artifact_builder.layer.builder.BasedLambdaLayerLocalBuilder` """path_bin_pip:Path=dataclasses.field(default=REQ)_build_tool:str=dataclasses.field(default=LayerBuildToolEnum.pip)
[docs]defstep_3_1_run_pip_install(self):""" Execute pip install with --target flag and optional private repository authentication. Installs from requirements.txt directly into Lambda's python/ directory. Supports private repositories via --index-url with embedded credentials. """self.log("--- Step 3.1 - Run 'pip install'")path_bin_pip=self.path_bin_pipdir_repo=self.path_layout.dir_repowithtemp_cwd(dir_repo):args=[f"{path_bin_pip}","install","-r",f"{self.path_layout.path_requirements_txt}","-t",# Target directory for package installationf"{self.path_layout.dir_python}",# AWS Lambda python/ directory]# Add private repository authentication if providedifself.credentialsisnotNone:more_args=self.credentials.additional_pip_install_args_index_urlargs.extend(more_args)subprocess.run(args,cwd=dir_repo,check=True)
[docs]@dataclasses.dataclass(frozen=True)classPipBasedLambdaLayerContainerBuilder(BasedLambdaLayerContainerBuilder,):""" Command class for containerized pip-based Lambda layer builds. .. seealso:: :class:`~aws_lambda_artifact_builder.layer.builder.BasedLambdaLayerContainerBuilder` """path_script:Path=dataclasses.field(default=path_build_lambda_layer_using_pip_in_container_script)
[docs]defstep_1_preflight_check(self):super().step_1_preflight_check()ifself.path_layout.path_requirements_txt.exists()isFalse:raiseFileNotFoundError(f"requirements.txt file not found: {self.path_layout.path_requirements_txt},"f"cannot proceed with pip-based build.")