【问题标题】:Compile Statically Linked GO Executable for use in AWS Lambda编译静态链接的 GO 可执行文件以在 AWS Lambda 中使用
【发布时间】:2022-01-17 12:13:02
【问题描述】:

上下文:我正在尝试将 Go 程序(特别是 Markus Kont 的 go-sigma-rule-engine)编译为可执行文件,以便我可以将其上传到 AWS Lambda (which is Amazon Linux 2 under the hood I believe, according to this post.) 并通过 Python Lambda 函数包含/执行它,该函数向规则引擎程序发出 shell/os 命令。

问题:该程序依赖于许多依赖项,并且为了尽可能少地处理问题,我想在上传到 AWS Lambda 之前静态链接程序并编译,以便所有必要的依赖项包含在可执行文件本身中。

问题:我如何静态链接然后在 Go 中编译一个程序,以便我以 AWS Lambda 操作系统为目标?

【问题讨论】:

  • 那么如果我在程序的源代码目录中执行go build .,生成的可执行文件将是完全独立的吗?如果是这样,为什么会有这样的指南:oddcode.daveamit.com/2018/08/16/… 他们只是过时了吗?
  • Go 总是输出一个静态链接的二进制 AFAIK,其中包括你用 Go 编写的所有模块。但是,该程序仍然依赖于动态链接的 C 库。在大多数情况下,这应该不是问题(因为 Go 所依赖的 C 库包含在目标操作系统中),除非您通过 CGO 使用自己的 C 库。在您所指的链接中,作者也在谈论静态链接这些 C 库。
  • 那么我将使用什么命令来定位 Amazon Linux 2 操作系统并构建可执行文件?
  • 假设您的应用程序没有第三方 cgo 依赖项,Go 可执行文件应使用 Amazon Linux 2 操作系统上的默认包运行。使用这个命令:GOOS=linux go build.

标签: amazon-web-services go aws-lambda compilation static-linking


【解决方案1】:

这可以通过GOOS=linux go build .完成

默认情况下,Go 会构建静态链接的可执行文件,因此只要针对正确的操作系统,您将获得在 AWS Lambda 上运行良好的二进制文件,而无需在部署包中包含任何特定库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 2017-03-29
    • 2021-07-27
    • 2012-11-22
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多