Maison >développement back-end >Golang >Erreur d'expiration du délai d'expiration de l'URL Websocket dans AWS Lambda

Erreur d'expiration du délai d'expiration de l'URL Websocket dans AWS Lambda

WBOY
WBOYavant
2024-02-10 11:30:101026parcourir

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

Lorsque vous utilisez Websocket dans AWS Lambda, vous rencontrez parfois une erreur de délai d'expiration de l'URL Websocket. Ce problème peut entraîner l'impossibilité d'établir ou de maintenir une connexion à Websocket, affectant le fonctionnement normal de l'application. Cet article présentera les causes et les solutions à ce problème, aidera les développeurs à résoudre les erreurs de délai d'attente d'URL Websocket et garantira la stabilité et la fiabilité des applications. Les développeurs débutants et expérimentés obtiendront des informations précieuses sur AWS Lambda et Websockets grâce à cet article.

Contenu de la question

J'utilise le langage Go pour développer AWS lambda. Je déploie du code go lang, en utilisant chromedp et l'image docker, et j'obtiens une erreur de délai d'expiration de l'URL de websocket. Mon lambda est réglé sur 3008 Mo de mémoire RAM, 512 Mo de stockage et un délai d'attente de 15 minutes. Pouvez-vous identifier le problème et comment le résoudre ? Voici le fichier main.godockerfile

Fichier main.go (partie chromedp)

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/")
    })

}

Fichier 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

suggère d'utiliser chromedp/headless-shell car il est petit et mieux adapté à AWS lambda.

Je viens de tester une démo simple utilisant chromedp/headless-shell et ça marche.

fichier docker :

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)
        }
    }
}

Cet exemple est basé sur https://github.com/andiedie/chromedp-aws-lambda-example. Notez que les chromedp.execallocatoroption répertoriés sont copiés directement à partir de ce référentiel. Cela fonctionne, mais je ne sais pas si c'est la meilleure liste d'options. Peut-être devrez-vous les adapter à vos besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer