为了账号安全,请及时绑定邮箱和手机立即绑定

lambda 层与 Go 兼容吗?

lambda 层与 Go 兼容吗?

Go
明月笑刀无情 2023-05-22 17:13:09
是否可以将 Golang lambda 与 AWS 的新 lambda 层功能一起使用?我一直在尝试找到一种解决方案,以将层与用 Go 编写的 Lambda 函数一起使用,但我一直未能这样做。不过,我让它与 python lambda 一起工作。我觉得因为 Go 代码是编译后的二进制文件,所以不可能在运行时使用层导入。如果我在本地有层的代码,导入也会被编译成二进制文件,这就违背了使用层的目的。有没有人知道或有任何使用 Golang 的 Lambda 层的例子?
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

Go 依赖项位于已编译的二进制文件中,因此您不能/不需要使用层。问题在语言层面得到解决。它与编译的事实没有任何关系,C 和 C++ 二进制文件仍然具有依赖性。



查看完整回答
反对 回复 2023-05-22
?
守候你守候我

TA贡献1802条经验 获得超10个赞

实际上,可以为 Go 层提供一个预编译的插件,但是有太多的限制,它并不是很有用:

  • 插件和应用程序必须使用完全相同的编译器版本进行编译(例如,1.13.3 和 1.13.4 之间不兼容)。

  • 如果插件和应用程序都依赖于相同的依赖项,那么它们也必须使用完全相同的版本。

  • 当插件的 API 使用自定义接口和/或结构时,它们需要在共享的 Go 包中定义,该包必须由插件和应用程序导入。

  • 插件和应用程序共有的所有依赖项都必须存储在相同的文件夹结构中!

在 AWS Lambda 层的情况下,上面提到的最后两点使 Go 层变得毫无用处。由于应用程序代码无论如何都需要导入共享包,为什么不导入驻留在 Go 层中的实际包呢?

如果我没看错,Go 插件系统将用于提供与主应用程序一起编译和部署的可插入实现。它并非旨在供第三方用于交付自定义应用程序插件。

底线是:如果你真的想要,你可以使用 Go + AWS Lambda Layers,但在我看来,实际上不值得付出努力。


查看完整回答
反对 回复 2023-05-22
?
慕桂英3389331

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,这意味着使用插件是脱离上下文的。


查看完整回答
反对 回复 2023-05-22
  • 3 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信