我用这个基本示例在Ubuntu上构建lambda。它的构建没有任何错误,但如果我上传并在崩溃的aws上测试它:
{
"errorMessage": "RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b Error: Runtime exited with error: exit status 1",
"errorType": "Runtime.ExitError"
}
日志输出为:
START
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Version: $LATEST.~.jwtauthorizeraws.jwtauthorizerawsapplication: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./~.jwtauthorizerawsapplication)
END
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
REPORT
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Duration: 56.02 ms
Billed Duration: 57 ms
Memory Size: 128 MB
Max Memory Used: 7 MB
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Error: Runtime exited with error: exit status 1
Runtime.ExitError
我最近遇到了这个问题。
使用CGO_ENABLED=0
构建您的项目可能足以解决您的问题:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go
如果你使用的是sam
,有一个--use-container
标志,但这可能不适用于golang项目
要使sam build
使用自定义构建命令,即运行上面的go build
命令,您可以将BuildMethod
设置为makefile
,并使用名称为build-<YourFunctionName>
的目标创建Makefile
。
HealthCheckFunction:
Type: AWS::Serverless::Function
Metadata:
BuildMethod: makefile
Properties:
CodeUri: .
Handler: healthcheck
FunctionName: !Sub "healthcheck_${Env}"
Runtime: go1.x
Architectures:
- x86_64
Events:
...
那么Makefile
将具有:
build-HealthCheckFunction:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o healthcheck lambda/healthcheck/healthcheck.go
mv healthcheck $(ARTIFACTS_DIR)
关于我必须做些什么才能在我的项目中解决这个问题的更多细节如下:https://www.gaunt.dev/blog/2022/glibc-error-with-aws-sam-and-go/
这可能意味着用于构建可执行文件的glibc
版本与docker环境使用的版本不同。
因此,检查构建环境ldd --version
将显示glibc版本。
现在,在docker容器(docker run -ti --entrypoint=/bin/bash dockerimage:tag
(中键入相同的ldd
命令。你可能会看到不同的版本。因此,更新构建环境以使用与docker环境相同的版本,反之亦然。
避免这种情况的最佳方法是使用运行时环境来构建本机可执行文件:这样glibc
版本将始终匹配。
FWIW,在Quarkus中,我们有一个称为容器内构建的功能,它允许在与我们使用的运行时映像兼容的容器内创建您的本地映像。
使用-Dquarkus.native.container-build=true
可以实现这一点。
并不是说你应该迁移到Quarkus,但如果你想构建本机映像,你真的需要在与运行时环境兼容的环境中构建它们,所以你最终不得不在容器中构建。
您正在执行的环境似乎没有提供2.32版本的Glibc版本。
这可能会有几个问题:Lambda env的版本较旧,或者根本不提供GlibC(可能是这样(。
如果你的应用程序是纯java(没有通过graal创建本地应用程序(,它会运行,因为java应用程序本身不依赖于GLibC的版本,需求来自本地应用程序。