在云计算和容器化技术的浪潮中,越来越多的企业选择将他们的应用托管在云端。而在这一切背后Amazon Elastic Container Service (ECS) 正在发挥着至关重要的作用,从自动化的容器管理到高效的资源分配,ECS不仅大幅提升了开发者的工作效率,也让企业能够在复杂的部署环境中游刃有余。本篇文章中将深入探讨如何通过 ECS 简化容器化应用的部署与管理。

目录

初识ECS

工作原理

测试应用

写在最后

初识ECS

        Amazon Elastic Container Service(ECS):是一种高效的容器管理服务,专为大规模部署和运行容器化应用设计,它允许开发者和运维团队通过简化的界面来管理容器集群,自动化容器的部署、扩展和管理,其支持多种容器化应用的运行,可以与Amazon EC2和Amazon Fargate配合使用,实现灵活的容器调度和管理,从 网址 我们可以看出当前ECS所具备的优势:

        当然如果想在客户管理的基础设施上轻松运行和管理容器工作负载,包括在自己的本地数据中心、虚拟机和裸机服务器中进行使用,这里我们也可以使用ECS Anywhere来处理这个问题,使用场景很多可以自行体验:

当然对于初次使用ECS的朋友也可以来到 官网 查看具体的操作步骤来实现具体操作:

工作原理

        Amazon ECS Container Insights集成Prometheus监控,通过CloudWatch Agent自动发现和采集容器化应用的 Prometheus 指标,如下图所示:

        应用侧需要通过prometheus 各种exporter 来把指标主动暴露出来,比如接下来我们将使用的JMX_exporter,我们安装好CloudWatch agent service并授予适当的CloudWatch agent ECS task role使其实现ECS cluster的自动服务发现,准备好PROMETHEUS_CONFIG_CONTENT和CloudWatch_CONFIG_CONTENT配置,用于指标抓取和过滤,CloudWatch agent把抓取过来的EMF格式存储在CloudWatch logs,然后再转换成prometheus 的metric展示在CloudWatch面板,如下表所示:

Amazon ECS launch type

Network modes supported

EC2 (Linux)

bridge, host, and awsvpc

Fargate

awsvpc

        Prometheus社区有很多自动发现的方法,详见<scrape_config>, 但是对于ECS cluster,我们需要CloudWatch agent 定期访问ECS cluster 的控制平面API 实现Task 的自动发现,他支持3种服务发现的模式:

1)Container docker label-based 自动发现

2)ECS task definition ARN 正则表达式自动发现

3)ECS service name 正则表达式自动发现

        可以同时配置3种模式,CloudWatch Agent 可以开启de-duplicates 做指标的去重,在控制台Systems Manager > Parameter Store 创建 prometheus-config 的参数:

global:
  scrape_interval: 1m
  scrape_timeout: 10s
scrape_configs:
  - job_name: cwagent-ecs-file-sd-config //名字需要跟cwagent-config mapping
    sample_limit: 10000
    file_sd_configs:
      - files: [ "/tmp/cwagent_ecs_auto_sd.yaml" ] //路径需要跟cwagent-config mapping

我们可以在控制台Systems Manager > Parameter Store 创建 cwagent-config 的参数:

{
  "agent": {
    "debug": true
  },
  "logs": {
    "metrics_collected": {
      "prometheus": {
        "cluster_name": "testecs", //必须要有,用于过滤
        "log_group_name": "/aws/ecs/containerinsights/testecs/prometheus",//必须要有,用于过滤
        "prometheus_config_path": "env:PROMETHEUS_CONFIG_CONTENT",
        "ecs_service_discovery": {
          "sd_frequency": "1m",
          "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", //名字跟上面的files匹配
          "task_definition_list": [
            {
              "sd_task_definition_arn_pattern": ".*:task-definition/*"  //使用task definition ARN 的正则匹配,可以根据业务要求做task 的过滤
            }
          ]
        },
        "emf_processor": {
          "metric_declaration_dedup": true, //启用自动去重
          "metric_declaration": [
            {
              "source_labels": ["job"],  //这个job 就是job_name 
              "label_matcher": "cwagent-ecs-file-sd-config",  //名字需要跟job_name 匹配
              "dimensions": [["ClusterName","TaskDefinitionFamily"]], //不同指标dimension不同
              "metric_selectors": [   //这里添加自定义指标,名字需要跟jmx_exporter暴露的名字一致
                "^jvm_threads_current$",
                "^jvm_threads_peak$",
                "^jvm_gc_collection_seconds_count$",
                "^jvm_gc_collection_seconds_sum$",
                "^jvm_classes_currently_loaded$",
                "^jvm_memory_max_bytes$",
                "^jvm_memory_used_bytes$"

              ]
            },
            {
              "source_labels": ["job"],
              "label_matcher": "cwagent-ecs-file-sd-config",
              "dimensions": [["ClusterName","TaskDefinitionFamily","pool"]],
              "metric_selectors": [
                "^jvm_memory_pool_max_bytes$",
                "^jvm_memory_pool_used_bytes$",
                "^jvm_memory_pool_committed_bytes$",
              ]
            }
          ]
        }
      }
    },
    "force_flush_interval": 5
  }
}

测试应用

从Github repo下载相关文件,Docker file 如下, 其中9404 端口用于prometheus 指标暴露:

# 使用OpenJDK 17作为基础镜像
FROM openjdk:17-jre-slim

LABEL description="Simple Java Web Application with JMX Exporter for ECS"

# 创建应用目录
RUN mkdir -p /opt/app

# 设置工作目录
WORKDIR /opt/app

# 复制JMX Exporter jar文件
COPY jmx_prometheus_javaagent-0.20.0.jar /opt/app/

# 复制Web应用程序jar文件(使用80端口版本)
COPY simple-web-app.jar /opt/app/

