标签: amazon-ecs

如何使用 Amazon EC2 Container Service 扩展一个容器

我是使用 Amazon ECS 的新手,我想知道如何设置服务以便轻松扩展/缩减一个容器。

这是我的项目架构:

  • 网站:网站的容器,仅提供 html 页面和 javascript/css/images。听80。
  • api:在 NodeJS 中开发的 API 容器,提供 json 服务。在 443 上收听。
  • rabbitmq:带有rabbitmq的容器。api 容器链接到它。
  • worker:等待来自rabbitmq的订单(它也链接到它)并处理它们,然后将答案发送回rabbitmq的容器。

目前,我只为我的所有容器创建了一个任务定义,而在我的集群中,我只有一项服务。我在 API 上也有一个负载平衡器(所以我可以通过 DNS 名称从网站访问它)。

它工作正常,但我希望能够启动更多的工作人员,而不启动其他一切,而且我现在似乎无法做到这一点(如果我错了,请纠正我)。所以我有几个问题:

  • 我需要创建单独的任务定义吗?
  • 我需要创建单独的服务吗?
  • 如果我为每个容器创建一个任务定义(因此前面website后面apibrokerrabbitmqworkerworker),我是否仍然能够将容器链接在一起,即使它们不在同一个任务定义中?

这是我当前的任务定义:

