快速上手 Amazon ECS:提升开发效率和可扩展性
在云计算和容器化技术的浪潮中,越来越多的企业选择将他们的应用托管在云端。而在这一切背后Amazon Elastic Container Service (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的容器服务,并在需要时顺利过渡到更高级的付费服务,满足不同规模应用的需求。
更多推荐


所有评论(0)