Skip to content

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.

docker
# 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:

docker
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# Qualsiasi altro file o directory che vuoi escludere

Costruire 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.

bash
# 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-demo nella regione us-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.
bash
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --query 'repository.repositoryUri' --output text)
echo $ECR_URI
txt
[id].dkr.ecr.us-east-1.amazonaws.com/bun-lambda-demo

NOTE

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.

bash
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_URI

Autenticarsi con il repository ECR

Accedi al repository ECR:

bash
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_URI
txt
Login Succeeded

NOTE

Se stai usando un profilo, usa il flag `--profile`:
bash
aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URI

Taggare 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.

bash
docker tag bun-lambda-demo:latest ${ECR_URI}:latest

Poi, spingi l'immagine nel repository ECR.

bash
docker push ${ECR_URI}:latest

Creare una funzione AWS Lambda

Vai su AWS Console > Lambda > Create Function > Seleziona Container image

Create Function

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.

Select Container Repository

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

Select Container 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.

Set the Function URL

Creare la funzione

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

Create Function

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".

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.

bash
curl -X GET https://[your-function-id].lambda-url.us-east-1.on.aws/
txt
Hello from Bun on Lambda!

Bun a cura di www.bunjs.com.cn