Bei der Verwendung von Websocket in AWS Lambda tritt manchmal ein Websocket-URL-Timeout-Fehler auf. Dieses Problem kann dazu führen, dass keine Verbindung zu Websocket hergestellt oder aufrechterhalten werden kann, was den normalen Betrieb der Anwendung beeinträchtigt. In diesem Artikel werden die Ursachen und Lösungen für dieses Problem vorgestellt, Entwickler bei der Lösung von Websocket-URL-Timeout-Fehlern unterstützt und die Stabilität und Zuverlässigkeit von Anwendungen sichergestellt. Sowohl Anfänger als auch erfahrene Entwickler erhalten in diesem Artikel wertvolle Informationen zu AWS Lambda und Websockets.
Ich verwende Go-Sprache, um AWS Lambda zu entwickeln. Ich stelle Go-Lang-Code bereit, verwende Chromedp und Docker-Image und erhalte einen Websocket-URL-Timeout-Fehler. Mein Lambda ist auf 3008 MB RAM-Speicher, 512 MB Speicher und 15 Minuten Timeout eingestellt. Können Sie das Problem identifizieren und wie Sie es beheben können? Das ist die Datei main.go
和 dockerfile
Datei main.go
(Chromedp-Teil)
func getpage(url string, linenum string, stationnm string) { // settings for crawling ctx, cancle := chromedp.newcontext( context.background(), chromedp.withlogf(log.printf), ) defer cancle() opts := []chromedp.execallocatoroption{ chromedp.disablegpu, chromedp.nosandbox, chromedp.headless, chromedp.flag("no-zygote", true), chromedp.flag("single-process", true), chromedp.flag("homedir", "/tmp"), chromedp.flag("data-path", "/tmp/data-path"), chromedp.flag("disk-cache-dir", "/tmp/cache-dir"), chromedp.flag("remote-debugging-port", "9222"), chromedp.flag("remote-debugging-address", "0.0.0.0"), chromedp.flag("disable-dev-shm-usage", true), } allocctx, cancel := chromedp.newexecallocator(ctx, opts...) defer cancel() ctx, cancel = chromedp.newcontext(allocctx, chromedp.withlogf(log.printf)) defer cancel() var htmlcontent string ch := chromedp.waitnewtarget(ctx, func(i *target.info) bool { return strings.contains(i.url, "/timetable/web/") }) }
Datei dockerfile
FROM public.ecr.aws/lambda/provided:al2 AS build ENV GO111MODULE=on \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=amd64 # Get rid of the extension warning RUN mkdir -p /opt/extensions RUN yum -y install golang RUN go env -w GOPROXY=direct # Clone git, copying go.mod, go.sum, main.go WORKDIR /var/task/ RUN yum install git -y RUN git clone https://github.com/seedspirit/NaverCrawler-CICD-go.git RUN cp NaverCrawler-CICD-go/main.go /var/task/ RUN cp NaverCrawler-CICD-go/go.mod /var/task/ RUN cp NaverCrawler-CICD-go/go.sum /var/task/ # cache dependencies RUN go mod download RUN go build -o main . FROM public.ecr.aws/lambda/provided:al2 COPY --from=build /var/task/main /var/task/main # Install Chrome dependencies RUN curl https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm -o chrome.rpm && \ yum install -y ./chrome.rpm && \ yum install -y fontconfig libX11 GConf2 dbus-x11 ENTRYPOINT ["/var/task/main"]
schlägt die Verwendung von chromedp/headless-shell vor, da es klein und besser für AWS Lambda geeignet ist.
Ich habe gerade eine einfache Demo mit chromedp/headless-shell
getestet und es funktioniert.
Docker-Datei:
from golang:1.20.4-alpine3.17 as builder workdir /app copy go.mod go.sum ./ run go mod download copy . . run go build -o main from chromedp/headless-shell:113.0.5672.93 workdir /app copy --from=builder /app/main . entrypoint [ "./main" ]
main.go:
package main import ( "context" "encoding/json" "fmt" "log" "os" "github.com/aws/aws-lambda-go/lambda" "github.com/chromedp/chromedp" ) func Handler(_ context.Context, _ json.RawMessage) error { opts := []chromedp.ExecAllocatorOption{ chromedp.NoSandbox, chromedp.Flag("disable-setuid-sandbox", true), chromedp.Flag("disable-dev-shm-usage", true), chromedp.Flag("single-process", true), chromedp.Flag("no-zygote", true), } ctx, cancel := chromedp.NewExecAllocator(context.Background(), opts...) defer cancel() ctx, cancel = chromedp.NewContext(ctx, chromedp.WithDebugf(log.Printf)) defer cancel() var content string if err := chromedp.Run(ctx, chromedp.Tasks{ chromedp.Navigate("https://example.com/"), chromedp.Text("body > div > p:nth-child(2)", &content), }); err != nil { log.Fatal(err) } fmt.Println(content) return nil } func main() { if _, exists := os.LookupEnv("AWS_LAMBDA_RUNTIME_API"); exists { lambda.Start(Handler) } else { err := Handler(context.Background(), nil) if err != nil { log.Fatal(err) } } }
Dieses Beispiel basiert auf https://github.com/andiedie/chromedp-aws-lambda-example. Beachten Sie, dass die aufgelisteten chromedp.execallocatoroption
s direkt aus diesem Repository kopiert werden. Es funktioniert, aber ich bin mir nicht sicher, ob dies die beste Liste von Optionen ist. Möglicherweise müssen Sie sie an Ihre Bedürfnisse anpassen.
Das obige ist der detaillierte Inhalt vonWebsocket-URL-Timeout-Fehler in AWS Lambda erreicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!