Rumah >pembangunan bahagian belakang >Golang >Tamat masa URL websocket mencapai ralat dalam AWS Lambda

Tamat masa URL websocket mencapai ralat dalam AWS Lambda

WBOY
WBOYke hadapan
2024-02-10 11:30:101020semak imbas

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

Apabila menggunakan Websocket dalam AWS Lambda, kadangkala anda menghadapi ralat tamat masa URL Websocket. Masalah ini boleh mengakibatkan ketidakupayaan untuk mewujudkan atau mengekalkan sambungan ke Websocket, menjejaskan operasi biasa aplikasi. Artikel ini akan memperkenalkan punca dan penyelesaian kepada masalah ini, membantu pembangun menyelesaikan ralat tamat masa URL Websocket dan memastikan kestabilan dan kebolehpercayaan aplikasi. Kedua-dua pembangun pemula dan berpengalaman akan mendapat maklumat berharga tentang AWS Lambda dan Websockets daripada artikel ini.

Kandungan soalan

Saya menggunakan bahasa go untuk membangunkan aws lambda. Saya menggunakan kod go lang, menggunakan imej chromedp dan docker, dan mendapat ralat tamat masa url websocket. Lambda saya ditetapkan kepada memori ram 3008 mb, storan 512mb dan tamat masa 15 minit. Bolehkah anda mengenal pasti masalah dan bagaimana untuk menyelesaikannya? Ini ialah fail main.godockerfile

Fail main.go (bahagian 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/")
    })

}

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

Penyelesaian

mencadangkan menggunakan chromedp/headless-shell kerana ia kecil dan lebih sesuai untuk aws lambda.

Saya baru sahaja menguji demo mudah menggunakan chromedp/headless-shell dan ia berkesan.

dockerfile:

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

Contoh ini berdasarkan https://github.com/andiedie/chromedp-aws-lambda-example. Ambil perhatian bahawa chromedp.execallocatoroption yang disenaraikan disalin terus daripada repositori ini. Ia berfungsi, tetapi saya tidak pasti sama ada ini senarai pilihan terbaik. Mungkin anda perlu menyesuaikannya dengan keperluan anda.

Atas ialah kandungan terperinci Tamat masa URL websocket mencapai ralat dalam AWS Lambda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam