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

时间:2017-11-09 11:30:41

标签: amazon-web-services go deployment elastic-beanstalk

我是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路径已被破坏。

我读到大部分时间最好将所有回购保留在同一个工作区内,但这会使部署更加困难..

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

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

1 个答案:

答案 0 :(得分:1)

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

1)将整个GOPATH打包为Beanstalk的“源包”。然后你应该能够编写build.sh脚本来改变GOP​​ATH并按照你的方式构建它。然后从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如何构建应用程序的一些见解,从而帮助选项1和2.我自己使用此选项,直到我转移到普通的EC2实例。我仍然使用由此获得的技能来使用docker构建我当前的应用程序版本。

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

嗯,你选择哪种选择 - 祝你好运!