Skip to content

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:

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.

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

docker
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# Cualquier otro archivo o directorio que quieras excluir

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

bash
# 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-demo en la región us-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.
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

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.

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

Autenticarse con el repositorio ECR

Inicia sesión en el repositorio ECR:

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

NOTE

Si estás usando un perfil, usa el flag `--profile`:
bash
aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URI

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

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

Luego, envía la imagen al repositorio ECR.

bash
docker push ${ECR_URI}:latest

Crear una función de AWS Lambda

Ve a AWS Console > Lambda > Create Function > Selecciona Container image

Crear Función

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.

Seleccionar Repositorio de Contenedor

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

Seleccionar Imagen del Contenedor

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.

Establecer la URL de la Función

Crear la función

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

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

URL de la Función

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.

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

Bun por www.bunjs.com.cn editar