AWS Lambda è un servizio di calcolo serverless che consente di eseguire codice senza provisioning o gestione di server.
In questa guida, distribuiremo un server HTTP Bun su AWS Lambda usando un Dockerfile.
NOTE
Prima di continuare, assicurati di avere:- Un'applicazione Bun pronta per la distribuzione
- Un account AWS
- AWS CLI installato e configurato
- Docker installato e aggiunto al tuo
PATH
Creare un nuovo Dockerfile
Assicurati di essere nella directory contenente il tuo progetto, poi crea un nuovo Dockerfile nella root del tuo progetto. Questo file contiene le istruzioni per inizializzare il container, copiare i file del progetto locale, installare le dipendenze e avviare l'applicazione.
# Usa l'immagine ufficiale dell'adattatore AWS Lambda per gestire il runtime Lambda
FROM public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 AS aws-lambda-adapter
# Usa l'immagine ufficiale Bun per eseguire l'applicazione
FROM oven/bun:debian AS bun_latest
# Copia l'adattatore Lambda nel container
COPY --from=aws-lambda-adapter /lambda-adapter /opt/extensions/lambda-adapter
# Imposta la porta su 8080. Questo è richiesto per l'adattatore AWS Lambda.
ENV PORT=8080
# Imposta la directory di lavoro su `/var/task`. Questa è la directory di lavoro predefinita per Lambda.
WORKDIR "/var/task"
# Copia il package.json e bun.lock nel container
COPY package.json bun.lock ./
# Installa le dipendenze
RUN bun install --production --frozen-lockfile
# Copia il resto dell'applicazione nel container
COPY . /var/task
# Esegui l'applicazione.
CMD ["bun", "index.ts"]NOTE
Assicurati che il comando di avvio corrisponda al punto di ingresso della tua applicazione. Questo può anche essere `CMD ["bun", "run", "start"]` se hai uno script di avvio nel tuo `package.json`.Questa immagine installa le dipendenze ed esegue la tua app con Bun all'interno di un container. Se la tua app non ha dipendenze, puoi omettere la riga RUN bun install --production --frozen-lockfile.
Crea un nuovo file .dockerignore nella root del tuo progetto. Questo file contiene i file e le directory che dovrebbero essere esclusi dall'immagine del container, come node_modules. Questo rende le tue build più veloci e più piccole:
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# Qualsiasi altro file o directory che vuoi escludereCostruire l'immagine Docker
Assicurati di essere nella directory contenente il tuo Dockerfile, poi costruisci l'immagine Docker. In questo caso, chiameremo l'immagine bun-lambda-demo e la taggheremo come latest.
# cd /path/to/your/app
docker build --provenance=false --platform linux/amd64 -t bun-lambda-demo:latest .Creare un repository ECR
Per spingere l'immagine su AWS Lambda, dobbiamo prima creare un repository ECR per spingere l'immagine.
Eseguendo il seguente comando:
- Creiamo un repository ECR chiamato
bun-lambda-demonella regioneus-east-1 - Otteniamo l'URI del repository ed esportiamo l'URI del repository come variabile d'ambiente. Questo è opzionale, ma rende i passaggi successivi più facili.
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --query 'repository.repositoryUri' --output text)
echo $ECR_URI[id].dkr.ecr.us-east-1.amazonaws.com/bun-lambda-demoNOTE
Se stai usando IAM Identity Center (SSO) o hai configurato AWS CLI con profili, dovrai aggiungere il flag `--profile` ai tuoi comandi AWS CLI.Ad esempio, se il tuo profilo si chiama my-sso-app, usa --profile my-sso-app. Controlla la tua configurazione AWS CLI con aws configure list-profiles per vedere i profili disponibili.
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --profile my-sso-app --query 'repository.repositoryUri' --output text)
echo $ECR_URIAutenticarsi con il repository ECR
Accedi al repository ECR:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_URILogin SucceededNOTE
Se stai usando un profilo, usa il flag `--profile`:aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URITaggare e spingere l'immagine docker nel repository ECR
Assicurati di essere nella directory contenente il tuo Dockerfile, poi tagga l'immagine docker con l'URI del repository ECR.
docker tag bun-lambda-demo:latest ${ECR_URI}:latestPoi, spingi l'immagine nel repository ECR.
docker push ${ECR_URI}:latestCreare una funzione AWS Lambda
Vai su AWS Console > Lambda > Create Function > Seleziona Container image

Dai un nome alla funzione, come my-bun-function.
Selezionare l'immagine del container
Poi, vai alla sezione Container image URI, clicca su Browse images. Seleziona l'immagine che abbiamo appena spinto nel repository ECR.

Poi, seleziona l'immagine latest e clicca su Select image.

Configurare la funzione
Per ottenere un URL pubblico per la funzione, dobbiamo andare su Additional configurations > Networking > Function URL.
Imposta questo su Enable, con Auth Type NONE.

Creare la funzione
Clicca su Create function in fondo alla pagina, questo creerà la funzione.

Ottenere l'URL della funzione
Una volta creata la funzione, verrai reindirizzato alla pagina della funzione, dove puoi vedere l'URL della funzione nella sezione "Function URL".

Testare la funzione
🥳 La tua app è ora online! Per testare la funzione, puoi andare alla scheda Test o chiamare direttamente l'URL della funzione.
curl -X GET https://[your-function-id].lambda-url.us-east-1.on.aws/Hello from Bun on Lambda!