Skip to content

AWS Lambda é um serviço de computação serverless que permite executar código sem provisionar ou gerenciar servidores.

Neste guia, vamos implantar um servidor HTTP Bun no AWS Lambda usando um Dockerfile.

NOTE

Antes de continuar, certifique-se de ter:
  • Uma aplicação Bun pronta para implantação
  • Uma conta AWS
  • AWS CLI instalado e configurado
  • Docker instalado e adicionado ao seu PATH

Criar um novo Dockerfile

Certifique-se de estar no diretório contendo seu projeto e crie um novo Dockerfile na raiz do seu projeto. Este arquivo contém as instruções para inicializar o container, copiar os arquivos do projeto local, instalar dependências e iniciar a aplicação.

docker
# Use a imagem oficial do adaptador AWS Lambda para lidar com o runtime Lambda
FROM public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 AS aws-lambda-adapter

# Use a imagem oficial do Bun para executar a aplicação
FROM oven/bun:debian AS bun_latest

# Copie o adaptador Lambda para dentro do container
COPY --from=aws-lambda-adapter /lambda-adapter /opt/extensions/lambda-adapter

# Defina a porta como 8080. Isso é necessário para o adaptador AWS Lambda.
ENV PORT=8080

# Defina o diretório de trabalho como `/var/task`. Este é o diretório de trabalho padrão do Lambda.
WORKDIR "/var/task"

# Copie o package.json e bun.lock para dentro do container
COPY package.json bun.lock ./

# Instale as dependências
RUN bun install --production --frozen-lockfile

# Copie o restante da aplicação para dentro do container
COPY . /var/task

# Execute a aplicação.
CMD ["bun", "index.ts"]

NOTE

Certifique-se de que o comando de início corresponde ao ponto de entrada da sua aplicação. Isso também pode ser `CMD ["bun", "run", "start"]` se você tiver um script start no seu `package.json`.

Esta imagem instala dependências e executa sua aplicação com Bun dentro de um container. Se sua aplicação não tiver dependências, você pode omitir a linha RUN bun install --production --frozen-lockfile.

Crie um novo arquivo .dockerignore na raiz do seu projeto. Este arquivo contém os arquivos e diretórios que devem ser excluídos da imagem do container, como node_modules. Isso torna seus builds mais rápidos e menores:

docker
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# Quaisquer outros arquivos ou diretórios que você deseja excluir

Build da imagem Docker

Certifique-se de estar no diretório contendo seu Dockerfile e faça o build da imagem Docker. Neste caso, vamos chamar a imagem de bun-lambda-demo e taguear como latest.

bash
# cd /path/to/your/app
docker build --provenance=false --platform linux/amd64 -t bun-lambda-demo:latest .

Criar um repositório ECR

Para enviar a imagem para o AWS Lambda, primeiro precisamos criar um repositório ECR para enviar a imagem.

Ao executar o comando a seguir, nós:

  • Criamos um repositório ECR chamado bun-lambda-demo na região us-east-1
  • Obtemos o URI do repositório e exportamos o URI do repositório como uma variável de ambiente. Isso é opcional, mas torna os próximos passos mais fáceis.
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 você estiver usando IAM Identity Center (SSO) ou configurou o AWS CLI com perfis, precisará adicionar a flag `--profile` aos seus comandos AWS CLI.

Por exemplo, se seu perfil for chamado my-sso-app, use --profile my-sso-app. Verifique sua configuração AWS CLI com aws configure list-profiles para ver os perfis disponíveis.

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

Autenticar com o repositório ECR

Faça login no repositório ECR:

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

NOTE

Se estiver usando um perfil, use a flag `--profile`:
bash
aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URI

Tag e push da imagem docker para o repositório ECR

Certifique-se de estar no diretório contendo seu Dockerfile e tagueie a imagem docker com o URI do repositório ECR.

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

Em seguida, envie a imagem para o repositório ECR.

bash
docker push ${ECR_URI}:latest

Criar uma função AWS Lambda

Vá para AWS Console > Lambda > Create Function > Selecione Container image

Create Function

Dê um nome à função, como my-bun-function.

Selecionar a imagem do container

Em seguida, vá para a seção Container image URI, clique em Browse images. Selecione a imagem que acabamos de enviar para o repositório ECR.

Select Container Repository

Em seguida, selecione a imagem latest e clique em Select image.

Select Container Image

Configurar a função

Para obter uma URL pública para a função, precisamos ir para Additional configurations > Networking > Function URL.

Defina isso como Enable, com Auth Type NONE.

Set the Function URL

Criar a função

Clique em Create function na parte inferior da página, isso criará a função.

Create Function

Obter a URL da função

Depois que a função for criada, você será redirecionado para a página da função, onde pode ver a URL da função na seção "Function URL".

Function URL

Testar a função

🥳 Sua aplicação está agora online! Para testar a função, você pode ir para a aba Test ou chamar a URL da função diretamente.

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

Bun by www.bunjs.com.cn edit