我想排查我完全私有的 Amazon Elastic Beanstalk 环境中的联网问题。
## 简短描述
完全私有环境具有以下设置,并且仅允许从同一 Amazon Virtual Private Cloud(Amazon VPC)访问您的 Web 应用程序。
* **负载均衡器可见性**:私有
* **负载均衡器子网**:两个私有子网
* **实例公有 IP**:已禁用
* **实例子网**:两个私有子网
VPC 上的所有通信均通过配置的 VPC 端点进行。此外,VPC 内的所有通信均通过路由表中的本地路由进行。以下是由于网络配置而可能在环境中看到的常见错误:
* Amazon Elastic Compute Cloud(Amazon EC2)实例无法与 Elastic Beanstalk 通信。通信失败的原因可能是 VPC 配置问题或 EC2 实例故障。请检查您的 VPC 配置并尝试再次启动环境。
* 实例在允许的命令超时时间内没有响应。
## 解决方法
在创建完全私有的 Elastic Beanstalk 环境时,请确保设置了以下配置:
* 您必须有一个 VPC,其中至少有两个私有子网,且位于不同的可用区。
* VPC 必须启用 DNS 主机名和 DNS 解析。启用这些功能会在您的 VPC 中添加一个 DNS 条目,从而将公有服务端点映射到接口 VPC 端点。
* 您必须创建 VPC 端点,以便 VPC 之外的亚马逊云科技服务和 VPC 内部的实例能够通过这些端点进行通信。
### 检查 VPC 端点
标准的 Elastic Beanstalk 环境必须具有以下 VPC 端点才能成功创建:
* com.amazonaws.your-region.elasticbeanstalk(Elastic Beanstalk 接口端点)
* com.amazonaws.your-region.elasticbeanstalk-health(Elastic Beanstalk 运行状况检查接口端点)
* com.amazonaws.your-region.cloudformation(AWS CloudFormation 接口端点)
* com.amazonaws.your-region.logs(日志接口端点)
* com.amazonaws.your-region.sqs \[Amazon Simple Queue Service(Amazon SQS)接口端点]
* com.amazonaws.your-region.s3 \[Amazon Simple Storage Service(Amazon S3)接口端点]
对于在 64 位 Amazon Linux 2 上运行的 Docker 平台上运行的环境,必须具有以下额外的 VPC 端点:
* com.amazonaws.your-region.ecr.dkr
* com.amazonaws.your-region.ecr.api
对于在 64 位 Amazon Linux 2 上运行的 Amazon Elastic Container Service(Amazon ECS)平台上运行的环境,必须具有以下额外的 VPC 端点:
* com.amazonaws.your-region.ecs
* com.amazonaws.your-region.ecr.api
* com.amazonaws.your-region.ecr.dkr
**注意**:为确保您的 Docker 和 Multi-Docker 环境正常运行,请提供一个[私有 Docker 映像](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/vpc.html#services-vpc-private:\~:text=Provide%20a%20private%20Docker%20image?trk=cndc-detail)。
### 检查安全组
创建接口 VPC 端点时,必须为您的 VPC 端点选择子网和安全组。务必要选择具有恰当入站规则的私有子网和安全组。
**附加到接口 VPC 端点的安全组**必须具有端口 443(HTTPS)的入站规则:
**入站规则:**
| | | | |
| ------ | ------ | -------- | ---------------- |
| **类型** | **协议** | **端口范围** | **源** |
| HTTPS | TCP | 443 | 客户端 IP 地址(请参阅注释) |
**注意:**为保护通过 VPC 端点的传入流量,可考虑在**源**中仅指定客户端的 IP 地址或网络。
此外,还需要验证与**实例关联的安全组**是否允许来自负载均衡器安全组的 HTTP 流量:
**入站规则:**
| | | | |
| ------ | ------ | -------- | -------- |
| **类型** | **协议** | **端口范围** | **源** |
| HTTP | TCP | 80 | 负载均衡器安全组 |
验证与**负载均衡器关联的安全组**是否允许入站规则中的所有 HTTP 流量:
**入站规则:**
| | | | |
| ------ | ------ | -------- | --------- |
| **类型** | **协议** | **端口范围** | **源** |
| HTTP | TCP | 80 | 0.0.0.0/0 |
**注意**:您无需限制上述任何安全组的出口流量。
### 检查路由表条目
创建网关端点时,您可以选择路由表。务必要选择与 VPC 的私有子网关联的路由表。与私有子网关联的路由表必须为每个网关 VPC 端点提供一个路由。例如,您必须为每个与 Amazon Simple Storage Service(Amazon S3)或 Amazon DynamoDB 关联的网关 VPC 端点提供一个路由。
**路由表条目:**
| | |
| ------------- | ---------- |
| **目的地** | **目标** |
| 172.xx.x.0/16 | 本地 |
| pl-63a5xxx | vpce-04xxx |
### 检查 VPC 端点策略
[VPC 端点策略](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies?trk=cndc-detail)必须允许您的 Elastic Beanstalk 环境与服务进行私密通信。创建接口端点或网关端点时,您可以附加端点策略。端点策略控制哪些亚马逊云科技主体可以使用 VPC 端点访问端点服务。亚马逊云科技主体包括亚马逊云科技账户、Amazon Identity and Access Management(IAM)用户和 IAM 角色。如果您在创建端点时未指定端点策略,则将默认该端点具有完全访问权限。
以下是使用 Elastic Beanstalk 时,S3 端点需要具有的 S3 网关 VPC 端点最低策略示例。
```
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EBBucketAccess",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject",
"s3:PutBucketPolicy",
"s3:PutObjectVersionAcl"
],
"Resource": [
"arn:aws:s3:::elasticbeanstalk-*",
"arn:aws:s3:::elasticbeanstalk-*/*",
"arn:aws:s3:::cloudformation*/*"
]
}
]
}
```
***
## 相关信息
[使用接口 VPC 端点访问亚马逊云科技服务](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#vpce-private-dns?trk=cndc-detail)