我正在和Go Lang一起研究AWS Lambda.我正在部署Go lang代码,使用chromedp,带有Docker图像和Get WebSocket URL超时到达错误.我的lambda设置是3008MB内存、512MB存储空间和15分钟超时.你能找出哪里出了问题吗?如何修复?这是文件main.goDockerfile

文件main.go(镀 chromium 部分)

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

}

文件Dockerfile文件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"]

推荐答案

建议使用chromedp/headless-shell,因为它体积小,更适合AWS Lambda.

我刚刚用chromedp/headless-shell测试了一个简单的演示,它工作正常.

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

此示例基于https://github.com/Andiedie/chromedp-aws-lambda-example.请注意,列出的chromedp.ExecAllocatorOption是直接从该存储库复制的.它是有效的,但我不确定这是否是最好的 Select .也许你必须根据你的需要来调整它们.

Go相关问答推荐

从Kafka到Clickhouse的实时消费数据

如何在gofr发起的服务间调用请求中添加Authorization Header?

无法使用Segentio;S Kafka-Go连接到融合的Kafka

如何使用 go 读取 RDF xml 文件中的 XML 命名空间属性

Golang Fiber Render - 将数据发送到多个布局

使用Go和Operator SDK通过API调用设置Kubernetes Pods的安装步骤

使用goqu无法获取响应

golang gin 获取 cookie json

使用 Go Colly 抓取所有可能的标签并将它们放入一个变量中

将文本文件放入切片然后进行比较

无法将 graphql-ws 连接到 gqlgen

Golang Oauth2 服务帐户返回空刷新令牌字符串

如何模仿联合类型

获取切片元素的地址是否意味着 Go 中元素的副本?

显示作为服务帐户身份验证的谷歌日历事件 - Golang App

如何从 tinygo webassembly 目标返回对象

将 CSVExport 函数传递给处理程序 Gin

HCL 解码:具有多个标签的块

如何正确判断 io.Reader 是否为零?

如何断言类型是指向golang中接口的指针