标签: amazon-ecs

更改 Amazon ECS 服务的任务放置策略

我在具有 5 个 EC2 实例的单个 ECS 集群中运行了大约 15 个微服务。在设置服务时,我并没有太注意任务放置策略,现在我想改变它,但到目前为止我还没有找到这样做的方法。似乎您只能在创建服务时定义策略,而不能在更新它时定义策略(亚马逊文档没有提到更新,但也没有说这是不可能的)。

有没有办法更改任务放置或我必须重新创建每个服务?

amazon-web-services amazon-ecs

9
推荐指数
1
解决办法
1874
查看次数

如何获取特定 AWS ECS 任务的 IP 地址?

我正在尝试在 ECS 中构建我自己的服务发现版本,因为我希望向上和向下扩展的服务不是 HTTP 服务器,因此无法由 ELB 管理。此外,ECS 尚不支持 docker 的用户定义网络功能,这将是进行服务发现的另一种方式。正如该问题讨论中提到的:

目前服务发现是一个巨大的痛苦,需要另一个服务(它本身通常是基于集群的,自我发现然后侦听其他服务)。这是一个凌乱的解决方案,更不用说实施和维护更令人讨厌的 Lambda“解决方案”了。

因此,我将采用令人讨厌的 Lambda“解决方案”路线来代替其他选择。我需要构建这个 hack 服务发现的主要内容是在我的 EC2 主机上运行的每个 docker 容器的 IP 地址。

通过 SSH 连接到充当我的 ECS 容器实例之一的 EC2 服务器,我可以运行docker ps以获取每个正在运行的 docker 容器的容器 ID。对于任何给定的 containerId,我可以运行docker inspect ${containerId}它返回 JSON,包括有关该容器的许多详细信息,特别是NetworkSettings.IPAddress与该容器的绑定(我的发现实现所需的主要内容)。

我正在尝试使用 Lambda 中的 AWS 开发工具包来获取此值。到目前为止,这是我的 Lambda 函数(您也应该能够运行它——这里没有特定于我的设置):

