Skip to content

AWS Lambda ist ein serverloser Compute-Dienst, mit dem Sie Code ausführen können, ohne Server bereitstellen oder verwalten zu müssen.

In dieser Anleitung stellen wir einen Bun-HTTP-Server mit einer Dockerfile auf AWS Lambda bereit.

NOTE

Bevor Sie fortfahren, stellen Sie sicher, dass Sie Folgendes haben:
  • Eine Bun-Anwendung, die zur Bereitstellung bereit ist
  • Ein AWS-Konto
  • AWS CLI installiert und konfiguriert
  • Docker installiert und zu Ihrem PATH hinzugefügt

Eine neue Dockerfile erstellen

Stellen Sie sicher, dass Sie sich im Verzeichnis mit Ihrem Projekt befinden, und erstellen Sie dann eine neue Dockerfile im Stammverzeichnis Ihres Projekts. Diese Datei enthält die Anweisungen zum Initialisieren des Containers, zum Kopieren Ihrer lokalen Projektdateien, zum Installieren von Abhängigkeiten und zum Starten der Anwendung.

docker
# Verwenden Sie das offizielle AWS Lambda-Adapter-Image zur Handhabung der Lambda-Laufzeitumgebung
FROM public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 AS aws-lambda-adapter

# Verwenden Sie das offizielle Bun-Image zum Ausführen der Anwendung
FROM oven/bun:debian AS bun_latest

# Kopieren Sie den Lambda-Adapter in den Container
COPY --from=aws-lambda-adapter /lambda-adapter /opt/extensions/lambda-adapter

# Legen Sie den Port auf 8080 fest. Dies ist für den AWS Lambda-Adapter erforderlich.
ENV PORT=8080

# Setzen Sie das Arbeitsverzeichnis auf `/var/task`. Dies ist das Standard-Arbeitsverzeichnis für Lambda.
WORKDIR "/var/task"

# Kopieren Sie die package.json und bun.lock in den Container
COPY package.json bun.lock ./

# Installieren Sie die Abhängigkeiten
RUN bun install --production --frozen-lockfile

# Kopieren Sie den Rest der Anwendung in den Container
COPY . /var/task

# Führen Sie die Anwendung aus.
CMD ["bun", "index.ts"]

NOTE

Stellen Sie sicher, dass der Startbefehl dem Einstiegspunkt Ihrer Anwendung entspricht. Dies kann auch `CMD ["bun", "run", "start"]` sein, wenn Sie ein Start-Skript in Ihrer `package.json` haben.

Dieses Image installiert Abhängigkeiten und führt Ihre App mit Bun in einem Container aus. Wenn Ihre App keine Abhängigkeiten hat, können Sie die Zeile RUN bun install --production --frozen-lockfile weglassen.

Erstellen Sie eine neue .dockerignore-Datei im Stammverzeichnis Ihres Projekts. Diese Datei enthält die Dateien und Verzeichnisse, die vom Container-Image ausgeschlossen werden sollten, wie z.B. node_modules. Dies macht Ihre Builds schneller und kleiner:

docker
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# Alle anderen Dateien oder Verzeichnisse, die Sie ausschließen möchten

Das Docker-Image erstellen

Stellen Sie sicher, dass Sie sich im Verzeichnis mit Ihrer Dockerfile befinden, und erstellen Sie dann das Docker-Image. In diesem Fall nennen wir das Image bun-lambda-demo und taggen es als latest.

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

Ein ECR-Repository erstellen

Um das Image zu AWS Lambda zu pushen, müssen wir zuerst ein ECR-Repository erstellen, in das wir das Image pushen können.

Mit dem folgenden Befehl:

  • Erstellen wir ein ECR-Repository namens bun-lambda-demo in der Region us-east-1
  • Holen wir die Repository-URI und exportieren die Repository-URI als Umgebungsvariable. Dies ist optional, erleichtert aber die nächsten Schritte.
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

Wenn Sie IAM Identity Center (SSO) verwenden oder AWS CLI mit Profilen konfiguriert haben, müssen Sie das `--profile`-Flag zu Ihren AWS CLI-Befehlen hinzufügen.

Wenn Ihr Profil beispielsweise my-sso-app heißt, verwenden Sie --profile my-sso-app. Überprüfen Sie Ihre AWS CLI-Konfiguration mit aws configure list-profiles, um verfügbare Profile anzuzeigen.

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

Mit dem ECR-Repository authentifizieren

Melden Sie sich beim ECR-Repository an:

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

NOTE

Wenn Sie ein Profil verwenden, nutzen Sie das `--profile`-Flag:
bash
aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URI

Das Docker-Image taggen und in das ECR-Repository pushen

Stellen Sie sicher, dass Sie sich im Verzeichnis mit Ihrer Dockerfile befinden, und taggen Sie dann das Docker-Image mit der ECR-Repository-URI.

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

Pushen Sie dann das Image in das ECR-Repository.

bash
docker push ${ECR_URI}:latest

Eine AWS Lambda-Funktion erstellen

Gehen Sie zu AWS Console > Lambda > Funktion erstellen > Wählen Sie Container-Image

Funktion erstellen

Geben Sie der Funktion einen Namen, z.B. my-bun-function.

Das Container-Image auswählen

Gehen Sie dann zum Abschnitt Container-Image-URI, klicken Sie auf Images durchsuchen. Wählen Sie das Image aus, das wir gerade in das ECR-Repository gepusht haben.

Container-Repository auswählen

Wählen Sie dann das latest-Image und klicken Sie auf Image auswählen.

Container-Image auswählen

Die Funktion konfigurieren

Um eine öffentliche URL für die Funktion zu erhalten, müssen wir zu Zusätzliche Konfigurationen > Netzwerk > Funktions-URL gehen.

Stellen Sie dies auf Aktivieren mit dem Auth-Typ KEINE.

Funktions-URL festlegen

Die Funktion erstellen

Klicken Sie unten auf der Seite auf Funktion erstellen, dies erstellt die Funktion.

Funktion erstellen

Die Funktions-URL abrufen

Sobald die Funktion erstellt wurde, werden Sie zur Seite der Funktion weitergeleitet, wo Sie die Funktions-URL im Abschnitt "Funktions-URL" sehen können.

Funktions-URL

Die Funktion testen

🥳 Ihre App ist jetzt live! Um die Funktion zu testen, können Sie entweder zum Tab Test gehen oder die Funktions-URL direkt aufrufen.

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

Bun von www.bunjs.com.cn bearbeitet