AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 843498
Accepted
uberrebu
uberrebu
Asked: 2017-04-09 23:06:21 +0800 CST2017-04-09 23:06:21 +0800 CST 2017-04-09 23:06:21 +0800 CST

TERRAFORM 我如何拥有 1 个具有 2 个或更多 ecs 服务/任务定义的 ecs 集群?

  • 772

使用 Terraform,我尽最大努力找出如何创建 1 个 ECS 集群并在其下运行多个服务。所以基本上我有 2 个不同的容器我想用这个 1 个 ECS 集群运行。

我该怎么做呢?我见过很多例子,但通常是 1 个服务和 1 个 ECS 集群

所以从这个链接我得到了一个模板https://www.terraform.io/docs/providers/aws/d/ecs_task_definition.html

# Simply specify the family to find the latest ACTIVE revision in that family.
data "aws_ecs_task_definition" "mongo" {
  task_definition = "${aws_ecs_task_definition.mongo.family}"
}

resource "aws_ecs_cluster" "foo" {
  name = "foo"
}

resource "aws_ecs_task_definition" "mongo" {
  family = "mongodb"

  container_definitions = <<DEFINITION
[
  {
    "cpu": 128,
    "environment": [{
      "name": "SECRET",
      "value": "KEY"
    }],
    "essential": true,
    "image": "mongo:latest",
    "memory": 128,
    "memoryReservation": 64,
    "name": "mongodb"
  }
]
DEFINITION
}

resource "aws_ecs_service" "mongo" {
  name          = "mongo"
  cluster       = "${aws_ecs_cluster.foo.id}"
  desired_count = 2

  # Track the latest ACTIVE revision
  task_definition = "${aws_ecs_task_definition.mongo.family}:${max("${aws_ecs_task_definition.mongo.revision}", "${data.aws_ecs_task_definition.mongo.revision}")}"
}

所以可以说我想添加一个节点应用程序服务,它看起来如何?并让它们都在同一个集群上运行

谢谢!

docker
  • 3 3 个回答
  • 5023 Views

