I have been struggling trying to deploy my Golang app to AWS EB for couple days.
I am trying to deploy my app on an EB server Preconfigured Docker - Go 1.4 running on 64bit Debian/2.9.2
using the eb cli via the command eb deploy
in my app folder.
After couple seconds, I've got an error message saying that my app wasn't deployed because of an error. Looking at the eb-activity.log, here what I can see:
/var/log/eb-activity.log
-------------------------------------
Fetching https://golang.org/x/crypto?go-get=1
Parsing meta tags from https://golang.org/x/crypto?go-get=1 (status code 200)
golang.org/x/crypto (download)
Fetching https://golang.org/x/sys/unix?go-get=1
Parsing meta tags from https://golang.org/x/sys/unix?go-get=1 (status code 200)
get "golang.org/x/sys/unix": found meta tag main.metaImport{Prefix:"golang.org/x/sys", VCS:"git", RepoRoot:"https://go.googlesource.com/sys"} at https://golang.org/x/sys/unix?go-get=1
get "golang.org/x/sys/unix": verifying non-authoritative meta tag
Fetching https://golang.org/x/sys?go-get=1
Parsing meta tags from https://golang.org/x/sys?go-get=1 (status code 200)
golang.org/x/sys (download)
github.com/randomuser/private-repo (download)
# cd .; git clone https://github.com/randomuser/private-repo /go/src/github.com/randomuser/private-repo
Cloning into '/go/src/github.com/randomuser/private-repo'...
fatal: could not read Username for 'https://github.com': No such device or address
package github.com/Sirupsen/logrus
imports golang.org/x/crypto/ssh/terminal
imports golang.org/x/sys/unix
imports github.com/randomuser/private-repo/apis: exit status 128
package github.com/Sirupsen/logrus
imports golang.org/x/crypto/ssh/terminal
imports golang.org/x/sys/unix
imports github.com/randomuser/private-repo/app
imports github.com/randomuser/private-repo/app
imports github.com/randomuser/private-repo/app: cannot find package "github.com/randomuser/private-repo/app" in any of:
/usr/src/go/src/github.com/randomuser/private-repo/app (from $GOROOT)
/go/src/github.com/randomuser/private-repo/app (from $GOPATH)
I suppose there is an issue when the server tries to install the app, it seems it's trying to retrieve from my private repo on github ...
I referenced my app sub packages as github.com/randomuser/private-repo/subpackage
I supposed this is why it behaves like that.
Is there a way to deploy all my code, forcing my private repo to be populated within the GOROOT src/github.com/randomuser/private-repo/ so the server doesn't have to try to get it?
I didn't found any proper example from Amazon docs (multi-packages apps) nor from Github.
Am I missing anything? Is there a better solution?
On a side note, I also tried to deploy my compiled binary directly (create a folder where I put only the binary, zip it and upload it on the ebs env) but it didn't worked neither ... Maybe this option requires yet another env config (if so, which one?).
Thanks for your help :)
Configuration
-
Golang app having the following folders:
├── Dockerfile ├── server.go ├── Gopkg.lock ├── Gopkg.toml ├── Makefile ├── apis │ ├── auth.go │ ├── auth_test.go │ ├── ... ├── app │ ├── config.go │ ├── init.go │ ├── logger.go │ ├── scope.go │ ├── transactional.go │ └── version.go ├── config │ ├── dev.app.yaml │ ├── errors.yaml │ └── prod.app.yaml ├── daos │ ├── auth.go │ ├── auth_test.go │ ├── ... ├── errors │ ├── api_error.go │ ├── api_error_test.go │ ├── errors.go │ ├── errors_test.go │ ├── template.go │ └── template_test.go ├── models │ ├── identity.go │ ├── ... ├── services │ ├── auth.go │ ├── auth_test.go │ ├── ... ├── util │ ├── paginated_list.go │ └── paginated_list_test.go
-
Here is the content of my server.go
package main import ( "flag" "fmt" "net/http" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "github.com/randomuser/private-repo/apis" "github.com/randomuser/private-repo/app" "github.com/randomuser/private-repo/daos" "github.com/randomuser/private-repo/errors" "github.com/randomuser/private-repo/services" ) func main() { // getting env from command line // env is either prod, preprod or dev // by default, env is prod env := flag.String("env", "prod", "environment: prod, preprod or dev") flag.Parse() ... router.To("GET,HEAD", "/ping", func(c *routing.Context) error { c.Abort() // skip all other middlewares/handlers return c.Write("OK " + app.Version) }) ... // Serve on port 5000
-
My Dockerfile content:
FROM golang:1.4.2-onbuild ADD . /go/src/github.com/randomuser/private-repo RUN go install github.com/randomuser/private-repo EXPOSE 5000 ENTRYPOINT /go/bin/private-repo