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.
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.go
和 dockerfile
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"]
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!