Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Distribuisci funzioni Lambda in Node.js con immagini di container
Esistono tre modi per creare un'immagine di container per una funzione Lambda in Node.js:
-
Utilizzo di un'immagine di base per Node.js AWS
Le immagini di base AWS sono precaricate con un runtime in linguaggio, un client di interfaccia di runtime per gestire l'interazione tra Lambda e il codice della funzione e un emulatore di interfaccia di runtime per i test locali.
-
Utilizzo di un'immagine di AWS base solo per il sistema operativo
AWS Le immagini di base solo
per il sistema operativo contengono una distribuzione Amazon Linux e l'emulatore di interfaccia di runtime . Queste immagini vengono comunemente utilizzate per creare immagini di container per linguaggi compilati, come Go e Rust, e per un linguaggio o una versione di linguaggio per cui Lambda non fornisce un'immagine di base, come Node.js 19. Puoi anche utilizzare immagini di base solo per il sistema operativo al fine di implementare un runtime personalizzato. Per rendere l'immagine compatibile con Lambda, devi includere il client di interfaccia di runtime per Node.js nell'immagine. -
Utilizzo di un'immagine non AWS di base
È possibile utilizzare un'immagine di base alternativa da un altro registro del container, come ad esempio Alpine Linux o Debian. Puoi anche utilizzare un'immagine personalizzata creata dalla tua organizzazione. Per rendere l'immagine compatibile con Lambda, devi includere il client di interfaccia di runtime per Node.js nell'immagine.
Suggerimento
Per ridurre il tempo necessario all'attivazione delle funzioni del container Lambda, consulta Utilizzo di compilazioni a più fasi
Questa pagina spiega come creare, testare e implementare le immagini di container per Lambda.
Argomenti
AWS immagini di base per Node.js
AWS fornisce le seguenti immagini di base per Node.js:
Tag | Runtime | Sistema operativo | Dockerfile | Definizione come obsoleto |
---|---|---|---|---|
20 |
Node.js 20 | Amazon Linux 2023 | Dockerfile per Node.js 2.0 e versioni successive GitHub |
Non pianificato |
18 |
Node.js 18 | Amazon Linux 2 | Dockerfile per Node.js 18 in poi GitHub |
31 luglio 2025 |
ECRArchivio Amazon: gallery.ecr.aws/lambda/nodejs
Le immagini di base Node.js 20 e successive si basano sull'immagine minima del contenitore Amazon Linux 2023. Le immagini di base precedenti utilizzavano Amazon Linux 2. AL2023 offre diversi vantaggi rispetto ad Amazon Linux 2, tra cui un ingombro di distribuzione ridotto e versioni aggiornate di librerie come. glibc
AL2Le immagini basate su 023 utilizzano microdnf
(symlinked asdnf
) come gestore di pacchetti anzichéyum
, che è il gestore di pacchetti predefinito in Amazon Linux 2. microdnf
è un'implementazione autonoma di. dnf
Per un elenco dei pacchetti inclusi nelle immagini AL2 basate su 023, consulta le colonne Minimal Container in Confronto dei pacchetti installati su Amazon Linux 2023 Container Images. Per ulteriori informazioni sulle differenze tra AL2 023 e Amazon Linux 2, consulta la sezione Introduzione al runtime di Amazon Linux 2023 AWS Lambda
Nota
Per eseguire immagini AL2 basate su 023 localmente, incluso with AWS Serverless Application Model (AWS SAM), devi usare Docker versione 20.10.10 o successiva.
Utilizzo di un'immagine di base per Node.js AWS
Per completare le fasi riportate in questa sezione, è necessario:
-
Docker
(versione minima 20.10.10 per Node.js 20 e immagini di base successive) -
Node.js
Per creare un'immagine del contenitore da un'immagine di AWS base per Node.js
-
Crea una directory per il progetto, quindi passa a quella directory.
mkdir example cd example
-
Crea un nuovo progetto Node.js con
npm
. Per accettare le opzioni predefinite fornite nell'esperienza interattiva, premiEnter
.npm init
-
Crea un nuovo file denominato
index.js
. A fini di test, puoi utilizzare il codice della funzione di esempio seguente o sostituirlo con il tuo codice personalizzato.Esempio Gestore CommonJS
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
-
Se la tua funzione dipende da librerie diverse da AWS SDK for JavaScript, usa npm
per aggiungerle al tuo pacchetto. -
Crea un nuovo Dockerfile con la seguente configurazione:
-
Imposta la
FROM
proprietà sull'immagine URI di base. -
Usa il COPY comando per copiare il codice della funzione e le dipendenze di runtime in una variabile di
{LAMBDA_TASK_ROOT}
ambiente definita da Lambda. -
Imposta l'argomento
CMD
specificando il gestore della funzione Lambda.
Nota che l'esempio Dockerfile non include un'istruzione. USER
Quando distribuisci un'immagine del contenitore in Lambda, Lambda definisce automaticamente un utente Linux predefinito con le autorizzazioni con privilegi minimi. Questo è diverso dal comportamento standard di Docker, che per impostazione predefinita è l'utente quando non viene fornita alcuna istruzione. root
USER
Esempio Dockerfile
FROM
public.ecr.aws/lambda/nodejs:20
# Copy function code COPYindex.js
${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "index.handler
" ] -
-
Crea l'immagine Docker con il comando docker build
. L'esempio seguente assegna un nome all'immagine docker-image
e le assegna il tagtest
.docker build --platform linux/amd64 -t
docker-image
:test
.Nota
Il comando specifica l’opzione
--platform linux/amd64
per garantire che il container sia compatibile con l'ambiente di esecuzione di Lambda, indipendentemente dall'architettura della macchina di sviluppo. Se intendi creare una funzione Lambda utilizzando l'architettura del set di ARM64 istruzioni, assicurati di modificare il comando per utilizzare invece l'--platform linux/arm64
opzione.
-
Avvia l'immagine Docker con il comando docker run. In questo esempio,
docker-image
è il nome dell'immagine etest
è il tag.docker run --platform linux/amd64 -p 9000:8080 --read-only
docker-image
:test
Questo comando esegue l'immagine come container e crea un endpoint locale in
localhost:9000/2015-03-31/functions/function/invocations
.Nota
Se hai creato l'immagine Docker per l'architettura del set di ARM64 istruzioni, assicurati di utilizzare l'
--platform linux/
opzione invece di.arm64
--platform linux/
amd64
-
Da una nuova finestra di terminale, invia un evento all'endpoint locale.
-
Ottieni l'ID del container.
docker ps
-
Utilizza il comando docker kill
per arrestare il container. In questo comando, sostituisci 3766c4ab331c
con l'ID del container del passaggio precedente.docker kill
3766c4ab331c
Per caricare l'immagine su Amazon ECR e creare la funzione Lambda
-
Esegui il get-login-password
comando per autenticare il Docker nel CLI tuo registro AmazonECR. -
Imposta il
--region
valore nel Regione AWS punto in cui desideri creare il ECR repository Amazon. -
111122223333
Sostituiscilo con il tuo Account AWS ID.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Crea un repository in Amazon ECR utilizzando il comando create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENota
Il ECR repository Amazon deve corrispondere alla funzione Regione AWS Lambda.
In caso di esito positivo, dovresti ottenere una risposta simile a questa:
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
Copia il
repositoryUri
dall'output del passaggio precedente. -
Esegui il comando docker tag
per taggare la tua immagine locale nel tuo ECR repository Amazon come versione più recente. In questo comando: -
docker-image:test
è il nome e il tagdella tua immagine Docker. Si tratta del nome e del tag dell'immagine che hai specificato nel docker build
comando. -
Sostituisci l’
<ECRrepositoryUri>
con l’repositoryUri
copiato. Assicurati di includere:latest
alla fine diURI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestEsempio:
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Esegui il comando docker push
per distribuire l'immagine locale nel repository Amazon. ECR Assicurati di includerla alla :latest
fine del repository. URIdocker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Crea un ruolo di esecuzione per la funzione, se non lo hai già fatto. Nella fase successiva è necessario l'Amazon Resource Name (ARN) del ruolo.
-
Creazione della funzione Lambda Per
ImageUri
, specifica il repository URI di cui hai parlato in precedenza. Assicurati di includere:latest
alla fine di. URIaws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Nota
È possibile creare una funzione utilizzando un'immagine in un AWS account diverso, purché l'immagine si trovi nella stessa regione della funzione Lambda. Per ulteriori informazioni, consulta Autorizzazioni Amazon ECR per più account.
-
Richiama la funzione.
aws lambda invoke --function-name
hello-world
response.jsonDovresti ottenere una risposta simile a questa:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Per vedere l'output della funzione, controlla il file
response.json
.
Per aggiornare il codice della funzione, devi creare nuovamente l'immagine, caricare la nuova immagine nel ECR repository Amazon e quindi utilizzare il update-function-code
Lambda risolve il tag image in un digest di immagini specifico. Ciò significa che se punti il tag di immagine utilizzato per distribuire la funzione su una nuova immagine in AmazonECR, Lambda non aggiorna automaticamente la funzione per utilizzare la nuova immagine.
Per distribuire la nuova immagine nella stessa funzione Lambda, devi usare update-function-code--publish
opzione crea una nuova versione della funzione utilizzando l'immagine del contenitore aggiornata.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish
Utilizzo di un'immagine di base alternativa con il client di interfaccia di runtime
Se utilizzi un'immagine di base solo per il sistema operativo o un'immagine di base alternativa, devi includere il client dell'interfaccia di runtime nell'immagine. Il client dell'interfaccia di runtime estende l'Utilizzo del runtime Lambda API per runtime personalizzati, che gestisce l'interazione tra Lambda e il codice della funzione.
Installa il client di interfaccia di runtime per Node.js
npm install aws-lambda-ric
È inoltre possibile scaricare il client dell'interfaccia di runtime Node.js
14.x
16.x
18.x
20.x
L'esempio seguente dimostra come creare un'immagine contenitore per Node.js utilizzando un'immagine non di AWS base. Il Dockerfile di esempio utilizza l'immagine di base buster
. Il Dockerfile include il client di interfaccia di runtime.
Per completare le fasi riportate in questa sezione, è necessario:
Per creare un'immagine del contenitore da un'immagine non di AWS base
-
Crea una directory per il progetto, quindi passa a quella directory.
mkdir example cd example
-
Crea un nuovo progetto Node.js con
npm
. Per accettare le opzioni predefinite fornite nell'esperienza interattiva, premiEnter
.npm init
-
Crea un nuovo file denominato
index.js
. A fini di test, puoi utilizzare il codice della funzione di esempio seguente o sostituirlo con il tuo codice personalizzato.Esempio Gestore CommonJS
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
-
Crea un nuovo Dockerfile. Il seguente Dockerfile utilizza un'immagine di base
buster
anziché un'immagine di base AWS. Il Dockerfile include il client di interfaccia di runtime, che rende l'immagine compatibile con Lambda. Il seguente Dockerfile utilizza una build multi-fase . Nella prima fase viene creata un'immagine della build, che è un ambiente Node.js standard in cui sono installate le dipendenze della funzione. Nella seconda fase viene creata un'immagine più leggera con il codice della funzione e le relative dipendenze. Ciò riduce la dimensione finale dell'immagine. -
Imposta la proprietà
FROM
sull'identificativo dell'immagine di base. -
Utilizza il comando
COPY
per copiare il codice della funzione e le dipendenze di runtime. -
Imposta l'
ENTRYPOINT
sul modulo su cui desideri che il container Docker venga eseguito all'avvio. In questo caso, il modulo è il client di interfaccia di runtime. -
Imposta l'argomento
CMD
specificando il gestore della funzione Lambda.
Nota che l'esempio Dockerfile non include un'USERistruzione.
Quando distribuisci un'immagine del contenitore in Lambda, Lambda definisce automaticamente un utente Linux predefinito con le autorizzazioni con privilegi minimi. Questo è diverso dal comportamento standard di Docker, che per impostazione predefinita è l'utente quando non viene fornita alcuna istruzione. root
USER
Esempio Dockerfile
# Define custom function directory ARG FUNCTION_DIR="/function" FROM
node:20-buster
as build-image # Include global arg in this stage of the build ARG FUNCTION_DIR # Install build dependencies RUN apt-get update && \ apt-get install -y \ g++ \ make \ cmake \ unzip \ libcurl4-openssl-dev # Copy function code RUN mkdir -p ${FUNCTION_DIR} COPY . ${FUNCTION_DIR} WORKDIR ${FUNCTION_DIR} # Install Node.js dependencies RUN npm install # Install the runtime interface client RUN npm install aws-lambda-ric # Grab a fresh slim copy of the image to reduce the final size FROMnode:20-buster-slim
# Required for Node runtimes which use npm@8.6.0+ because # by default npm writes logs under /home/.npm and Lambda fs is read-only ENV NPM_CONFIG_CACHE=/tmp/.npm # Include global arg in this stage of the build ARG FUNCTION_DIR # Set working directory to function root directory WORKDIR ${FUNCTION_DIR} # Copy in the built dependencies COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} # Set runtime interface client as default command for the container runtime ENTRYPOINT ["/usr/local/bin/npx", "aws-lambda-ric"
] # Pass the name of the function handler as an argument to the runtime CMD ["index.handler
"] -
-
Crea l'immagine Docker con il comando docker build
. L'esempio seguente assegna un nome all'immagine docker-image
e le assegna il tagtest
.docker build --platform linux/amd64 -t
docker-image
:test
.Nota
Il comando specifica l’opzione
--platform linux/amd64
per garantire che il container sia compatibile con l'ambiente di esecuzione di Lambda, indipendentemente dall'architettura della macchina di sviluppo. Se intendi creare una funzione Lambda utilizzando l'architettura del set di ARM64 istruzioni, assicurati di modificare il comando per utilizzare invece l'--platform linux/arm64
opzione.
Usa il simulatore dell'interfaccia di runtime
Installazione ed esecuzione dell'emulatore di interfaccia di runtime sul computer locale
-
Dalla directory del progetto, esegui il comando seguente per scaricare l'emulatore di interfaccia di runtime (architettura x86-64) GitHub e installarlo sul computer locale.
-
Avvia l'immagine Docker con il comando docker run. Tieni presente quanto segue:
-
docker-image
è il nome dell'immagine etest
è il tag. -
/usr/local/bin/npx aws-lambda-ric index.handler
è l'ENTRYPOINT
seguito dalCMD
del Dockerfile.
Questo comando esegue l'immagine come container e crea un endpoint locale in
localhost:9000/2015-03-31/functions/function/invocations
.Nota
Se hai creato l'immagine Docker per l'architettura del set di ARM64 istruzioni, assicurati di utilizzare l'
--platform linux/
opzione anziché.arm64
--platform linux/
amd64
-
-
Pubblica un evento nell'endpoint locale.
-
Ottieni l'ID del container.
docker ps
-
Utilizza il comando docker kill
per arrestare il container. In questo comando, sostituisci 3766c4ab331c
con l'ID del container del passaggio precedente.docker kill
3766c4ab331c
Per caricare l'immagine su Amazon ECR e creare la funzione Lambda
-
Esegui il get-login-password
comando per autenticare il Docker nel CLI tuo registro AmazonECR. -
Imposta il
--region
valore nel Regione AWS punto in cui desideri creare il ECR repository Amazon. -
111122223333
Sostituiscilo con il tuo Account AWS ID.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Crea un repository in Amazon ECR utilizzando il comando create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENota
Il ECR repository Amazon deve corrispondere alla funzione Regione AWS Lambda.
In caso di esito positivo, dovresti ottenere una risposta simile a questa:
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
Copia il
repositoryUri
dall'output del passaggio precedente. -
Esegui il comando docker tag
per taggare la tua immagine locale nel tuo ECR repository Amazon come versione più recente. In questo comando: -
docker-image:test
è il nome e il tagdella tua immagine Docker. Si tratta del nome e del tag dell'immagine che hai specificato nel docker build
comando. -
Sostituisci l’
<ECRrepositoryUri>
con l’repositoryUri
copiato. Assicurati di includere:latest
alla fine diURI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestEsempio:
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Esegui il comando docker push
per distribuire l'immagine locale nel repository Amazon. ECR Assicurati di includerla alla :latest
fine del repository. URIdocker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Crea un ruolo di esecuzione per la funzione, se non lo hai già fatto. Nella fase successiva è necessario l'Amazon Resource Name (ARN) del ruolo.
-
Creazione della funzione Lambda Per
ImageUri
, specifica il repository URI di cui hai parlato in precedenza. Assicurati di includere:latest
alla fine di. URIaws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Nota
È possibile creare una funzione utilizzando un'immagine in un AWS account diverso, purché l'immagine si trovi nella stessa regione della funzione Lambda. Per ulteriori informazioni, consulta Autorizzazioni Amazon ECR per più account.
-
Richiama la funzione.
aws lambda invoke --function-name
hello-world
response.jsonDovresti ottenere una risposta simile a questa:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Per vedere l'output della funzione, controlla il file
response.json
.
Per aggiornare il codice della funzione, devi creare nuovamente l'immagine, caricare la nuova immagine nel ECR repository Amazon e quindi utilizzare il update-function-code
Lambda risolve il tag image in un digest di immagini specifico. Ciò significa che se punti il tag di immagine utilizzato per distribuire la funzione su una nuova immagine in AmazonECR, Lambda non aggiorna automaticamente la funzione per utilizzare la nuova immagine.
Per distribuire la nuova immagine nella stessa funzione Lambda, devi usare update-function-code--publish
opzione crea una nuova versione della funzione utilizzando l'immagine del contenitore aggiornata.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish