

# 排查 Amazon ECS Express Mode 服务问题
<a name="express-service-troubleshooting"></a>

本节将帮助您识别和解决部署和管理 Express Mode 服务时遇到的常见问题。

## 部署问题
<a name="express-service-deployment-issues"></a>

### 服务停滞在 ACTIVE 或 DRAINING 状态
<a name="express-service-service-stuck-provisioning"></a>

**症状：**DescribeServiceRevisions 显示资源仍在预置或取消预置。DescribeServices 显示部署未稳定

**可能的原因和解决方案：**
+ **IAM 权限不足**：验证任务执行角色和基础设施角色是否具有相应的托管策略中所示的必要权限。

  ```
  # Check if the role has the required managed policy
  aws iam list-attached-role-policies --role-name ecsTaskExecutionRole
  ```
+ **映像拉取失败**：确保容器映像存在且可访问。

  ```
  # Test image pull manually
  docker pull 123456789012.dkr.ecr.us-west-2.amazonaws.com/my-app:latest
  ```
+ **网络连接问题**：检查子网是否可以访问互联网或 AWS 服务的 Amazon VPC 端点。
+ **资源限制**：验证您的账户是否有足够的 Fargate 容量且尚未达到服务配额。

**诊断步骤：**

1. 使用 DescribeExpressGatewayService 获取当前服务修订，然后使用 DescribeServiceRevisions 获取服务修订，以获取预置或取消预置的状态

1. 查看 Amazon ECS 控制台中的服务事件，以获取详细的错误消息。

1. 检查容器端口是否设置正确

1. 查看 Amazon ECS 和 Fargate 的 AWS 服务配额。

### 任务启动失败
<a name="express-service-task-startup-failures"></a>

**症状：**任务无法启动，或者启动后立即停止。

**常见原因：**
+ **应用程序错误**：由于配置或运行时错误，容器应用程序退出。
+ **运行状况检查失败**：应用程序未响应预期端口或路径上的运行状况检查。
+ **资源约束**：为应用程序分配的 CPU 或内存不足。
+ **缺少环境变量或密钥**：应用程序无法使用所需的配置。

**解决步骤：**

1. 在 CloudWatch Logs 中查看应用程序日志，并从 DescribeServiceRevisions 获取日志组名称：

   ```
   aws logs describe-log-streams --log-group-name /ecs/express-service-my-app
   aws logs get-log-events --log-group-name /ecs/express-service-my-app --log-stream-name stream-name
   ```

1. 验证运行状况检查路径是否返回 HTTP 200 状态。

1. 在本地测试容器映像，以确保其正确启动。

1. 如有需要，请检查并调整 CPU 和内存分配。

## 连接问题
<a name="express-service-connectivity-issues"></a>

### 无法通过负载均衡器访问应用程序
<a name="express-service-application-unreachable"></a>

**症状：**应用程序 URL 返回超时或连接错误。

**故障排除步骤：**

1. 验证您的资源是否已完成预置

1. 验证任务是否正在运行且运行状况良好：

   ```
   aws ecs describe-services --cluster my-cluster --services my-express-service
   ```

1. 检查应用程序负载均衡器目标组运行状况：

   ```
   aws elbv2 describe-target-health --target-group-arn arn:aws:elasticloadbalancing:region:account:targetgroup/name/id
   ```

1. 确保应用程序正在侦听容器内的正确端口。

## 性能问题
<a name="express-service-performance-issues"></a>

### 响应时间慢
<a name="express-service-slow-response-times"></a>

**症状：**应用程序响应速度比预期慢。

**诊断方法：**

1. 监控 CPU 和内存利用率：

   ```
   # Check CloudWatch metrics for the service
   aws cloudwatch get-metric-statistics \
       --namespace AWS/ECS \
       --metric-name CPUUtilization \
       --dimensions Name=ServiceName,Value=my-express-service Name=ClusterName,Value=my-cluster \
       --start-time 2024-01-01T00:00:00Z \
       --end-time 2024-01-01T01:00:00Z \
       --period 300 \
       --statistics Average
   ```

1. 检查应用程序日志，查找错误或性能警告。

1. 检查自动扩缩是否适当地响应负载。

1. 分析请求分配的负载均衡器指标。

**优化策略：**
+ 如果资源受限，请增加 CPU 或内存分配。
+ 调整自动扩缩阈值以提前横向扩展。
+ 优化应用程序代码和数据库查询。

### 自动扩缩未按预期工作
<a name="express-service-scaling-issues"></a>

**症状：**服务在高负载期间无法纵向扩展，或者在低负载期间无法缩减。

**故障排除步骤：**

1. 检查自动扩缩策略及其配置：

   ```
   aws application-autoscaling describe-scaling-policies \
       --service-namespace ecs \
       --resource-id service/my-cluster/my-express-service
   ```

1. 查看 CloudWatch 指标，以确保满足扩展触发条件。

1. 验证服务是否具有扩展权限（检查 IAM 角色）。

1. 检查是否有任何扩展活动及其结果。

## 监控和调试工具
<a name="express-service-monitoring-debugging"></a>

### 使用 CloudWatch Container Insights
<a name="express-service-cloudwatch-insights"></a>

启用 Container Insights 以进行全面监控：

```
aws ecs put-account-setting --name containerInsights --value enabled
```

Container Insights 提供：
+ CPU、内存、磁盘和网络指标
+ 性能监控控制面板
+ 日志关联和分析
+ 异常检测