3 回答
TA贡献1807条经验 获得超9个赞
Go 依赖项位于已编译的二进制文件中,因此您不能/不需要使用层。问题在语言层面得到解决。它与编译的事实没有任何关系,C 和 C++ 二进制文件仍然具有依赖性。
TA贡献1802条经验 获得超10个赞
实际上,可以为 Go 层提供一个预编译的插件,但是有太多的限制,它并不是很有用:
插件和应用程序必须使用完全相同的编译器版本进行编译(例如,1.13.3 和 1.13.4 之间不兼容)。
如果插件和应用程序都依赖于相同的依赖项,那么它们也必须使用完全相同的版本。
当插件的 API 使用自定义接口和/或结构时,它们需要在共享的 Go 包中定义,该包必须由插件和应用程序导入。
插件和应用程序共有的所有依赖项都必须存储在相同的文件夹结构中!
在 AWS Lambda 层的情况下,上面提到的最后两点使 Go 层变得毫无用处。由于应用程序代码无论如何都需要导入共享包,为什么不导入驻留在 Go 层中的实际包呢?
如果我没看错,Go 插件系统将用于提供与主应用程序一起编译和部署的可插入实现。它并非旨在供第三方用于交付自定义应用程序插件。
底线是:如果你真的想要,你可以使用 Go + AWS Lambda Layers,但在我看来,实际上不值得付出努力。
TA贡献2036条经验 获得超8个赞
不幸的是,到了 2022 年,这仍然是一个问题。
是的,您可以构建一个插件并创建一个层,将其注入您的 lambda,但这CGO_ENABLED
是一个交易破坏者。
基本上,您的 lambdaCGO_ENABLED=0
在构建步骤中需要。(例如。GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go
)
但是,在禁用 CGO 的情况下,在您的 lambda 中使用“插件”会导致错误 -plugin: not implemented
从我可以确认的情况来看,在本地,当 CGO 两次都启用时 - 即在构建插件和 go 模块时,导入插件按预期工作。但是,在 AWS 中,要使 lambda 起作用,您需要在构建期间禁用 CGO,这意味着使用插件是脱离上下文的。
- 3 回答
- 0 关注
- 136 浏览
添加回答
举报