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à.
Distribuire codice TypeScript trasformato in Lambda con immagini di container
È possibile distribuire il codice TypeScript in una funzione AWS Lambda come un'immagine di container Node.js. AWS fornisce immagini di base per Node.js per consentire la creazione dell'immagine di container. Queste immagini di base sono precaricate con un runtime di lingua e altri componenti necessari per eseguire l'immagine su Lambda. AWS fornisce un Dockerfile per ciascuna delle immagini di base per aiutare nella creazione dell'immagine di container.
Se si utilizza un'immagine di base di community o aziendale privata, è necessario aggiungere il client di interfaccia di runtime (RIC) Node.js all'immagine di base per renderla compatibile con Lambda.
Lambda fornisce un emulatore di interfaccia di runtime per i test in locale. Le immagini di base AWS per Node.js includono l'emulatore di interfaccia di runtime. Se utilizzi un'immagine di base alternativa, come Alpine Linux o Debian, puoi creare il simulatore nella tua immagine
Utilizzo di un'immagine di base Node.js per creare e compilare il codice funzione TypeScript
Per completare le fasi riportate in questa sezione, è necessario:
-
Node.js 22.x
Per creare un'immagine da un'immagine di base AWS per Lambda
-
Sul tuo computer locale, crea una directory di progetto per la nuova funzione.
-
Crea un nuovo progetto Node.js con
npm
o un gestore di pacchetti a tua scelta.npm init
-
Aggiungi i pacchetti @types/aws-lambda
e esbuild come dipendenze di sviluppo. Il pacchetto @types/aws-lambda
contiene le definizioni dei tipi per Lambda.npm install -D @types/aws-lambda esbuild
-
Aggiungi uno script di compilazione
al file package.json
."scripts": { "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js" }
-
Crea un nuovo file denominato
index.ts
. Aggiungi il codice di esempio seguente al nuovo file. Questo è il codice per la funzione Lambda. La funzione restituisce un messaggiohello world
.Nota
L'istruzione
import
importa le definizioni dei tipi da @types/aws-lambda. Non importa il pacchetto NPM aws-lambda
, che è uno strumento di terzi non correlato. Per ulteriori informazioni, consulta aws-lambdanel repository GitHub DefinitelyTyped. import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda'; export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { console.log(`Event: ${JSON.stringify(event, null, 2)}`); console.log(`Context: ${JSON.stringify(context, null, 2)}`); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
-
Crea un nuovo Dockerfile con la seguente configurazione:
-
Imposta la proprietà
FROM
sull'URI dell'immagine di base. -
Imposta l'argomento
CMD
per specificare il gestore della funzione Lambda.
Il seguente Dockerfile di esempio utilizza una build multi-fase. Il primo passaggio trasforma il codice TypeScript in JavaScript. Il secondo passaggio produce un'immagine di container che contiene solo file JavaScript e dipendenze di produzione.
Nota che l'esempio Dockerfile non include un'istruzione USER
. Quando implementi un'immagine di container su Lambda, Lambda definisce automaticamente un utente Linux predefinito con autorizzazioni con privilegi minimi. Questo è diverso dal comportamento standard di Docker, che per impostazione predefinita è l'utente root
quando non viene fornita alcuna istruzioneUSER
.Esempio Dockerfile
FROM public.ecr.aws/lambda/nodejs:22 as builder WORKDIR /usr/app COPY package.json index.ts ./ RUN npm install RUN npm run build FROM public.ecr.aws/lambda/nodejs:22 WORKDIR ${LAMBDA_TASK_ROOT} COPY --from=builder /usr/app/dist/* ./ 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. Per creare una funzione Lambda utilizzando l'architettura del set di istruzioni ARM64, accertati di modificare il comando per utilizzare l'opzione--platform linux/arm64
.
-
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
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
Per creare l'immagine Docker per l'architettura del set di istruzioni ARM64, assicurati di utilizzare l'opzione
--platform linux/
anziché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
Caricamento dell'immagine su Amazon ECR e creazione della funzione Lambda
-
Per autenticare la CLI Docker nel registro Amazon ECR, esegui il comando get-login-password
. -
Imposta il valore di
--region
sulla Regione AWS in cui desideri creare il repository Amazon ECR. -
Sostituisci
111122223333
con l'ID dell'Account AWS.
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 commando create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENota
Il repository Amazon ECR deve essere nella stessa Regione AWS della funzione 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 etichettare l'immagine locale nel repository Amazon ECR come versione più recente. In questo comando: -
docker-image:test
è il nome e tagdell'immagine Docker. Si tratta del nome e del tag dell'immagine specificati nel comando docker build
. -
Sostituisci l'
<ECRrepositoryUri>
con l'repositoryUri
copiato. Assicurati di includere:latest
alla fine dell'URI.
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 implementare la tua immagine locale sul repository Amazon ECR. Assicurati di includere :latest
alla fine dell'URI del repository.docker 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. Il nome della risorsa Amazon (ARN) del ruolo ti occorrerà nel passaggio successivo.
-
Creazione della funzione Lambda Per
ImageUri
, specifica l'URI del repository creato in precedenza. Assicurati di includere:latest
alla fine dell'URI.aws 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 account AWS 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 repository Amazon ECR e quindi utilizzare il comando update-function-code
Lambda risolve il tag dell'immagine in un digest di immagine specifico. Ciò significa che se punti il tag immagine utilizzato per implementare la funzione su una nuova immagine in Amazon ECR, Lambda non aggiorna automaticamente la funzione per utilizzare la nuova immagine.
Per implementare la nuova immagine nella stessa funzione Lambda, devi utilizzare il comando update-function-code--publish
crea una nuova versione della funzione utilizzando l'immagine del container aggiornata.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish