Blog

AWS Lambda - Wie man einen benutzerdefinierten Bootstrap in Go erstellt

Dennis Vriend

Aktualisiert Oktober 21, 2025
2 Minuten

Auf der re:Invent 2018 hat AWS Lambda Custom Runtimes angekündigt, mit denen Sie eine AWS Lambda-Laufzeit in einer beliebigen Programmiersprache implementieren können. In diesem Blog werden wir unseren eigenen Bootstrap in Go erstellen.

Bootstrap

Bootstrap ist eine Datei im Bereitstellungsarchiv, die dafür verantwortlich ist, die Umgebungsvariable 'AWS_LAMBDA_RUNTIME_API' zu lesen und mit der Lambda-Laufzeit-API zu interagieren, indem das nächste Ereignis abgerufen und eine Antwort gesendet wird. Die Lambda-Laufzeit-API ist als Webservice verfügbar, so dass es sehr einfach ist, eine Bootstrap-Anwendung in Go zu erstellen. Nachfolgend sehen Sie ein Beispiel für eine Anwendung, die mit einer API Gateway Proxy-Antwort antwortet.Die Bootstrap-Anwendung holt sich zunächst den Wert aus der Umgebungsvariablen 'AWS_LAMBDA_RUNTIME_API', die den für diese Funktion zu verwendenden Endpunkt enthält. Mithilfe des Endpunkts ruft er das nächste verfügbare Ereignis ab, indem er die Lambda-Laufzeit-API aufruft.Die Antwort enthält das Ereignis als Body-Wert und die 'Lambda-Runtime-Aws-Request-Id' als Header-Wert. Der Wert von 'Lambda-Runtime-Aws-Request-Id' muss verwendet werden, um eine Antwort zurück an die Lambda-Laufzeit-API zu senden.

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "time"
)

func main() {
    awsLambdaRuntimeApi := os.Getenv("AWS_LAMBDA_RUNTIME_API")
    if awsLambdaRuntimeApi == "" {
            panic("Missing: 'AWS_LAMBDA_RUNTIME_API'")
    }
    for {
        // get the next event
       requestUrl := fmt.Sprintf("http://%s/2018-06-01/runtime/invocation/next", awsLambdaRuntimeApi)
        resp, err := http.Get(requestUrl)
        if err != nil {
            log.Fatal(fmt.Errorf("Expected status code 200, got %d", resp.StatusCode))
        }

        requestId := resp.Header.Get("Lambda-Runtime-Aws-Request-Id")
        // print the next event
       eventData, err := ioutil.ReadAll(resp.Body)
        if err != nil {
            log.Fatal(fmt.Errorf("Error: %s"), err)
        }
        fmt.Println("Received event:", string(eventData))

        // Assume API Gateway and respond with Hello World
       responseUrl := fmt.Sprintf("http://%s/2018-06-01/runtime/invocation/%s/response", awsLambdaRuntimeApi, requestId)
        responsePayload := []byte({"statusCode": 200, "body": "Hello World!"})
        req, err := http.NewRequest("POST", responseUrl, bytes.NewBuffer(responsePayload))
        req.Header.Set("Content-Type", "application/json")

        client := &http.Client{}
        client.Timeout = time.Second * 1
        postResp, err := client.Do(req)
        if err != nil {
            log.Fatal(fmt.Errorf("Error %s", err))
        }
        body, _ := ioutil.ReadAll(postResp.Body)
        fmt.Println("Received response:", string(body))
    }
}

Beispiel

Das Beispiel zeigt, wie Sie eine native Go-Binärdatei als Bootstrap für AWS als API Gateway Handler erstellen, bauen, verpacken und bereitstellen. Zum Bereitstellen des Beispiels geben Sie 'make dep[oy' und zum Löschen 'make delete' ein.

Fazit

Lambda kann jede statische Linux-Binärdatei ausführen, was großartig ist! Lambda unterstützt nach wie vor die verwalteten Lambda-Laufzeiten, aber um zusätzliche Leistung aus unseren Lambda-Handlern herauszuholen, können wir hoch optimierte Binärdateien erstellen, die die schnellste Verarbeitung und die niedrigsten Kosten haben.

Verfasst von

Dennis Vriend

Contact

Let’s discuss how we can support your journey.