将 cmd 文件夹中的 golang 应用程序部署到 AWS Beanstalk

Deploying golang app in cmd folder to AWS Beanstalk

提问人:Rodrigo 提问时间:2/14/2017 更新时间:5/4/2023 访问量:2253

问:

我有一个预先存在的golang项目,具有以下文件夹结构(为了可读性,最小化了文件夹)。

- postgre
    - service.go
- cmd
    - vano
        - main.go
    - vanoctl
        - main.go
vano.go

现在,由于我的项目 Web 服务器已进入,我需要创建一个自定义和 .所以我就这么做了./cmd/vanoBuildfileProcfile

这是我的 Buildfile

make: ./build.sh

build.sh 文件:

#!/usr/bin/env bash

# Install dependencies.
go get ./...
# Build app
go build ./cmd/vano -o bin/application

最后是我的 Procfile:

web: bin/application

所以现在我的文件夹结构是这样的:

- postgre
    - service.go
- cmd
    - vano
        - main.go
    - vanoctl
        - main.go
vano.go
Buildfile
build.sh
Procfile

我使用 git 压缩源代码:

git archive --format=zip HEAD > vano.zip

并将其上传到 AWS Beanstalk。我如何不断收到错误,而 AWS 错误似乎不是阅读次数最多的。这是我的错误

Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].

错误信息

[Instance: i-0d8f642474e3b2c68] Command failed on instance. Return code: 1 Output: (TRUNCATED)...' Failed to execute 'HOME=/tmp /opt/elasticbeanstalk/lib/ruby/bin/ruby /opt/elasticbeanstalk/lib/ruby/bin/foreman start --procfile /tmp/d20170213-1941-1baz0rh/eb-buildtask-0 --root /var/app/staging --env /var/elasticbeanstalk/staging/elasticbeanstalk.env'. Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/01_configure_application.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.

额外错误信息:

Failed to execute 'HOME=/tmp /opt/elasticbeanstalk/lib/ruby/bin/ruby /opt/elasticbeanstalk/lib/ruby/bin/foreman start --procfile /tmp/d20170213-1941-1baz0rh/eb-buildtask-0 --root /var/app/staging --env /var/elasticbeanstalk/staging/elasticbeanstalk.env'
amazon-web-services 转到 amazon-elastic-beanstalk

评论

1赞 Kerem 2/16/2017
它可能未能安装依赖项。文件中写着什么?/var/log/eb-activity.log
1赞 Mayank Patel 2/20/2017
为什么不提供依赖项,然后压缩代码。没必要做。go get ./...
0赞 Kenny Grant 2/22/2017
看起来工头失败了,你的 Procfile 有效吗?
0赞 Rodrigo 2/22/2017
@KennyGrant My Procfile 几乎取自 AWS 文档
0赞 Rodrigo 2/22/2017
@MayankPatel我可以很容易地做到这一点,除非我必须从文件夹中供应商,这对我来说似乎是错误的cmd

答:

2赞 Kenny Grant 2/22/2017 #1

这里的另一种方法不是使用 procfile 等,而是交叉编译您的二进制文件(在 go 中通常非常轻松)并按照指南中的简单说明以这种方式上传:

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/go-environment.html

您可以使用以下命令在本地编译它:

GOARCH=amd64 GOOS=linux go build -o bin/application ./cmd/vano 

然后上传应用程序文件的 zip,它应该可以工作,假设您的设置只需要运行这个二进制文件。

评论

0赞 Rodrigo 2/22/2017
这是我必须采取的方法,而不是我想要的方式,而且我不喜欢它向我的应用程序添加一个 bin 文件夹的事实,但它似乎是最简单的解决方案
1赞 Kenny Grant 2/22/2017
我个人使用这个解决方案,并且对它非常满意,您可以使用最新的 Go 1.8(AWS 在 Go 1.6 上不是吗?),它加快了部署速度,您可以在上传之前在本地查看并修复任何错误,它使您减少对 AWS 基础设施的依赖,因为它可以在任何地方使用(GC、 VPS等)。我不介意 bin 文件夹:)
0赞 Rodrigo 2/23/2017
我将继续检查这个答案,它并没有完全“回答”这个问题,但它确实提供了一个有效的解决方案。
0赞 Phrozen 7/20/2017
这太棒了!这将允许我使用 Go 1.8!但是文件夹结构、资产等怎么样,我是否将它们都保持相同?只是添加垃圾箱/应用程序?我可以使用这种方法写入相对文件夹(即 ./data)中的磁盘吗?
0赞 Paul Slevin 6/29/2020
这里有点晚了,但你可以在 build.sh 中包含上面的行,这意味着你不需要在源文件中包含二进制文件
0赞 Vishwa Ratna 5/4/2023 #2

最好的部署方法是使用 cmd 创建二进制文件。

在终端中,使用 cmd-> 创建一个二进制文件go build -o bin/application application.go

然后将所有文件添加到一个 zip 文件中。

转到您的 EB 环境并上传 zip 文件。

您应该看到如下日志:

enter image description here