La teva funció Lambda gairebé mai està sola: necessita llibreries (codi de tercers) per fer la seva feina —connectar-se a una base de dades, processar imatges, cridar una API—. En aquest subcapítol veurem com s'inclouen aquestes dependències en una Lambda i com les capes (Layers) et permeten compartir-les i mantenir la teva funció lleugera.

El problema: el codi necessita llibreries

Imagina una Lambda en Python que redimensiona imatges. Per fer-ho utilitza una llibreria popular com Pillow. Però aquesta llibreria no ve inclosa a Lambda per defecte: has de empaquetar-la juntament amb el teu codi.

La teva funció necessita:
  - el teu codi (handler.py)         ← l'escrius tu
  - la llibreria Pillow              ← de tercers, cal incloure-la
  - potser altres llibreries més     ← també cal incloure-les

Si no inclous la llibreria, en executar-se la funció fallarà amb un error tipus «mòdul no trobat». Així que el repte és: com poso les llibreries a la meva Lambda?

Opció 1: empaquetar les dependències amb el codi

La forma més directa és incloure les llibreries dins del paquet que puges a Lambda. Instales les dependències en una carpeta al costat del teu codi i ho puges tot junt, normalment en un arxiu ZIP:

la-meva-funcio.zip
 ├── handler.py        ← el teu codi
 ├── Pillow/           ← la llibreria inclosa
 └── (altres llibreries) ← tot empaquetat junt

Funciona, però té un inconvenient: si tens moltes funcions que utilitzen les mateixes llibreries, acabes repetint aquestes llibreries a cada paquet. El codi es duplica, els paquets es fan grans i mantenir-los és feixuc (si actualitzes una llibreria, cal refer tots els paquets).

Opció 2: les capes (Layers)

Una capa (Layer) és un paquet de llibreries o codi comú que pots compartir entre diverses funcions. En comptes de posar les llibreries a cada funció, les poses una vegada en una capa i després connectes aquesta capa a totes les funcions que la necessitin.

        ┌──────── Layer "llibreries-comunes" ────────┐
        │   Pillow, requests, utilitats pròpies...   │
        └────────────────────────────────────────────┘
              ▲            ▲             ▲
              │            │             │
         Funció A    Funció B     Funció C
        (el seu codi) (el seu codi) (el seu codi)

Cada funció inclou només el seu propi codi, i «pren en préstec» les llibreries de la capa.

Analogia: una capa és com el rebost compartit d’un edifici d’apartaments. En comptes que cada veí tingui el seu propi sac de farina i sucre (duplicat), hi ha un rebost comú on tothom agafa el que necessita. Si cal reposar la farina, es fa una vegada per a tothom.

Avantatges de les capes

  • Menys duplicació: les llibreries comunes són en un sol lloc, no repetides a cada funció.
  • Funcions més lleugeres: el teu paquet només porta el teu codi, així que és petit i es puja/desplega més ràpid.
  • Manteniment centralitzat: actualitzes la llibreria a la capa i totes les funcions se’n beneficien.
  • Reutilització: pots tenir una capa de «utilitats pròpies» que comparteixen tots els teus equips.

Exemple del món real: una empresa té 15 funcions Lambda que es connecten a la mateixa base de dades i utilitzen les mateixes utilitats internes (logging, validacions). Creen una capa utilitats-empresa amb tot aquest codi comú. Les 15 funcions la utilitzen. Quan milloren una utilitat, actualitzen la capa una vegada i les 15 funcions l’hereten, sense tocar el codi de cadascuna.

Quan utilitzar cada opció?

Situació Recomanació
Una funció simple, poques llibreries Empaquetar amb el codi (Opció 1)
Diverses funcions amb llibreries comunes Utilitzar una capa (Opció 2)
Llibreries pesades que es repeteixen molt Utilitzar una capa (alleugereix les funcions)
Codi d’utilitats propi compartit Utilitzar una capa

Per començar: si tens una sola funció o estàs aprenent, empaquetar les llibreries juntament amb el codi és el més senzill. Les capes tenen sentit quan creixes i comences a repetir les mateixes dependències en diverses funcions.

Una nota sobre la mida

Lambda té límits de mida per al paquet de codi i les capes (ho veurem al subcapítol 14.5). Per això és important no incloure llibreries que no utilitzis: com més lleugera sigui la funció, més ràpid arrenca (el que connecta amb els «cold starts» del següent subcapítol). Si les teves dependències són molt grans, també existeix l’opció d’empaquetar la Lambda com una imatge de contenidor (recorda Docker, que veurem al Capítol 17), que admet paquets molt més grans.

El que has de recordar

  • La teva Lambda necessita les seves dependències (llibreries de tercers) incloses; si en falten, falla en executar-se.
  • Opció 1 — empaquetar amb el codi: poses les llibreries al ZIP juntament amb la teva funció. Senzill, però duplica les llibreries si tens moltes funcions.
  • Opció 2 — capes (Layers): poses les llibreries o el codi comú una vegada en una capa i la comparteixes entre diverses funcions. Com un «rebost comú».
  • Les capes redueixen la duplicació, mantenen les funcions lleugeres i permeten manteniment centralitzat.
  • Per començar, empaquetar juntament amb el codi és el més fàcil; utilitza capes quan repeteixis dependències en diverses funcions.

En el següent subcapítol abordarem un dels temes més característics de Lambda: els cold starts (arrencades en fred) i com reduir-los.

Cloud, AWS & Terraform — De zero a expert

Capítol 1 · Què és el cloud computing

Capítol 2 · El mercat cloud i els grans proveïdors

Capítol 3 · Regions, zones de disponibilitat i edge

Capítol 4 · Càlcul: EC2

Capítol 5 · Emmagatzematge: S3

Capítol 6 · Xarxes: VPC

Capítol 7 · Identitat i accés: IAM

Capítol 8 · Bases de dades gestionades

Capítol 9 · Per què Infraestructura com a Codi

Capítol 10 · HCL: el llenguatge de Terraform

Capítol 11 · Providers i estat

Capítol 12 · La teva primera infraestructura real amb Terraform

Capítol 13 · Balanceig de càrrega i autoescalat

Capítol 14 · Serverless amb Lambda

Capítol 15 · Missatgeria i esdeveniments

Capítol 16 · Lliurament de contingut i DNS

Capítol 17 · Contenidors a AWS

Capítol 18 · Mòduls: reutilització i composició

Capítol 19 · Workspaces i gestió d'entorns

Capítol 20 · Backends remots i locking

Capítol 21 · Testing d'infraestructura

Capítol 22 · Terraform en CI/CD

Capítol 23 · Seguretat en profunditat

Capítol 24 · Observabilitat: logs, mètriques i traces

Capítol 25 · Optimització de costos

Capítol 26 · Alta disponibilitat i disaster recovery

Capítol 27 · Well-Architected Framework d'AWS

Capítol 28 · Arquitectures serverless a escala

Capítol 29 · Plataformes de dades a AWS

Capítol 30 · Multi-compte i landing zones

Capítol 31 · Platform Engineering i Internal Developer Platform

Capítol 32 · Certificacions AWS rellevants

Capítol 33 · Projectes per consolidar el que s'ha après

Capítol 34 · Recursos i comunitat

© Copyright 2024. Tots els drets reservats