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