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 關注
- 176 瀏覽
添加回答
舉報