【问题标题】:Is lambda layers compatible with Go?lambda 层与 Go 兼容吗?
【发布时间】:2019-05-26 10:10:31
【问题描述】:

是否可以将 Golang lambda 与 AWS 的新 lambda 层功能一起使用?

我一直在尝试找到一种解决方案,以便在我用 Go 编写的 Lambda 函数中使用层,但我一直没能做到。我让它与 python lambda 一起工作。我觉得由于 Go 代码是编译后的二进制文件,因此无法在运行时使用图层导入。如果我在本地有图层的代码,则导入也会被编译到二进制文件中,这违背了使用图层的目的。

有人知道或有任何使用 Golang 的 Lambda 层的例子吗?

【问题讨论】:

  • 我一直在为同样的问题而苦苦挣扎。现在,如果你的 Lambda 函数在 Golang 中,感觉层有点没用。

标签: amazon-web-services go aws-lambda


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    实际上,可以为 Go 层提供预编译的 plugin,但是有很多限制,它并不是真正有用:

    • 插件和应用程序必须使用完全相同的编译器版本进行编译(例如,1.13.3 和 1.13.4 之间不兼容)。
    • 如果插件和应用程序都依赖相同的依赖项,它们也必须使用完全相同的版本。
    • 当插件的 API 使用自定义接口和/或结构时,需要在共享的 Go 包中定义它们,该包必须由插件和应用程序导入。
    • 插件和应用程序共有的所有依赖项都必须存储在相同的文件夹结构中!

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

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

    底线是:如果您真的想要,您可以使用 Go + AWS Lambda 层,但在实践中,我认为这不值得。

    【讨论】:

      【解决方案3】:

      不幸的是,到了 2022 年,这仍然是一个问题。

      是的,您可以构建一个插件并创建一个层,将其注入您的 lambda,但CGO_ENABLED 是一个交易破坏者。

      基本上,您的 lambda 在构建步骤中需要 CGO_ENABLED=0。 (例如OOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go

      但是,在禁用 CGO 的情况下,在 lambda 中使用“插件”会导致错误 - plugin: not implemented

      据我所知,在本地,当 CGO 两次都启用时 - 即在构建插件和 go 模块时,导入插件按预期工作。但是,在 AWS 中,要让您的 lambda 工作,您需要在构建期间禁用 CGO,这意味着使用插件是脱离上下文的。

      在这里讨论 - https://github.com/golang/go/issues/19569

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-25
        • 2020-11-14
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        • 2015-08-09
        • 2018-08-27
        • 2011-12-31
        相关资源
        最近更新 更多