exports.handler = (event, context, callback) => {
    var AWS = require('aws-sdk'),
        ecs = new AWS.ECS({"apiVersion": '2014-11-13'});

    ecs.listClusters({}, (err, data) => {
        data.clusterArns.map((clusterArn) => {
            ecs.listTasks({
                cluster: clusterArn
            }, …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services docker amazon-ecs amazon-lambda

8
推荐指数
2
解决办法
9876
查看次数

如何在此 nginx 配置中仅关闭某个 url 的访问日志?

这是nginx配置

server {
    listen $PORT;

    location ~ ^/documents/(.*)$ {
        proxy_pass http://127.0.0.1:5000/$1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location = /favicon.ico {
        return 204;
        access_log    off;
        log_not_found off;
    }
}
Run Code Online (Sandbox Code Playgroud)

url 有两种用例/documents/

POST 到/documents/进行一些处理或

GET/documents/ping被 AWS ELB 用作健康检查

在 cloudwatch 日志中,我得到了一堆 ping 条目

在此输入图像描述

要求 nginx 不记录 ping 的最简单方法是什么?

nginx amazon-ecs

8
推荐指数
1
解决办法
1万
查看次数

AWS Fargate + 应用程序负载均衡器 SSL 终止

我正在尝试在 Application Loader Balancer (ELBv2) 后面配置 ECS Fargate,我想终止 ALB 上的 TLS/SSL 连接,并将 HTTP 流量(端口 80)发送到在端口 80 上侦听的 Fargate 图像.

这是我正在尝试做的图表:

elb 到 fargate

  • 我目前能够将HTTP流量从 Internet发送到 Fargate,但我还没有找到终止 Application Loader Balancer 处的 TLS 连接并将 HTTP 流量转发到 ECS 的方法。这可能吗?
  • 我托管了一个相当静态的应用程序,没有敏感的用户数据,因此我并不特别担心 ALB 和 ECS 之间传输的数据。

任何帮助表示赞赏!

load-balancing amazon-web-services amazon-elb amazon-ecs

8
推荐指数
1
解决办法
6546
查看次数

Fargate 是否适合资源利用率较低的独立容器?

我是 docker 和 ECS 的新手,所以我可能不会使用正确的术语。如果我需要澄清,请告诉我。

我的场景:我有许多独立的容器。每个容器代表一个网站。每个容器都应该一直运行,但可能会出现长时间不活动的情况(例如,CPU 使用率为零)。为了便于说明,我们假设我有 10 个容器,每个容器需要最多 200MB RAM 和最多 1vCPU。我们进一步假设我总共只需要 2vCPU 来处理所有 10 个容器的组合负载(因为它们不会同时看到高负载)。

Fargate 选项 1:我为每个容器创建一个不同的任务:(2GB,1vCPU)x 10(2GB 是 1vCPU 的最小 RAM)。

Fargate 选项 2:我使用所有容器创建一个任务:(2GB,2vCPU)。

EC2 选项:我为每个容器创建一个任务,所有任务都映射到单个 EC2 实例。

如果我理解正确的话,Fargate 选项 2 比 Fargate 选项 1 便宜得多,因为我知道我最多只需要 2vCPU。但选项 2 的灵活性要差得多,因为它是停止/启动/缩放的任务,并且我希望将我的容器视为彼此独立(例如独立地停止/启动/缩放)。

此外,如果我理解正确的话,EC2 选项是我既可以获得每个容器一个任务的灵活性,又可以为我实际需要的资源付费的唯一方法

所以:看来对于资源利用率较低的独立容器来说,Fargate此时不太适合。

我的理解正确吗?

amazon-web-services amazon-ecs aws-fargate

7
推荐指数
1
解决办法
2193
查看次数

AWS ECS 服务未启动任何任务

我已经在 ECS 上设置了集群、容器、任务和服务。

在我创建该服务后,它似乎正在运行“3 个所需的任务”,但是没有任何任务被创建为挂起或正在运行。实际上,它似乎什么也没做。

我的任务定义(不包括空值和空数组)是

{
  "containerDefinitions": [
    {
      "portMappings": [
        {
          "hostPort": 5000,
          "protocol": "tcp",
          "containerPort": 25565
        },
        {
          "hostPort": 5000,
          "protocol": "udp",
          "containerPort": 25565
        }
      ],
      "cpu": 0,
      "memoryReservation": 1024,
      "image": "itzg/bungeecord",
      "essential": true,
      "name": "BungeeCord"
    }
  ],
  "compatibilities": [
    "EC2"
  ],
  "taskDefinitionArn": "arn:aws:ecs:us-west-1:949960343466:task-definition/BungeeCordTask:3",
  "family": "BungeeCordTask",
  "requiresAttributes": [
    {
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.21"
    }
  ],
  "requiresCompatibilities": [
    "EC2"
  ],
  "revision": 3,
  "status": "ACTIVE",
}
Run Code Online (Sandbox Code Playgroud)

我的集群有 3 个 ECS 实例,它们都在运行并且上面没有任何东西: 我的集群

我的服务在这里: 我的服务

我没有任何自动缩放、负载平衡或任何设置。但我确实有一些真正的默认服务发现。

任何人都知道为什么没有任务开始?

编辑:

  • 我看过“停止的任务”,它实际上是空的。
  • 我还通过 SSH 连接到我的每个 …

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

6
推荐指数
1
解决办法
5214
查看次数

ECS 中的 Docker 卷权限

我正在将现有应用程序从在裸 EC2 实例上运行迁移到使用 ECS 的容器化设置。我有两种情况需要在容器之间共享数据。一个是存储一些静态和媒体文件的 EFS 共享,另一个是日志目录,以便我可以使用 sidecar 容器中的 Cloudwatch Logs 代理将日志推送到 Cloudwatch。

网络服务器需要能够将数据写入这两个位置,但到目前为止我还无法实现。日志目录是本地卷,归root:root. 我按照这些说明设置的 EFS 共享归1000:xfs(无用户名)所有。在这两种情况下,我的网络用户 ( www-data) 都不能写入这些位置。

如何告诉 ECS 在具有给定所有者和/或组的容器内安装卷?

amazon-web-services docker amazon-ecs

6
推荐指数
1
解决办法
2860
查看次数

AWS ECS Container Insights 中存储读/写图表的单位是否不正确?

在 AWS 控制台 > CloudWatch > Container Insights > 性能监控 > ECS 任务中,Storage Read和的图表单位如下Storage Write所示:Bytes/Second

存储读取

字节/秒

然而,在这两种情况下,除了容器重新启动时的垂直下降之外,图表似乎总是单调增加,并且当我不希望看到持续恒定的 IO 时,它们具有很长的水平部分。

这些图表实际上显示的是累积值Bytes而不是所述值吗Bytes/Second

在 AWS 文档的表格中查找ECS Container Insights 指标,我看到StorageReadBytes两者都这么StorageWriteBytesUnit: Bytes,假设这指的是控制台 UI 图表中显示的相同指标,也许这证实了我的怀疑,即这是 AWS 控制台 UI 中的错误?

我尝试使用 AWS 中的“反馈”按钮来报告此问题,但在此发布,以防任何人都可以确认,或者它是否可以帮助其他可能因看似高的持续 I/O 率而担心的人。

amazon-web-services amazon-cloudwatch amazon-ecs

6
推荐指数
1
解决办法
1080
查看次数

ALB 连接耗尽始终达到“取消注册延迟”

我使用ECSALB将我的容器公开到互联网。当我更新容器映像时(我使用CloudFormation更新任务和服务),目标组将与旧容器的连接设置为Draining. 问题是这一步总是需要整整 5 分钟,这与我的属性相同Deregistration Delay

根据文档,这不应该发生:

取消注册延迟 Elastic Load Balancing 停止向正在取消注册的目标发送请求。默认情况下,Elastic Load Balancing 在完成取消注册过程之前等待 300 秒 [...]。

如果取消注册目标没有正在进行的请求且没有活动连接,Elastic Load Balancing 会立即完成取消注册过程,而无需等待取消注册延迟过去。

明显的解释是我与容器有持久连接。但是,我在测试服务上遇到了这个问题,只有我自己知道。

amazon-elb amazon-ecs amazon-alb

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

在 AWS ECS 中运行 cronjob 的最佳方式是什么?

我有一个由 Laravel 提供支持的 Web 应用程序,该应用程序设置在 AWS ECS 上。我需要将 artisan 命令作为 cronjob 运行。

我正在查看 ECS 集群配置中的“计划任务”。我可以按照 AWS 上的“计划任务 (Cron) ”文档启动新任务。我在目标中使用 Laravel 的任务定义,我将其用于 Web 服务,它有两个任务。

  1. 不知道如何调用 artisan 命令
  2. 计划任务似乎永远运行

任何帮助将不胜感激。谢谢。

php scheduled-task cron amazon-web-services amazon-ecs

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