ECS多容器设置

ECS multi container setup

我需要以下场景的帮助。我有三个容器需要在 ECS 上 运行,前面是 alb。我有 nginx 前端、php、nginx 后端。两个 nginx 容器都依赖于 php 容器。我只想公开前端容器。如何在不在每个前面添加 alb 的情况下将它们绑在一起?

我使用 terraform 来配置所有部分,包括(ALB、ECR、ECS 等)我想知道如何连接容器而不让每个容器前面都有一个 alb。

本地我 运行 他们用 docker-compose.

这是一个有点宽泛的问题,但我会尽力给出一个可以指导您正确方向的答案。

您可以尝试使用基础架构即代码 (IaC) 来快速让某些东西工作并锻炼您需要的部分和不需要的部分。您可以查看部署的内容,了解功能性 ECS 基础设施是如何构建的,它通常会涉及 VPC、NAT、安全组、Internet 网关、ALB、ECR 等更多部分。查看所有这些部件的部署和连接可以进一步帮助您了解您的需求。

IaC 的一些示例 运行 ECS: https://www.pulumi.com/docs/guides/crosswalk/aws/ecs/ https://registry.terraform.io/modules/cn-terraform/ecs-fargate/aws/latest

要回答有关 ALB 的更具体问题,您只需将前端连接到具有目标的 ALB group.There 是连接容器的不同方式,服务发现是创建主机名的一种方式对于私有网络中的每个容器。然后你可以从你的前端调用你的后端,类似于你使用 docker-compose.

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html

如果您有一个 docker 组合文件,最简单的方法可能是在 docker 中创建一个 ECS 上下文并使用 docker compose up 部署您的组合文件。你可以阅读更多here

Nginx 和 PHP 可以 运行 并排。 ECS 中的任务定义可以包含这两个容器,nginx 容器公开端口 80,PHP 容器公开 9000(可能使用 PHP-FPM)。 Nginx 可用作路由请求到 PHP 进程的代理。

示例task definition(简化值以演示多容器设置):

{
  "containerDefinitions": [
    {
      "portMappings": [
        {
          "hostPort": 9000,
          "protocol": "tcp",
          "containerPort": 9000
        }
      ],
      "command": [
        "php-fpm"
      ],
      "image": "image-url-for-php:latest",
      "name": "php-fpm"
    },
    {
      "portMappings": [
        {
          "hostPort": 80,
          "protocol": "tcp",
          "containerPort": 80
        }
      ],
      "image": "image-url-for-nginx:latest",
      "dependsOn": [
        {
          "containerName": "php-fpm",
          "condition": "START"
        }
      ],
      "essential": true,
      "name": "nginx"
    }
  ]
}

nginx 配置如下所示:

server {
    listen 80;
    index index.php index.html;
    root /var/www/html/public; # change this to application files path
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass localhost:9000; # PHP container accessible via localhost:9000 if running side by side
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

然后可以使用此任务定义来创建服务,ELB 可以将其用作目标组(路由到 nginx 的端口 80)。从那里所有请求都将被代理到 PHP 容器。

就 nginx-backend 而言,可以使用相同的设置。但是,如果此服务不会暴露给 public 流量,您将需要使用内部 ELB 或 Service Discovery。但是,想法是 PHP 容器本身不需要专用的 ELB。