3 回答

TA貢獻(xiàn)1807條經(jīng)驗 獲得超9個贊
Go 依賴項位于已編譯的二進(jìn)制文件中,因此您不能/不需要使用層。問題在語言層面得到解決。它與編譯的事實(shí)沒有任何關(guān)系,C 和 C++ 二進(jìn)制文件仍然具有依賴性。

TA貢獻(xiàn)1802條經(jīng)驗 獲得超10個贊
實(shí)際上,可以為 Go 層提供一個預(yù)編譯的插件,但是有太多的限制,它并不是很有用:
插件和應(yīng)用程序必須使用完全相同的編譯器版本進(jìn)行編譯(例如,1.13.3 和 1.13.4 之間不兼容)。
如果插件和應(yīng)用程序都依賴于相同的依賴項,那么它們也必須使用完全相同的版本。
當(dāng)插件的 API 使用自定義接口和/或結(jié)構(gòu)時,它們需要在共享的 Go 包中定義,該包必須由插件和應(yīng)用程序?qū)搿?/p>
插件和應(yīng)用程序共有的所有依賴項都必須存儲在相同的文件夾結(jié)構(gòu)中!
在 AWS Lambda 層的情況下,上面提到的最后兩點(diǎn)使 Go 層變得毫無用處。由于應(yīng)用程序代碼無論如何都需要導(dǎo)入共享包,為什么不導(dǎo)入駐留在 Go 層中的實(shí)際包呢?
如果我沒看錯,Go 插件系統(tǒng)將用于提供與主應(yīng)用程序一起編譯和部署的可插入實(shí)現(xiàn)。它并非旨在供第三方用于交付自定義應(yīng)用程序插件。
底線是:如果你真的想要,你可以使用 Go + AWS Lambda Layers,但在我看來,實(shí)際上不值得付出努力。

TA貢獻(xiàn)2036條經(jīng)驗 獲得超8個贊
不幸的是,到了 2022 年,這仍然是一個問題。
是的,您可以構(gòu)建一個插件并創(chuàng)建一個層,將其注入您的 lambda,但這CGO_ENABLED
是一個交易破壞者。
基本上,您的 lambdaCGO_ENABLED=0
在構(gòu)建步驟中需要。(例如。GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go
)
但是,在禁用 CGO 的情況下,在您的 lambda 中使用“插件”會導(dǎo)致錯誤 -plugin: not implemented
從我可以確認(rèn)的情況來看,在本地,當(dāng) CGO 兩次都啟用時 - 即在構(gòu)建插件和 go 模塊時,導(dǎo)入插件按預(yù)期工作。但是,在 AWS 中,要使 lambda 起作用,您需要在構(gòu)建期間禁用 CGO,這意味著使用插件是脫離上下文的。
- 3 回答
- 0 關(guān)注
- 184 瀏覽
添加回答
舉報