

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Elastic Beanstalk Go 平台
<a name="go-environment"></a>

本主题介绍如何在 Elastic Beanstalk 上配置、构建和运行 Go 应用程序。

AWS Elastic Beanstalk 支持不同版本的 Go 编程语言的许多平台分支。有关完整列表，请参阅 *AWS Elastic Beanstalk 平台*文档中的 [Go](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.go)。

对于简单的 Go 应用程序，有两种部署方式：
+ 通过根目录中名为 `application.go` 的源文件提供源包，该文件包含应用程序的主程序包。Elastic Beanstalk 使用以下命令生成二进制文件：

  ```
  go build -o bin/application application.go
  ```

  应用程序生成后，Elastic Beanstalk 在端口 5000 上启动它。
+ 通过名为 `application` 的二进制文件提供源包。此二进制文件可位于源包的根目录或源包的 `bin/` 目录中。如果您将 `application` 二进制文件同时放在这两个位置，Elastic Beanstalk 将使用 `bin/` 目录中的文件。

  Elastic Beanstalk 在端口 5000 上启动此应用程序。

在这两种情况下，通过我们支持的 Go 平台分支，您还可以在名为 `go.mod` 的文件中提供模块要求。有关更多信息，请参阅 Go 博客中的[迁移到 Go 模块](https://blog.golang.org/migrating-to-go-modules)。

对于更复杂的 Go 应用程序，有两种部署方式：
+ 提供包含应用程序源文件的源包，同时提供 [Buildfile](go-buildfile.md) 和 [Procfile](go-procfile.md)。Buildfile 包含用于生成应用程序的命令，Procfile 包含用于运行应用程序的指令。
+ 提供包含应用程序二进制文件的源包，同时提供 Procfile。Procfile 包含用于运行应用程序的指令。

Go 平台包括一个代理服务器，用于提供静态资产并将流量转发到您的应用程序。您可以[扩展或覆盖默认代理配置](go-nginx.md)，以适应高级方案。

有关扩展 Elastic Beanstalk 基于 Linux 的平台的各种方法的详细信息，请参阅 [扩展 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。

## 配置 Go 环境
<a name="go-options"></a>

Go 平台设置允许您微调 Amazon EC2 实例的行为。您可以使用 Elastic Beanstalk 控制台编辑 Elastic Beanstalk 环境 EC2 的亚马逊实例配置。

使用 Elastic Beanstalk 控制台启用到 Amazon S3 的日志轮换，并配置应用程序可从环境中读取的变量。

**在 Elastic Beanstalk 控制台中配置 Go 环境**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration**（配置）。

1. 在 **Updates, monitoring, and logging**（更新、监控和日志记录）配置类别中，选择 **Edit**（编辑）。

### 日志选项
<a name="go-options-logs"></a>

“日志选项”部分有两个设置：
+ **Instance profile**（实例配置文件）– 指定有权访问与应用程序关联的 Amazon S3 存储桶的实例配置文件。
+ **启用向 Amazon S3 的日志文件轮换-指定是否将**应用程序的 Amazon EC2 实例的日志文件复制到与您的应用程序关联的 Amazon S3 存储桶中。

### 静态文件
<a name="go-options-staticfiles"></a>

为了提高性能，您可以使用 **Static files**（静态文件）部分配置代理服务器，以便从 Web 应用程序内的一组目录提供静态文件（例如 HTML 或图像）。对于每个目录，您都将虚拟路径设置为目录映射。当代理服务器收到对指定路径下的某个文件的请求时，它将直接提供此文件，而不是将请求路由至您的应用程序。

有关使用配置文件或 Elastic Beanstalk 控制台配置静态文件的详细信息，请参阅 [提供静态文件](environment-cfg-staticfiles.md)。

### 环境属性
<a name="go-options-properties"></a>

**环境属性**部分允许您在运行您的应用程序的 Amazon EC2 实例上指定环境配置设置。环境属性会以密钥值对的形式传递到应用程序。

在运行于 Elastic Beanstalk 中的 Go 环境内，可通过使用 `os.Getenv` 函数访问环境变量。例如，您可以使用以下代码将名为 `API_ENDPOINT` 的属性读取到某个变量：

```
endpoint := os.Getenv("API_ENDPOINT")
```

参阅 [环境变量和其他软件设置](environments-cfg-softwaresettings.md) 了解更多信息。

## Go 配置命名空间
<a name="go-namespaces"></a>

您可以使用[配置文件](ebextensions.md)设置配置选项并在部署期间执行其他实例配置。配置选项可以[特定于平台](command-options-specific.md)，也可以应用于整个 Elastic Beanstalk 服务中的[所有平台](command-options-general.md)。配置选项被组织到*命名空间*中。

Go 平台不定义任何特定于平台的命名空间。您可以使用 `aws:elasticbeanstalk:environment:proxy:staticfiles` 命名空间将代理配置为提供静态文件。有关详细信息和示例，请参阅[提供静态文件](environment-cfg-staticfiles.md)。

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外，您还可使用控制台、保存的配置、EB CLI 或 AWS CLI来配置选项。请参阅[配置选项](command-options.md)了解更多信息。

## Amazon Linux AMI（在 Amazon Linux 2 之前）的 Go 平台
<a name="go.alami"></a>

如果您的 Elastic Beanstalk Go 环境使用 Amazon Linux AMI 平台版本（在 Amazon Linux 2 之前），请阅读本节中的其他信息。

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/ AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### Go 配置命名空间 — 亚马逊 Linux AMI () AL1
<a name="go.alami.namespaces"></a>

您可以使用[配置文件](ebextensions.md)设置配置选项并在部署期间执行其他实例配置。配置选项可以[特定于平台](command-options-specific.md)，也可以应用于整个 Elastic Beanstalk 服务中的[所有平台](command-options-general.md)。配置选项被组织到*命名空间*中。

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/ AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。

除了[所有平台支持的命名空间](command-options-general.md)外，Amazon Linux AMI Go 平台还支持一个特定于平台的配置命名空间。使用 `aws:elasticbeanstalk:container:golang:staticfiles` 命名空间可以定义一些选项，通过它们将您的 Web 应用程序路径映射到应用程序源包中包含静态内容的文件夹。

例如，该[配置文件](ebextensions.md)告诉代理服务器在路径 `/images` 上的 `staticimages` 文件夹中提供文件：

**Example .ebextensions/go-settings.config**  

```
option_settings:
  aws:elasticbeanstalk:container:golang:staticfiles:
    /html: statichtml
    /images: staticimages
```

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外，您还可使用控制台、保存的配置、EB CLI 或 AWS CLI来配置选项。请参阅[配置选项](command-options.md)了解更多信息。

# 在 Elastic Beanstalk 上使用 Procfile 配置自定义启动命令
<a name="go-procfile"></a>

要指定用于启动 Go 应用程序的自定义命令，请在源包根目录中包含一个名为 `Procfile` 的文件。

有关编写和使用 `Procfile` 的详细信息，请参阅 [Buildfile 和 Procfile](platforms-linux-extend.build-proc.md)。

**Example Procfile**  

```
web: bin/server
queue_process: bin/queue_processor
foo: bin/fooapp
```

您必须调用主应用程序 `web`，并在 `Procfile` 中将其列为第一个命令。Elastic Beanstalk 在环境的根 URL 上公开主 `web` 应用程序；例如，`http://my-go-env.elasticbeanstalk.com`。

Elastic Beanstalk 还会运行名称没有 `web_` 前缀的任何应用程序，但这些应用程序在您的实例外部不可用。

Elastic Beanstalk 希望从 `Procfile` 运行的进程一直运行。Elastic Beanstalk 会监控这些应用程序并重启所有终止的进程。对于短期运行的进程，请使用 [Buildfile](go-buildfile.md) 命令。

## 在 Amazon Linux AMI（在 Amazon Linux 2 之前）上使用 Procfile
<a name="go-procfile.alami"></a>

如果您的 Elastic Beanstalk Go 环境使用 Amazon Linux AMI 平台版本（在 Amazon Linux 2 之前），请阅读本节中的其他信息。

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/ AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### 端口传递 — 亚马逊 Linux AMI (AL1)
<a name="go-procfile.alami.ports"></a>

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/ AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。

Elastic Beanstalk 配置 nginx 代理，使其在应用程序的 `PORT` [环境属性](go-environment.md#go-options)中指定的端口号上转发对应用程序的请求。您的应用程序应始终侦听该端口。您可以通过在应用程序中调用 `os.Getenv("PORT")` 方法访问此变量。

Elastic Beanstalk 使用 `PORT` 环境属性中指定的端口号作为 `Procfile` 中第一个应用程序的端口，然后对 `Procfile` 中的每个后续应用程序的端口号递增 100。如果未设置 `PORT` 环境属性，则 Elastic Beanstalk 使用 5000 作为初始端口。

在前面的示例中，`web` 应用程序的 `PORT` 环境属性为 5000，`queue_process` 应用程序使用 5100，`foo` 应用程序使用 5200。

您可以通过 [aws:elasticbeanstalk:application:environment](command-options-general.md#command-options-general-elasticbeanstalkapplicationenvironment) 命名空间设置 `PORT` 选项从而指定初始端口，如下例所示。

```
option_settings:
  - namespace:  aws:elasticbeanstalk:application:environment
    option_name:  PORT
    value:  <first_port_number>
```

有关为应用程序设置环境属性的更多信息，请参阅 [选项设置](ebextensions-optionsettings.md)。

# 在 Elastic Beanstalk 上使用 Buildfile 进行自定义构建和配置
<a name="go-buildfile"></a>

要为您的 Go 应用程序指定自定义的生成和配置命令，请在源包根目录中包含一个名为 `Buildfile` 的文件。文件名区分大小写。`Buildfile` 应采用以下格式：

```
<process_name>: <command>
```

`Buildfile` 中的命令必须符合以下正则表达式：`^[A-Za-z0-9_]+:\s*.+$`。

Elastic Beanstalk 不会监控通过 `Buildfile` 运行的应用程序。对于短期运行并在完成任务后终止的命令，请使用 `Buildfile`。对于长期运行、不应退出的应用程序进程，请使用 [Procfile](go-procfile.md)。

在下面的 `Buildfile` 示例中，`build.sh` 是位于源包根目录的 Shell 脚本：

```
make: ./build.sh
```

`Buildfile` 中的所有路径都是源包根目录的相对路径。如果您事先知道这些文件在实例上的位置，则可以在 `Buildfile` 中使用绝对路径。

# 配置代理服务器
<a name="go-nginx"></a>

Elastic Beanstalk 使用 nginx 作为反向代理，将应用程序映射到端口 80 上的 Elastic Load Balancing 负载均衡器。Elastic Beanstalk 提供一个默认 nginx 配置，您可以扩展该配置，也可以使用您自己的配置完全覆盖该配置。

默认情况下，Elastic Beanstalk 将 nginx 代理配置为通过端口 5000 向您的应用程序转发请求。您可以覆盖默认端口，方法是将 `PORT` [环境属性](go-environment.md#go-options)设置为主应用程序侦听的端口。

**注意**  
应用程序侦听的端口不会影响 nginx 服务器为了从负载均衡器接收请求而侦听的端口。

**在平台版本上配置代理服务器**  
所有 AL2 023/ AL2 平台都支持统一的代理配置功能。有关在运行 AL2 023/ 的平台版本上配置代理服务器的更多信息AL2，请参阅。[反向代理配置](platforms-linux-extend.proxy.md)

## 在 Amazon Linux AMI（在 Amazon Linux 2 之前）上配置代理
<a name="go-nginx.alami"></a>

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/ AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

如果您的 Elastic Beanstalk Go 环境使用 Amazon Linux AMI 平台版本（在 Amazon Linux 2 之前），请阅读本节中的信息。

### 扩展和覆盖默认代理配置 — Amazon Linux AMI () AL1
<a name="go-nginx.alami.extending"></a>

Elastic Beanstalk 使用 nginx 作为反向代理，将应用程序映射到端口 80 上的负载均衡器。如果您想提供自己的 nginx 配置，可以覆盖 Elastic Beanstalk 提供的默认配置，方法是在源包中包含 `.ebextensions/nginx/nginx.conf` 文件。如果此文件存在，Elastic Beanstalk 会使用它来替代默认的 nginx 配置文件。

如果除 `nginx.conf` `http` 块中的指令外，您还想包含其他指令，可以在源包的 `.ebextensions/nginx/conf.d/` 目录中提供其他配置文件。此目录中的所有文件都必须采用 `.conf` 扩展名。

要利用 Elastic Beanstalk 提供的功能（例如[Elastic Beanstalk 中的增强型运行状况报告和监控](health-enhanced.md)、自动应用程序映射和静态文件），您必须在 nginx 配置文件的 `server` 块中包含下面一行：

```
include conf.d/elasticbeanstalk/*.conf;
```