AWS Lambda es un servicio de computación sin servidor que te permite ejecutar código sin aprovisionar ni administrar servidores.
En esta guía, desplegaremos un servidor HTTP de Bun en AWS Lambda usando un Dockerfile.
NOTE
Antes de continuar, asegúrate de tener:- Una aplicación Bun lista para desplegar
- Una cuenta de AWS
- AWS CLI instalado y configurado
- Docker instalado y agregado a tu
PATH
Crear un nuevo Dockerfile
Asegúrate de estar en el directorio que contiene tu proyecto, luego crea un nuevo Dockerfile en la raíz de tu proyecto. Este archivo contiene las instrucciones para inicializar el contenedor, copiar los archivos de tu proyecto local, instalar dependencias e iniciar la aplicación.
# Usar la imagen oficial del adaptador de AWS Lambda para manejar el runtime de Lambda
FROM public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 AS aws-lambda-adapter
# Usar la imagen oficial de Bun para ejecutar la aplicación
FROM oven/bun:debian AS bun_latest
# Copiar el adaptador de Lambda dentro del contenedor
COPY --from=aws-lambda-adapter /lambda-adapter /opt/extensions/lambda-adapter
# Establecer el puerto en 8080. Esto es requerido para el adaptador de AWS Lambda.
ENV PORT=8080
# Establecer el directorio de trabajo en `/var/task`. Este es el directorio de trabajo predeterminado para Lambda.
WORKDIR "/var/task"
# Copiar el package.json y bun.lock dentro del contenedor
COPY package.json bun.lock ./
# Instalar las dependencias
RUN bun install --production --frozen-lockfile
# Copiar el resto de la aplicación dentro del contenedor
COPY . /var/task
# Ejecutar la aplicación.
CMD ["bun", "index.ts"]NOTE
Asegúrate de que el comando de inicio corresponda al punto de entrada de tu aplicación. Esto también puede ser `CMD ["bun", "run", "start"]` si tienes un script de inicio en tu `package.json`.Esta imagen instala dependencias y ejecuta tu aplicación con Bun dentro de un contenedor. Si tu aplicación no tiene dependencias, puedes omitir la línea RUN bun install --production --frozen-lockfile.
Crea un nuevo archivo .dockerignore en la raíz de tu proyecto. Este archivo contiene los archivos y directorios que deben ser excluidos de la imagen del contenedor, como node_modules. Esto hace que tus builds sean más rápidos y pequeños:
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# Cualquier otro archivo o directorio que quieras excluirConstruir la imagen de Docker
Asegúrate de estar en el directorio que contiene tu Dockerfile, luego construye la imagen de Docker. En este caso, llamaremos a la imagen bun-lambda-demo y la etiquetaremos como latest.
# cd /path/to/your/app
docker build --provenance=false --platform linux/amd64 -t bun-lambda-demo:latest .Crear un repositorio ECR
Para enviar la imagen a AWS Lambda, primero necesitamos crear un repositorio ECR para enviar la imagen.
Al ejecutar el siguiente comando:
- Creamos un repositorio ECR llamado
bun-lambda-demoen la regiónus-east-1 - Obtenemos el URI del repositorio y exportamos el URI del repositorio como una variable de entorno. Esto es opcional, pero hace que los siguientes pasos sean más fáciles.
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
Si estás usando IAM Identity Center (SSO) o has configurado AWS CLI con perfiles, necesitarás agregar el flag `--profile` a tus comandos de AWS CLI.Por ejemplo, si tu perfil se llama my-sso-app, usa --profile my-sso-app. Verifica tu configuración de AWS CLI con aws configure list-profiles para ver los perfiles disponibles.
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_URIAutenticarse con el repositorio ECR
Inicia sesión en el repositorio ECR:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_URILogin SucceededNOTE
Si estás usando un perfil, usa el flag `--profile`:aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URIEtiquetar y enviar la imagen de docker al repositorio ECR
Asegúrate de estar en el directorio que contiene tu Dockerfile, luego etiqueta la imagen de docker con el URI del repositorio ECR.
docker tag bun-lambda-demo:latest ${ECR_URI}:latestLuego, envía la imagen al repositorio ECR.
docker push ${ECR_URI}:latestCrear una función de AWS Lambda
Ve a AWS Console > Lambda > Create Function > Selecciona Container image

Dale un nombre a la función, como my-bun-function.
Seleccionar la imagen del contenedor
Luego, ve a la sección Container image URI, haz clic en Browse images. Selecciona la imagen que acabamos de enviar al repositorio ECR.

Luego, selecciona la imagen latest y haz clic en Select image.

Configurar la función
Para obtener una URL pública para la función, necesitamos ir a Additional configurations > Networking > Function URL.
Establece esto en Enable, con Auth Type NONE.

Crear la función
Haz clic en Create function en la parte inferior de la página, esto creará la función.

Obtener la URL de la función
Una vez que se haya creado la función, serás redirigido a la página de la función, donde puedes ver la URL de la función en la sección "Function URL".

Probar la función
🥳 ¡Tu aplicación está ahora en vivo! Para probar la función, puedes ir a la pestaña Test o llamar directamente a la URL de la función.
curl -X GET https://[your-function-id].lambda-url.us-east-1.on.aws/Hello from Bun on Lambda!