3 个回答

  • Voted
  1. Best Answer
    Andrey
    2017-04-11T02:09:59+08:002017-04-11T02:09:59+08:00

    您只需创建另一个aws_ecs_service和aws_ecs_task_definition资源。

    如果您希望它在同一个集群上运行,只需在集群参数中指定相同的集群 ID 。

    所以它看起来像这样

    # Simply specify the family to find the latest ACTIVE revision in that family.
    data "aws_ecs_task_definition" "mongo" {
      task_definition = "${aws_ecs_task_definition.mongo.family}"
    }
    
    data "aws_ecs_task_definition" "nginx" {
      task_definition = "${aws_ecs_task_definition.nginx.family}"
    }
    
    resource "aws_ecs_cluster" "foo" {
      name = "foo"
    }
    
    
    # ======================  TASKS ===================
    resource "aws_ecs_task_definition" "mongo" {
      family = "mongodb"
    
      container_definitions = <<DEFINITION
    [
      {
        "cpu": 128,
        "environment": [{
          "name": "SECRET",
          "value": "KEY"
        }],
        "essential": true,
        "image": "mongo:latest",
        "memory": 128,
        "memoryReservation": 64,
        "name": "mongodb"
      }
    ]
    DEFINITION
    }
    
    resource "aws_ecs_task_definition" "nginx" {
      family = "nginx"
    
      container_definitions = <<DEFINITION
    [
      {
        "cpu": 128,
        "environment": [{
          "name": "SECRET",
          "value": "KEY"
        }],
        "essential": true,
        "image": "nginx:latest",
        "memory": 128,
        "memoryReservation": 64,
        "name": "nginx"
      }
    ]
    DEFINITION
    }
    
    # ======================  SERVICES ===================
    
    resource "aws_ecs_service" "mongo" {
      name          = "mongo"
      cluster       = "${aws_ecs_cluster.foo.id}"
      desired_count = 2
    
      # Track the latest ACTIVE revision
      task_definition = "${aws_ecs_task_definition.mongo.family}:${max("${aws_ecs_task_definition.mongo.revision}", "${data.aws_ecs_task_definition.mongo.revision}")}"
    }
    
    resource "aws_ecs_service" "nginx" {
      name          = "nginx"
      cluster       = "${aws_ecs_cluster.foo.id}"
      desired_count = 2
    
      # Track the latest ACTIVE revision
      task_definition = "${aws_ecs_task_definition.nginx.family}:${max("${aws_ecs_task_definition.nginx.revision}", "${data.aws_ecs_task_definition.nginx.revision}")}"
    }
    

    还有另一种在 ECS 上运行多个容器的方法。

    您可以将 Nginx 和 MongoDB 放在同一个实例和同一个任务/服务下。

    它看起来像这样

    # Simply specify the family to find the latest ACTIVE revision in that family.
    data "aws_ecs_task_definition" "webapp" {
      task_definition = "${aws_ecs_task_definition.webapp.family}"
    }
    
    resource "aws_ecs_cluster" "foo" {
      name = "foo"
    }
    
    
    # ======================  TASKS ===================
    
    resource "aws_ecs_task_definition" "webapp" {
      family = "webapp"
    
      container_definitions = <<DEFINITION
    [
      {
        "cpu": 128,
        "environment": [{
          "name": "SECRET",
          "value": "KEY"
        }],
        "essential": true,
        "image": "nginx:latest",
        "memory": 128,
        "memoryReservation": 64,
        "name": "nginx"
      },
      {
        "cpu": 128,
        "environment": [{
          "name": "SECRET",
          "value": "KEY"
        }],
        "essential": true,
        "image": "mongo:latest",
        "memory": 128,
        "memoryReservation": 64,
        "name": "mongodb"
      }
    ]
    DEFINITION
    }
    
    # ======================  SERVICES ===================
    
    resource "aws_ecs_service" "webapp" {
      name          = "webapp"
      cluster       = "${aws_ecs_cluster.foo.id}"
      desired_count = 1
    
      # Track the latest ACTIVE revision
      task_definition = "${aws_ecs_task_definition.webapp.family}:${max("${aws_ecs_task_definition.webapp.revision}", "${data.aws_ecs_task_definition.webapp.revision}")}"
    }
    

    第一种方法的优点是您可以独立扩展和管理每个容器。

    第二种方法的优点是容器将放置在同一个 EC2 实例上,可以链接但不能独立扩展。当您将所需的计数设置为 N 时,您将获得 N 个“webapp”(因此 Nginx 和 MongoDB 实例)。使用第一种方法,您可以拥有 N 个 Nginx 和 X 个 MongoDB。

    希望这可以帮助。

    注意: Terraform 代码尚未经过测试。

    • 2
  2. Matt Calhoun
    2017-04-20T06:40:05+08:002017-04-20T06:40:05+08:00

    @babababa 为了确保容器实例(实际的 AWS 主机)加入正确的集群,最佳实践是使用用户数据脚本让它们在创建实例时加入集群。这将避免您必须手动编辑 ECS 代理配置。

    user data因此,无论您正在创建构成 ECS 集群的实际 EC2 实例(手动、自动扩展组或通过 Terraform),您都应该为这些实例添加类似于以下内容的内容:

    #!/bin/bash
    echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
    
    • 1
  3. uberrebu
    2017-04-11T11:49:28+08:002017-04-11T11:49:28+08:00

    是的,我想我后来发现了问题所在。我必须编辑/etc/ecs/ecs.config文件并设置集群名称,以便实例注册到集群,然后使用不同的任务定义在实例上运行服务。

    我之前面临的问题是实例最终在一个default集群中并且无法让我的服务在它们上运行,因为任务定义是由我想要的集群而不是default集群设置的

    所以解决我的问题的问题是/etc/ecs/ecs.config适当地编辑

    • 0

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve