Golang部署到AWS Beanstalk时遇到的错误

Golang部署到AWS Beanstalk时遇到的错误 我是Go语言新手,创建了一个在HTML页面中显示Hello World的简单应用程序。然后我尝试将Go代码部署到Amazon Beanstalk,通过复制项目并制作成zip文件上传到Beanstalk,但总是遇到这个错误:

无法启动应用程序,因为源包不包含Buildfile、Procfile或可执行文件。

有没有人知道如何解决这个问题或绕过它……以下是我的代码和一个简单的HTML页面。任何建议都将非常有帮助。

package main

import (
    "github.com/gorilla/mux"
    "net/http"
    "time"
    "log"
    "os"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "5000"
    }

    r := mux.NewRouter()

    r.PathPrefix("/").Handler(http.StripPrefix("/", http.FileServer(http.Dir("Views/"))))
    http.Handle("/", r)
    srv := &http.Server{
        ReadTimeout:  20 * time.Second,
        WriteTimeout: 20 * time.Second,
        IdleTimeout:  120 * time.Second,
        Addr:         ":5000",
    }
    http.ListenAndServe(":"+port,nil)
    log.Println(srv.ListenAndServe())
}

更多关于Golang部署到AWS Beanstalk时遇到的错误的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

对于简单的Go应用程序,有两种部署方式:

  1. 提供包含根目录下名为application.go源文件的源代码包,该文件包含应用程序的主包。Elastic Beanstalk使用以下命令构建二进制文件:
go build -o bin/application application.go

应用程序构建完成后,Elastic Beanstalk将在端口5000上启动它。

  1. 提供包含名为application的二进制文件的源代码包。该二进制文件可以位于源代码包的根目录或源代码包的**bin/目录中。如果您在两个位置都放置了应用程序二进制文件,Elastic Beanstalk将使用bin/**目录中的文件。

Elastic Beanstalk在端口5000上启动此应用程序。 来源:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/go-environment.html

更多关于Golang部署到AWS Beanstalk时遇到的错误的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


AWS Elastic Beanstalk 需要特定的配置文件来正确部署 Go 应用程序。错误信息表明缺少 Buildfile 或 Procfile,这是因为 Beanstalk 无法识别如何构建和运行你的 Go 应用。以下是解决方案:

  1. 创建 Procfile:在项目根目录中创建一个名为 Procfile 的文件(无扩展名),内容如下:

    web: your-app-name
    

    your-app-name 替换为你的 Go 二进制文件名称(例如,如果项目名为 “myapp”,则使用 myapp)。这告诉 Beanstalk 如何启动 Web 进程。

  2. 确保 Go 模块支持:如果你的项目使用 Go 模块(推荐),确保有 go.mod 文件。如果未初始化,运行 go mod init your-module-name 来创建它。Beanstalk 会自动检测并构建项目。

  3. 修复代码中的问题:你的代码有潜在问题,http.ListenAndServesrv.ListenAndServe 都被调用,可能导致冲突。以下是修正后的代码示例,使用 mux 路由器并正确设置端口:

package main

import (
    "github.com/gorilla/mux"
    "net/http"
    "time"
    "log"
    "os"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "5000"
    }

    r := mux.NewRouter()
    r.PathPrefix("/").Handler(http.StripPrefix("/", http.FileServer(http.Dir("Views/"))))

    srv := &http.Server{
        Handler:      r, // 使用 mux 路由器
        Addr:         ":" + port,
        ReadTimeout:  20 * time.Second,
        WriteTimeout: 20 * time.Second,
        IdleTimeout:  120 * time.Second,
    }

    log.Printf("Server starting on port %s", port)
    log.Fatal(srv.ListenAndServe())
}
  1. 项目结构:确保项目目录包含以下文件(假设项目名为 “myapp”):
    • main.go(你的 Go 代码)
    • go.mod(Go 模块文件)
    • Procfile(内容为 web: myapp
    • Views/ 目录(包含 HTML 文件)

例如,项目结构如下:

myapp/
  main.go
  go.mod
  Procfile
  Views/
    index.html
  1. 部署步骤
    • 在本地构建并测试:运行 go build -o myapp 生成二进制文件,确保无错误。
    • 将整个项目目录(包括所有文件)压缩为 ZIP 文件。
    • 上传 ZIP 到 AWS Beanstalk。

Beanstalk 会检测 Go 项目,使用 go.mod 自动构建,并根据 Procfile 启动应用。如果问题 persist,检查 Beanstalk 环境日志以获取详细错误信息。

回到顶部