我已阅读ECS 监控文档,但未找到如何使用 CloudWatch Events 或 Metrics 帮助对达到ECS 任务内存限制发出警报。我遇到过这样的情况,当 ECS 容器突破默认任务硬限制 512 Mb 并重新启动时。CloudWatch Event触发ECS 任务状态更改,例如从 RUNNING 到 STOPPED,但在事件详细信息中,"stoppedReason"您可能只会发现“任务在...中失败的 ELB 运行状况检查”,尽管我明确知道实际原因是内存限制突破和容器谋杀码头工人方面。这是事件规则模式:
{
"source": [
"aws.ecs"
],
"detail-type": [
"ECS Task State Change"
],
"detail": {
"lastStatus": [
"STOPPED"
]
}
}
Run Code Online (Sandbox Code Playgroud)
CloudWatchMemoryUtilization维度指标也ServiceName没有多大帮助,因为触发警报的最短周期(范围)是 1 分钟,但容器终止-重新启动周期运行得更快。时间不够,无法抓住高峰。我想这与ClusterName维度(换句话说,对于整个集群)也是相关的。
我想知道如何获取有关任务(容器、容器实例)硬内存限制突破的通知?
我为我的任务设置了具有以下权限的 IAM 角色,但尝试访问存储桶时 却被拒绝。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket/Templates/*",
"arn:aws:s3:::bucket/*",
"arn:aws:s3:::anotherBucket/*"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
容器实例具有标准策略的角色 AmazonEC2ContainerServiceforEC2Role。
我似乎能够从存储桶/下读取和写入文件夹,如存储桶/00001,但我无法从存储桶/模板中读取。
我已经反复重新部署权限和任务(使用 terraform),但没有任何变化。我已向应用程序添加了日志记录,以确保它使用正确的存储桶和路径/密钥。
我很困惑。有人知道我在这里可能错过了什么吗?
谢谢
PS:我刚刚想到,我无法访问的存储桶中的文件我使用脚本复制到那里。这是使用任务正在使用的凭据以外的凭据来完成的。
aws s3 cp ..\Api\somefiles\000000000001\ s3://bucket/000000000001 --recursive --profile p
aws s3 cp ..\Api\somefiles\Templates\000000000001\ s3://bucket/Templates/000000000001 --recursive --profile p
我在 cp 命令上使用 -acl bucket-owner-full-control 但我删除了它以查看是否有帮助 - 它没有。也许我还需要别的东西?
我正在使用 socket.io 在 AWS Fargate 中运行套接字服务器容器
连接用户数在 800-1000 左右时一切正常,但是当客户端数量增加时,旧套接字连接会自动断开并出现错误transport error。
我的 AWS ECS 服务(Fargate 容器)在 AWS 应用程序负载均衡器后面运行。
需要应用任何特定配置来支持与我的容器的数千个并发连接吗?
连接到单个套接字服务器的并发用户数是否有限制?
AWS任务定义有4GB内存和2个CPU
套接字服务器代码:
io = module.exports = require('socket.io')(server, {
'pingInterval': 10000,
'pingTimeout': 7000,
'origins': (env.APPLY_ALLOW_ORIGIN_FILTER) ? env.SOCKET_WHITELIST_URL : '*:*',
transports: ['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling', 'polling']
})
Run Code Online (Sandbox Code Playgroud) 在推送我的容器的新图像后,我使用Terraform apply来更新任务定义.这似乎工作正常,但在ECS服务任务列表中,我可以看到任务处于非活动状态,我有一个事件:
service blahblah was unable to place a task because no container instance met all of its requirements. The closest matching container-instance [guid here] is already using a port required by your task.
问题是,该网站仍然活跃和工作.
Service CPU utilization =
(Total CPU units used by tasks in service) x 100
------------------------------------------------------
(Total CPU units specified in task definition) x (number of tasks in service)
Run Code Online (Sandbox Code Playgroud)
...因此,让服务以500%的服务CPU利用率运行会产生任何不利影响,而我的服务正在进行比配置更多的CPU密集型工作吗?
换句话说:我的整个集群运行在5%CPU,但我的服务是500%CPU Util - 这是否会以任何方式影响底层服务性能?
谢谢
我拥有对 ECR 注册表的相关访问权限,但是我无法通过运行 Docker 检查命令来获取图像元数据。我正在尝试与
docker inspect ecrregistryurl/dockerimage:imageversion
Run Code Online (Sandbox Code Playgroud) 我正在构建 Terraform 配置以将一些容器部署到 AWS ECS。显然,我必须将 Docker 镜像推送到 ECR。我在 ECR 中创建了一个存储库并推送了图像。
现在我正在自动化。如果我这样声明aws_ecr_repository:
data "aws_ecr_repository" "service" {
name = "myrepository"
}
Run Code Online (Sandbox Code Playgroud)
然后 Terraform 将管理它。我最终可以用类似的东西来引用它
image = "${aws_ecr_repository.myrepository.repository_url}"
Run Code Online (Sandbox Code Playgroud)
在构建 ECS 任务定义的过程中。
我的印象是,当我terraform destroy作为开发周期的一部分运行时,Terraform 会删除这个存储库——或者当它有图像时会失败。这会很糟糕,因为terraform destroy要么永远不会完成,要么我必须清除 ECR 存储库才能成功完成该命令。
如何最好地引用已经存在但我似乎不希望 Terraform 管理的 ECR 存储库,因为 Terraform 可能会破坏位于 Terraform 之外的数据,即发布 CI 作业上传的 Docker 图像?
这是 AWS 关于如何部署基于微服务的应用程序的介绍性指南ECS
显然(从文档中也可以看出),所谓的任务定义应该包含构成堆栈的所有容器。
即,如果您的相应docker-compose.yml文件由 5 个组成services(在 docker compose 上下文中),则这些文件都应以相同的ECS 任务定义 (?) 结束。
据我了解,这也有助于在容器之间自动发现服务(docker-compose和 和 中的默认行为一样docker swarm);
问题在于,ECS 的扩展可能性是(除了EC2实例)每个ECS服务。
这是否意味着您不能进行容器级扩展?
如果我想要一个服务规模,我是否必须在我所谓的堆栈中扩展我的所有容器?
aws-ecs ×8
amazon-ecs ×2
docker ×2
terraform ×2
amazon-s3 ×1
aws-ecr ×1
aws-fargate ×1
node.js ×1
socket.io ×1
websocket ×1