如何使用自定义项目文件夹结构在 Beanstalk 中部署 Go Web 应用程序

Posted

技术标签:

【中文标题】如何使用自定义项目文件夹结构在 Beanstalk 中部署 Go Web 应用程序【英文标题】:How to deploy a Go web application in Beanstalk with custom project folder structure 【发布时间】:2018-04-22 09:09:06 【问题描述】:

我是 Go 新手。 我正在尝试将一个简单的 Web 项目部署到 EB,但没有成功。 我想将具有以下本地结构的项目部署到 Amazon EB:

$GOPATH
├── bin
├── pkg
└── src
    ├── github.com
    │   ├── AstralinkIO 
    │   │   └── api-server <-- project/repository root
    │   │       ├── bin
    │   │       ├── cmd <-- main package
    │   │       ├── pkg
    │   │       ├── static
    │   │       └── vendor

但我不知道该怎么做,在构建命令时,亚马逊将api-server 视为$GOPATH,当然import 路径已损坏。

我读到大多数时候最好将所有 repos 保存在同一个工作区下,但这会使部署更加困难..

我正在使用ProcfileBuildfile 来自定义输出路径,但我找不到解决依赖关系的方法。

将此类项目部署到 EB 的最佳方式是什么?

【问题讨论】:

这对于 ServerFault 来说可能更像是一个 EB 问题,而不是 SO 的一个 Go 问题。我会说部署 Go 应用程序的典型方法是构建它,将二进制文件传输到服务器(不需要安装 Go 或任何源代码),然后运行它。似乎 Beanstalk 有其他想法,我个人认为这些想法与最佳实践截然相反。 我还应该指出,这不是“自定义项目文件夹结构”,这是 100% 沼泽标准 Go 项目结构(假设 binpkg 只是包名)。 感谢您的澄清!我想我误以为这不是标准方式。 【参考方案1】:

自从我使用 Beanstalk 以来已经过去了很长时间,所以我对细节有点生疏。但基本思想如下。 AWS Beanstalk 对 go 的支持在设计上有点奇怪。它基本上将您的源文件提取到服务器上的文件夹中,将该文件夹声明为 GOPATH 并尝试构建您的应用程序,假设您的主包位于您的 GOPATH 的根目录。这不是 Go 项目的标准布局。所以你的选择是:

1) 将整个 GOPATH 打包为 Beanstalk 的“源包”。然后您应该能够编写 build.sh 脚本来更改 GOPATH 并按照您的方式构建它。然后从您的 Buildfile 中调用 build.sh。

2) 将您的主包更改为常规包(例如 github.com/AstralinkIO/api-server/cmd)。然后在 GOPATH 的根目录下创建一个 application.go 文件(是的,在 src 之外,而所有实际的包都应该在 src 中)。您的 application.go 将成为您的“主包”并且将仅包含一个主函数(它将从 github.com/AstralinkIO/api-server/cmd 调用您当前的主函数)。应该做的伎俩。虽然您的里程可能会有所不同。

3) 一个更简单的选择是改用Docker-based Go Platform。它仍然在服务器上构建你的 go 应用程序,但问题与上述大部分相同,但它有更好的文档记录,并且可以在本地测试它对配置和构建正确有很大帮助。它还将让您深入了解 Beanstalk 如何构建 go 应用程序,从而帮助选择选项 1 和 2。我自己使用此选项,直到我转移到普通的 EC2 实例。而且我仍然使用由此获得的技能来使用 docker 构建我当前的应用程序版本。

4) 您最好的选择(以我的拙见)是自己构建您的应用程序并将其打包为准备运行的二进制文件。请参阅第二个要点段落here

好吧,无论你选择哪个选项 - 祝你好运!

【讨论】:

非常感谢您的详细回答!我决定在本地编译应用程序(使用 Docker 容器),并将按照 Adrian 的建议更改为 EB 上的 docker。

以上是关于如何使用自定义项目文件夹结构在 Beanstalk 中部署 Go Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NodeJS 部署自定义到 Elastic Beanstalk?

如何在 Elastic Beanstalk 上部署自定义 docker 映像?

Elastic Beanstalk - 自定义 Nginx 配置文件 - PHP Web 应用程序

AWS Elastic Beanstalk:将自定义日志添加到 CloudWatch?

AWS Beanstalk 上的 Python。如何对自定义日志进行快照?

如何在 Node.js Elastic Beanstalk 上自定义 nginx 配置