# 复制JMX配置文件
COPY config.yaml /opt/app/

# 安装curl用于健康检查
RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean

# 创建非root用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
RUN chown -R appuser:appuser /opt/app
USER appuser

# 暴露端口
EXPOSE 80 9404

# 设置健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD curl -f http://localhost/health || exit 1

# 启动命令
CMD ["java", "-javaagent:jmx_prometheus_javaagent-0.20.0.jar=9404:config.yaml", "-jar", "simple-web-app.jar"]

        其中config.yaml当前是暴露所有的指标(pattern: “.*”),如果需要做指标rename和过滤,可以适当修改,jmx_prometheus_javaagent-0.20.0.jar 可以从prometheus 官网下载,不同版本可能指标名字会不一样:

# 登录ECR
aws ecr get-login-password --region ap-eastsouth-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-southeast-1.amazonaws.com
# 创建repo
aws ecr create-repository --repository-name my-application --region ap-southeast-1
# 构建镜像
docker build -t my-application:latest .
# 镜像打tag
docker tag my-application:latest 123456789012.dkr.ecr.ap-southeast-1.amazonaws.com/my-application:latest
# push 镜像
docker push 123456789012.dkr.ecr.ap-southeast-1.amazonaws.com/my-application:latest

创建Task definition 并运行Task,如下所示:

{
  "taskDefinitionArn": "arn:aws:ecs:ap-southeast-1:your-id:task-definition/simple-web-app-task:3",
  "containerDefinitions": [
    {
      "name": "jmxsample-container",
      "image": "your-id.dkr.ecr.ap-southeast-1.amazonaws.com/simple-web-app",
      "cpu": 0,
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        },
        {
          "containerPort": 9404,
          "hostPort": 9404,
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "environment": [],
      "mountPoints": [],
      "volumesFrom": [],
      "dockerLabels": {
        "Java_EMF_Metrics": "true"
      },
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/simple-web-app",
          "awslogs-region": "ap-southeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "systemControls": []
    }
  ],
  "family": "simple-web-app-task",
  "executionRoleArn": "arn:aws:iam::your-id:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "revision": 3,
  "volumes": [],
  "status": "ACTIVE",
  "requiresAttributes": [
    {
      "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
    },
    {
      "name": "ecs.capability.execution-role-awslogs"
    },
    {
      "name": "com.amazonaws.ecs.capability.ecr-auth"
    },
    {
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
    },
    {
      "name": "ecs.capability.execution-role-ecr-pull"
    },
    {
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
    },
    {
      "name": "ecs.capability.task-eni"
    }
  ],
  "placementConstraints": [],
  "compatibilities": [
    "EC2",
    "FARGATE"
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "256",
  "memory": "512",
  "registeredAt": "2025-07-15T12:38:39.844Z",
  "registeredBy": "arn:aws:iam::your-id:user/iamuser",
  "tags": []
}

Task安全组需要放开80 和 9404端口,运行Task如下所示:

等Task运行后,在控制台找到Task的私网IP:

测试指标是否能暴露,如下所示:

可以在控制台看到有新的ECS/ContainerInsights/Prometheus namespace:

点击进去不同的维度,可以看到指标已经收集上来:

写在最后

        随着Amazon Elastic Container Service (ECS)在云计算领域的不断进化,它为开发者和企业提供了强大而灵活的容器化管理解决方案。通过ECS用户可以轻松管理大规模的容器化应用,自动化处理应用的部署、扩展、负载均衡等操作,彻底解放了运维团队的双手。尤其是亚马逊云科技新推出的 Free Tier 2.0,为开发者和企业用户提供了一个极具吸引力的入门选项,让大家以更低的成本体验到 ECS 的强大功能。这一次的版本升级不仅带来了更简便的上手体验,也进一步优化了资源利用,帮助你在云端快速启动、开发和扩展应用,从 链接 可以看到新套餐的优势所在:

        对于新手开发者和初创团队,Amazon ECS 提供了一个非常友好的入门方案 —— 免费计划。这一计划允许你在安全的环境中试用 ECS,最多可享受 6个月 或 用完抵扣金 的免费试用期,期间无须支付费用,除非你主动切换到付费计划。这使得你可以在无风险的情况下,了解容器管理的强大功能,迅速上手并测试你的应用是否适合容器化,当你准备好进入正式使用阶段,ECS 的 付费计划 将为你提供更多的灵活性和扩展性。在付费模式下,你将能够访问 150+ 个亚马逊云科技服务,进一步提升你的应用性能和资源管理能力。系统会首先用你的抵扣金来抵消符合条件的费用,超出部分则按需计费。这意味着你能够根据实际需求支付费用,同时最大限度地利用亚马逊云科技提供的优惠,如下图所示:

        对于开发者和团队来说,Amazon ECS 提供了一个无风险、灵活的体验方式,特别是借助 Free Tier 2.0,你可以以零成本的方式尝试 亚马逊云科技的容器化服务。注册亚马逊云科技海外区账户后,新用户可以获得 $100 美元抵扣金,并通过完成一系列简单的任务(如启动 EC2 实例、配置 RDS、部署 Lambda 函数等)额外赚取 $20 每个任务,最多再拿 $100,总抵扣金可以高达 $200 美元。这些任务不仅能帮助你熟悉 ECS 的基本功能,还能让你零成本体验完整的云计算和容器化流程。

        无论你是刚开始尝试 ECS 的初学者,还是准备将应用扩展到生产环境的开发者,Amazon ECS 都能提供合适的工具和计划让你轻松应对。通过Free Tier 2.0可以在几乎零成本的情况下,全面体验ECS的容器服务,并在需要时顺利过渡到更高级的付费服务,满足不同规模应用的需求。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