{
  "taskDefinitionArn": "arn:aws:ecs:ap-southeast-2:347930943102:task-definition/Flipendo:4",
  "revision": 4,
  "containerDefinitions": [
    {
      "volumesFrom": [],
      "portMappings": [],
      "command": [],
      "environment": [
      ],
      "essential": true,
      "entryPoint": [],
      "links": [
        "rabbitmq"
      ],
      "mountPoints": [],
      "memory": 2048,
      "name": "worker",
      "cpu": …
Run Code Online (Sandbox Code Playgroud)

amazon-ec2 amazon-web-services docker amazon-ecs

5
推荐指数
1
解决办法
1006
查看次数

宽限期?- AWS EC2 容器服务和弹性负载均衡器

当弹性负载均衡器 (ELB) 与自动扩展组相关联时,可以指定一个宽限期,在此宽限期内,即使新 EC2 实例被 ELB 标记为不正常,也不会终止。是否可以指定一个类似的宽限期,在此期间新的 ECS 任务不会被其关联的 ECS 服务杀死并重新启动,即使正在运行任务的 ECS 实例已被 ELB 标记为不健康?

更新:

在我们当前的用例中,作为 ECS 任务运行的 docker 容器包含一个 JBoss 实例,该实例在启动时加载许多缓存。加载这些缓存可能需要几分钟时间。但是,ECS 服务会在容器启动后立即向 ELB 注册容器实例。这意味着可以在新容器准备好接受之前将流量路由到新容器。我们可以增加 ELB 上的健康检查间隔和“健康/不健康阈值”,以防止 ELB 将流量路由到实例和 ECS 服务重新启动容器,直到缓存加载完毕。然而,增加健康检查间隔和阈值是不可取的,因为如果在加载缓存后实例被标记为不健康,

因此,是否可以应用一个宽限期,在此期间ELB不会将流量路由到新容器并且ECS服务不会重新启动容器(即使它未通过健康检查)?或者失败了,是否有关于我们用例的解决方案的任何建议?

amazon-web-services amazon-elb amazon-ecs

5
推荐指数
1
解决办法
1608
查看次数

ECS 停止的任务不释放端口

我有一个带有 ELB 的 ECS 集群。昨晚我看到一个任务卡在重启循环中。从服务事件日志中,它说:

“服务 xxxxx 无法放置任务,因为没有容器实例满足其所有要求。最匹配的容器实例 xxxxxxxxxxxxxx 已经在使用您的任务所需的端口。”

但是,我已经检查过所有此类任务都已停止,并且当时不应使用该端口。更新服务无助于创建新的任务定义,然后更新有帮助。终止实例并允许 ELB 重新启动它会有所帮助。

知道为什么该服务无法保护任务的端口吗?

在此处输入图片说明

amazon-web-services amazon-ecs amazon-alb

5
推荐指数
1
解决办法
520
查看次数

Amazon 提供的 ECS CloudFormation 模板中的自动扩展运行状况检查失败。

我正在尝试使用此处提供的 CloudFormation ECS 服务模板 AWS作为指南来建立一个新的 ECS 集群。我的 ECS 实例在 AutoScaling 组内启动,但未通过运行状况检查并始终终止。

输出并没有真正告诉我什么检查失败或原因。

我使用的 CloudFormation 代码几乎是 AWS 文档中提供的股票代码。我添加了一个具有更广泛权限的安全组(以便我可以在迭代时通过 SSH 进入)并将 AMI 更新到 us-east-1 中 ECS 优化的 Amazon Linux 的最新版本。

当前模板:

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description": "Deploys PoC ECS infrastructure.",  

  "Parameters" : {
    "KeyName": {
      "Description": "Name of an existing EC2 KeyPair to enable SSH access to the Elastic Beanstalk and Bastion hosts",
      "Type": "String",
      "MinLength": "1",
      "MaxLength": "255",
      "AllowedPattern": "[\\x20-\\x7E]*",
      "ConstraintDescription": "can contain only ASCII characters.",
      "Default": "smx-test-key"
    }, …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-cloudformation amazon-ecs

5
推荐指数
1
解决办法
4033
查看次数

如何在 ECS 任务中将 Amazon EFS 挂载为数据卷?

启动配置上的用户数据:

#!/bin/bash
echo ECS_CLUSTER=prodcluster >> /etc/ecs/ecs.config

sudo yum install -y nfs-utils 
sudo mkdir /home/ec2-user/web_file_uploads 
sudo chmod 777 /home/ec2-user/web_file_uploads 

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-abcdef.efs.ap-southeast-2.amazonaws.com:/ /home/ec2-user/web_file_uploads 
Run Code Online (Sandbox Code Playgroud)

任务定义:

{
  "networkMode": "bridge",
  "containerDefinitions": [
    {
      "portMappings": [
        ...
      ],
      "essential": true,
      "mountPoints": [
        {
          "containerPath": "/src/temp_uploads/",
          "sourceVolume": "web_file_uploads",
          "readOnly": null
        }
      ],
      "name": "webapp",
      "readonlyRootFilesystem": null,
      "image": "911911911.dkr.ecr.ap-southeast-2.amazonaws.com/webapp:release6",
      "memoryReservation": 150
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": "/home/ec2-user/web_file_uploads"
      },
      "name": "web_file_uploads"
    }
  ],
  "family": "webapp-task"
}
Run Code Online (Sandbox Code Playgroud)

注意:我已将所需的端口添加到安全组。src/temp_uploads 文件夹必须包含在使用此任务定义启动的所有其他容器实例中。

问题:如果我使用 …

amazon-web-services docker amazon-ecs amazon-efs

5
推荐指数
1
解决办法
4469
查看次数

AWS ECS:无法放置任务

我正在尝试设置具有自动缩放功能的 AWS 服务。我已经创建了一个带有应用程序负载均衡器的集群,并使用应该在端口 8080 上打开以供使用的 docker 镜像创建了一个任务。我根据该任务创建了一个服务,我已将最小和所需的实例数设置为 1,最大为 10,并创建了扩展和缩减规则。但是,没有创建新实例,我定期在事件列表中获得的所有内容是:

service microrecieverservice 无法放置任务,因为没有容器实例满足其所有要求。最接近的匹配容器实例 97d97ce9-967d-49ad-83ad-f4f904aae1f6 已经在使用您的任务所需的端口。有关更多信息,请参阅故障排除部分。

我在故障排除部分找不到任何相关内容。我已经能够手动向集群添加另一个实例,但给定的事件没有变化。我可以通过 ssh 进入这个实例,有两个 docker 镜像:一个是 amazon-ecs-agent:latest,另一个是我的任务定义。此时,我尝试向服务器发送 REST 请求以查看它是否会通过但连接被拒绝。大约在同一时间,docker 镜像重新启动。

容器没有运行任何其他会使用端口 8080 的东西,当我使用端口 8080 执行netstat -lntp该过程时,就是我的 docker 镜像。

amazon-web-services autoscaling amazon-ecs

5
推荐指数
1
解决办法
2553
查看次数

从 ECS 容器记录到两个不同的 CloudWatch 日志流的最佳方式?

我们在AWS的ECS平台上运行我们的服务,并将日志发送到AWS CloudWatch。

我们有两种类型的日志,任何容器都可以生成其中一种类型:

  1. 常见的应用程序日志(访问、错误等);这些必须易于开发人员和管理员查看
  2. 审计日志(人类可读的“谁在何时做了什么”日志);必须限制对这些内容的访问

审核日志是法规强制要求的,除了更严格的访问控制要求外,它们的保留时间比应用程序日志更长,因此将两者放在同一个日志流中并不是真正的选择。因此,我们使用两个日志流,其中一个位于具有严格访问策略的 CloudWatch 日志组中。

目前,我们正在将日志写入单独的磁盘文件,日志代理将日志条目从磁盘文件发送到 CloudWatch。然而,我们希望切换到“Doc​​ker 方式”的日志记录,即将所有日志写入 STDOUT 或 STDERR,并让日志驱动程序处理其余的事情。这听起来特别有吸引力,因为日志磁盘(几乎)是我们正在使用的唯一磁盘安装,摆脱它们确实非常好。(除了日志磁盘之外,我们的容器是严格只读的。)

问题是,我们无法找到一种明智的方法来保持日志流分离。显而易见的事情是以某种方式标记日志消息并稍后将它们分开,但仍然存在一个问题:

  • 明智的方法是让日志驱动程序根据消息标签将消息分离到不同的日志流。Docker 的 awslogs 日志驱动程序不支持此功能。
  • “强力”方法是写入单个 CloudWatch 日志流,并使用写入其他两个日志流的自写过滤器重新处理该流。由于 CloudWatch 计费基于 API 调用,这基本上会使成本翻倍,因此是不可能的。
  • 我们还可以设置一个日志主机,并使用另一个 docker 日志驱动程序(例如 syslog)将所有日志发送到那里。然后我们可以分割日志流,并将它们转发到 CloudWatch。这会给所有日志记录增加一个瓶颈和一个单点故障,所以听起来也不太好。

希望我们遗漏了一些明显的东西,在这种情况下,我们将非常感谢您的帮助。

如果没有,是否有任何解决方法(甚至是适当的解决方案)来让这种事情发挥作用?

amazon-web-services amazon-cloudwatch docker amazon-ecs

5
推荐指数
1
解决办法
3813
查看次数

Elastic Container Service (ECS) 或 Elastic Container Registry (ECR)、Elastic Beanstalk 和 Lambda 之间如何选择?

背景: 我使用过 EC2 和 RDS。最近,我收到一位客户的询问,他想使用 Amazon Web Services 开发移动和 Web 应用程序,并且需要关于他应该使用哪种服务的建议?

  • 弹性豆茎
  • 拉姆达
  • 弹性容器服务 (ECS) 或弹性容器注册表 (ECR)

此外,我已经通过 YouTube 和 Google 上的几个教程来了解这些服务,但我仍然无法弄清楚他应该使用哪种服务。

问题: 我对上述服务没有任何适当的知识和经验。因此,我希望得到与他们合作过的人的建议。

请说明使用特定服务的优缺点,以便我更容易提供建议。

amazon-web-services elastic-beanstalk amazon-ecs amazon-ecr amazon-lambda

5
推荐指数
1
解决办法
243
查看次数

当 ECS 服务无法持续成功启动任务时创建 CloudWatch 警报

如果我向我的 ECS 服务发布了一个存在错误的新 Docker 映像,则该服务将尝试启动新任务,但如果新任务无法启动,则将保留旧版本。

在这种情况下,它有时(并非总是)会向总线发出一个事件,例如:

服务 xxx 无法持续​​成功启动任务。有关详细信息,请参阅故障排除部分。

有时它只会发出大量事件,例如:

服务 xxx 注销了目标组 yyy 中的 1 个目标

我希望在这种情况下触发 CloudWatch 警报。我怎样才能做到这一点?

我看不到任何跟踪可用于触发此警报的相关事件的 CloudWatch 指标。https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cloudwatch-metrics.html

如果任务无法启动,那么我什至无法获得有关 LB 目标组的任何 UnHealthyHostCount 指标。

我想我必须创建一个 EventBridge 规则来监视上述指定的事件,但我看不到让该规则触发警报的明显方法。我设置了一条规则,将“警告”和“错误”事件转发到 SNS/电子邮件,但我并不总是收到这些事件。所以我经常遇到重启循环而没有警报触发。:-(

monitoring amazon-web-services amazon-cloudwatch amazon-ecs

5
推荐指数
1
解决办法
4007
查看次数

如何在AWS ECS服务之间发送HTTP请求

目前,我正在尝试弄清楚如何配置 ECS 服务之间的通信。我计划进行以下设置:

  1. 后端服务
  2. 前台服务
  3. 一个应用程序负载均衡器

我心中有以下选择:

  1. 为ALB配置2个目标组并根据路径转发请求。例如,alb.amazonaws.com/backend/将请求转发到backend-target-group将请求提供给后端 ECS 任务。
  2. 在每个 ECS 任务中运行一个脚本,该脚本将使用 AWS cli 和服务发现检索正在运行的任务的 IP 地址。不确定这是否有效,而且测试相对困难。

它们似乎都不是正确的做法。由于财务限制,我不想为每项服务使用单独的 ALB。我想到的是 ECS 服务的某种内部 DNS 名称。我已经检查了以下链接,但不知道如何将其应用到我的案例中。

相关问题: AWS ECS 容器通信

因此,理想情况下我想要实现的是:为后端服务提供内部 DNS 名称,并将请求从前端服务发送到后端。

amazon-web-services amazon-ecs aws-fargate

5
推荐指数
1
解决办法
6493
查看次数