Estoy tratando de construir mi función lambda usando SAM. Mi función lambda depende de una función de python personalizada que planeo construir como una capa de AWS Lambda. Mi función de python personalizada tiene una dependencia transitiva en un paquete de python disponible públicamente en PyPI, que especifiqué en el archivo requirements.txt para la capa.
Aquí está la estructura de carpetas para mi función lambda:
my-lambda-func |-- events |-- event.json |-- my-func |-- my_function.py |-- __init__.py |-- requirements.txt |-- my-layer |-- my_layer.py |-- requirements.txt |-- template.yaml |-- buildspec.ymlAquí está mi archivo template.yaml:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-test Sample SAM Template for sam-test Globals: Function: Timeout: 300 Resources: MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: my-func/ Handler: app.lambda_handler Layers: - !Ref MyLayer Runtime: python3.8 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get MyLayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: MyLayer Description: My custom Lambda Layer ContentUri: ./my-layer/ CompatibleRuntimes: - python3.8 LicenseInfo: MIT RetentionPolicy: Retain Metadata: BuildMethod: python3.8Mi archivo buildspec:
version: 0.2 phases: build: commands: - sam package --template-file template.yaml --s3-bucket my-bucket --output-template-file packaged-template.yml artifacts: files: - packaged-template.yml cuando ejecuto un comando de sam build localmente, veo que los 2 recursos se crean correctamente, incluida la extracción de las dependencias transitivas para la capa, pero cuando configuro CodePipeline con una fase de compilación para compilar el comando desde el archivo builspec y una fase de implementación usando CloudFormation, la capa no está construido como esperaba. Cuando descargo la capa desde la consola, no muestra ninguna dependencia transitiva.
Alguien ha hecho algo similar a esto. ¿Alguien puede ayudarme con lo que estoy haciendo mal? ¡Gracias!
Nunca usé Lambda Layer, aunque lo que me llamó la atención con mi buildspec.yml es que no está ejecutando sam build antes del empaquetado. Aquí está mi archivo buildspec, tal vez ayude
phases: install: runtime-versions: python: 3.7 build: commands: - pip install --upgrade aws-sam-cli - sam build - sam package --output-template-file packaged.yaml --s3-bucket ${FUNCTIONS_BUCKET} artifacts: type: zip files: - packaged.yamlStefano tiene razón, todo lo que estás empaquetando de la capa es la definición. Debe ejecutar sam build antes de empaquetar.