Heim >Backend-Entwicklung >Golang >Websocket-URL-Timeout-Fehler in AWS Lambda erreicht

Websocket-URL-Timeout-Fehler in AWS Lambda erreicht

WBOY
WBOYnach vorne
2024-02-10 11:30:101020Durchsuche

AWS Lambda 中的 Websocket URL 超时达到错误

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.

Frageninhalt

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

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"]

Workaround

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.execallocatoroptions 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen