如何使用自定义项目文件夹结构在 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 保存在同一个工作区下,但这会使部署更加困难..
我正在使用Procfile
和Buildfile
来自定义输出路径,但我找不到解决依赖关系的方法。
将此类项目部署到 EB 的最佳方式是什么?
【问题讨论】:
这对于 ServerFault 来说可能更像是一个 EB 问题,而不是 SO 的一个 Go 问题。我会说部署 Go 应用程序的典型方法是构建它,将二进制文件传输到服务器(不需要安装 Go 或任何源代码),然后运行它。似乎 Beanstalk 有其他想法,我个人认为这些想法与最佳实践截然相反。 我还应该指出,这不是“自定义项目文件夹结构”,这是 100% 沼泽标准 Go 项目结构(假设bin
和 pkg
只是包名)。
感谢您的澄清!我想我误以为这不是标准方式。
【参考方案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?