

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

# 将 Elastic Beanstalk 和 Amazon VPC 结合使用
<a name="vpc"></a>

本主题介绍将 VPC 端点与 Elastic Beanstalk 配合使用的好处以及您可以实现的不同配置类型。

您可以使用[亚马逊虚拟私有云（亚马逊](https://docs.aws.amazon.com/vpc/latest/userguide/) VPC）为您的 Elastic Beanstalk 应用程序和相关资源创建安全的网络。 AWS 在创建您的环境时，您可以选择用于您的应用程序实例和负载均衡器的 VPC、子网和安全组。您可以使用所需的任何 VPC 配置，只要它满足以下要求即可。

**VPC 要求**
+ **Internet 访问** - 实例可以通过下列方法之一访问 Internet：
  + **公有子网** - 实例具有公有 IP 地址并使用互联网网关访问 Internet。
  + **私有子网** - 实例使用 NAT 设备访问 Internet。
**注意**  
如果您将 VPC 中的 [VPC 终端节点](vpc-vpce.md)配置为同时连接到 `elasticbeanstalk` 和 `elasticbeanstalk-health` 服务，则 Internet 访问是可选的，并且仅在应用程序特别需要时才需要它。如果没有 VPC 终端节点，则您的 VPC 必须具有 Internet 访问权限。  
Elastic Beanstalk 为您设置的默认 VPC 提供了 Internet 访问权限。

  Elastic Beanstalk 不支持使用代理设置（如 `HTTPS_PROXY`）配置 Web 代理。
+ **NTP** - Elastic Beanstalk 环境中的实例使用网络时间协议 (NTP) 同步系统时钟。如果实例在 UDP 端口 123 上无法通信，时钟将无法同步，从而导致问题并发出 Elastic Beanstalk 运行状况报告。确保您的 VPC 安全组和网络 ACLs 允许端口 123 上的入站和出站 UDP 流量，以避免这些问题。

[elastic-beanstalk-samples](https://github.com/awsdocs/elastic-beanstalk-samples/)存储库提供了 CloudFormation 模板，您可以使用这些模板来创建 VPC，以便在 Elastic Beanstalk 环境中使用。

**使用 CloudFormation 模板创建资源**

1. 克隆示例存储库或使用[自述文件](https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/cfn-templates/README.md)中的链接下载模板。

1. 打开 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/home)。

1. 选择**创建堆栈**。

1. 选择**将模板上传到 Amazon S3**。

1. 选择**上传文件**，然后从本地计算机中上传模板文件。

1. 选择**下一步**，然后按照说明使用模板中的资源创建堆栈。

堆栈创建完成后，请检查**输出**选项卡以查找 VPC ID 和子网 IDs。可以使用这些 ID 在新建环境向导的[网络配置类别](environments-create-wizard.md#environments-create-wizard-network)中配置 VPC。

**Topics**
+ [公有 VPC](#services-vpc-public)
+ [公有/私有 VPC](#services-vpc-privatepublic)
+ [私有 VPC](#services-vpc-private)
+ [示例：使用堡垒主机启动 VPC 中的 Elastic Beanstalk 应用程序](vpc-bastion-host.md)
+ [示例：使用 Amazon RDS 启动 VPC 中的 Elastic Beanstalk](vpc-rds.md)
+ [将 Elastic Beanstalk 与 VPC 终端节点结合使用](vpc-vpce.md)
+ [使用终端节点策略控制通过 VPC 终端节点进行的访问](vpc-vpce.policy.md)

## 公有 VPC
<a name="services-vpc-public"></a>

**CloudFormation 模板** — [v](https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/cfn-templates/vpc-public.yaml) pc-public.yaml

**设置 (负载均衡)**
+ **负载均衡器可见性** - 公有
+ **负载均衡器子网** - 两个公有子网
+ **实例公有 IP** - 已启用
+ **实例子网** - 两个公有子网
+ **实例安全组** - 添加默认安全组

**设置 (单个实例)**
+ **实例子网** - 公有子网之一
+ **实例安全组** - 添加默认安全组

基本*仅公有* VPC 布局包含一个或多个公有子网，一个互联网网关和一个默认安全组（允许 VPC 中的资源之间的流量）。在 VPC 中创建环境时，Elastic Beanstalk 会创建额外的资源（因环境类型而异）。

**VPC 资源**
+ **单一实例** - Elastic Beanstalk 为应用程序实例创建一个安全组以允许端口 80 上的 Internet 流量，并为实例分配一个弹性 IP 以为其提供公有 IP 地址。环境的域名将解析为实例的公有 IP 地址。
+ **负载均衡** - Elastic Beanstalk 为负载均衡器创建一个安全组以允许端口 80 上的 Internet 流量，并为应用程序实例创建一个安全组以允许来自负载均衡器的安全组的流量。环境的域名将解析为负载均衡器的公有域名。

这与在使用默认 VPC 时 Elastic Beanstalk 管理网络的方式类似。公有子网中的安全性取决于 Elastic Beanstalk 创建的负载均衡器和实例安全组。它是成本最低的配置，因为它不需要使用 NAT 网关。

## 公有/私有 VPC
<a name="services-vpc-privatepublic"></a>

**CloudFormation 模板** — [vpc-privatepublic.yaml](https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/cfn-templates/vpc-privatepublic.yaml)

**设置 (负载均衡)**
+ **负载均衡器可见性** - 公有
+ **负载均衡器子网** - 两个公有子网
+ **实例公有 IP** - 已禁用
+ **实例子网** - 两个私有子网
+ **实例安全组** - 添加默认安全组

要提高安全性，请在您的 VPC 中添加私有子网以创建*公有-私有* 布局。该布局需要在公有子网中使用负载均衡器和 NAT 网关，并允许您在私有子网中运行您的应用程序实例、数据库和任何其他资源。私有子网中的实例只能通过负载均衡器和 NAT 网关与 Internet 通信。

## 私有 VPC
<a name="services-vpc-private"></a>

**CloudFormation 模板 — vpc-p** [rivate.yaml](https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/cfn-templates/vpc-private.yaml)

**设置 (负载均衡)**
+ **负载均衡器可见性** - 私有
+ **负载均衡器子网** - 两个私有子网
+ **实例公有 IP** - 已禁用
+ **实例子网** - 两个私有子网
+ **实例安全组** - 添加默认安全组

对于不应从 Internet 访问的内部应用程序，您可以在私有子网中运行所有内容，并将负载均衡器配置为面向内部（将 **Load balancer visibility (负载均衡器可见性)** 更改为 **Internal (内部)**）。此模板创建一个没有公有子网和互联网网关的 VPC。可以将该布局用于只应从同一 VPC 或附加的 VPN 中访问的应用程序。

### 在私有 VPC 中运行 Elastic Beanstalk 环境
<a name="services-vpc-private-beanstalk"></a>

如果在私有 VPC 中创建 Elastic Beanstalk 环境，则该环境无法访问 Internet。您的应用程序可能需要访问 Elastic Beanstalk 服务或其他服务。您的环境可能使用增强型运行状况报告，在此情况下，环境实例会将运行状况信息发送到增强型运行状况服务。环境实例上的 Elastic Beanstalk 代码将流量发送 AWS 到其他服务，将其他流量发送到AWS 非终端节点（例如，下载应用程序的依赖包）。以下是您在此情况下为确保环境正常运行而可能需要执行的一些步骤。
+ *为 Elastic Beanstalk 配置 VPC 终端节点* - Elastic Beanstalk 以及增强型运行状况服务支持 VPC 终端节点，这将确保流向这些服务的流量保持在 Amazon 网络内并且不需要 Internet 访问权限。有关更多信息，请参阅 [将 Elastic Beanstalk 与 VPC 终端节点结合使用](vpc-vpce.md)。
+ *为其他服务配置 VPC 终端节点* — Elastic Beanstalk 实例代表您向其他 AWS 几项服务发送流量：亚马逊简单存储服务 (Amazon S3)、亚马逊简单队列服务 (Amazon SQS) Simple Queue Service 和亚马逊日志。 AWS CloudFormation CloudWatch 您也必须为这些服务配置 VPC 终端节点。有关 VPC 端点（包括每个服务链接）的详细信息，请参阅《*Amazon VPC 用户指南*》中的 [VPC Endpoints](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)。
**注意**  
一些 AWS 服务，包括 Elastic Beanstalk，在有限数量的区域中支持 VPC 终端节点。 AWS 在设计私有 VPC 解决方案时，请确认 Elastic Beanstalk 和此处提到的其他依赖服务是否支持您选择的区域中的 VPC 终端节点 AWS 。
+ *提供私有 Docker 映像* - 在 [Docker](create_deploy_docker.md) 环境中，环境实例上的代码可能会尝试在环境创建期间从 Internet 中提取配置的 Docker 映像，但此操作将失败。要避免发生此失败，请在您的环境中[构建自定义 Docker 映像](single-container-docker-configuration.md#single-container-docker-configuration.dockerfile)，或使用存储在 [Amazon Elastic Container Registry](https://docs.aws.amazon.com/AmazonECR/latest/userguide/) (Amazon ECR) 中的 Docker 映像并[为 Amazon ECR 服务配置 VPC 终端节点](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)。
+ *启用 DNS 名称* — 环境实例上的 Elastic Beanstalk 代码使用公共终端节点 AWS 向所有服务发送流量。要确保此流量通过，请在配置所有接口 VPC 终端节点时选择 **Enable DNS name (启用 DNS 名称)** 选项。这会在您的 VPC 中添加一个 DNS 条目，该条目将公有服务终端节点映射到接口 VPC 终端节点。
**重要**  
如果您的 VPC 不是私有的，并且具有公有 Internet 访问权限，并且如果为任何 VPC 终端节点禁用了 **Enable DNS name (启用 DNS 名称)**，则流向相应服务的流量将通过公有 Internet 传输。这可能不是您期望实现的。使用私有 VPC 可轻松检测到此问题，因为它可以防止此流量通过并且您会收到错误。但是，对于公有 VPC，您不会收到任何指示。
+ *包含应用程序依赖项* - 如果您的应用程序具有诸如语言运行时包之类的依赖项，它可能会尝试在环境创建期间从 Internet 下载并安装这些依赖项，但此操作将失败。要避免发生此失败，请在应用程序的源包中包含所有依赖项包。
+ *使用当前平台版本* - 请确保您的环境使用 2020 年 2 月 24 日版或更高版本的平台。具体而言，请使用在以下两个更新之一中或之后发布的平台版本：[Linux Update 2020-02-28](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2020-02-28-linux.html)、[Windows Update 2020-02-24](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2020-02-24-windows.html)。
**注意**  
需要更新的平台版本的原因是，旧版本存在一个问题，此问题可能会阻止通过 **Enable DNS name (启用 DNS 名称)** 选项创建的 DNS 条目正常用于 Amazon SQS。