gpt4 book ai didi

amazon-web-services - 如何为在 EC2 模式下运行在 AWS ECS 集群中的容器分配公共(public) IP

转载 作者:行者123 更新时间:2023-12-03 16:11:33 24 4
gpt4 key购买 nike

我正在尝试使用服务之间的服务发现来实现多服务 ECS 集群。我正在尝试按照教程 Creating an Amazon ECS Service That Uses Service Discovery Using the Amazon ECS CLI .但是,它不包括完整的工作示例
我所做的是定义两个服务,通过使用定义:

  • docker-compose.yml
  • ecs-params.yml

  • 我可以轻松启动 ECS 集群和这两个服务。一切看起来都不错。但是其中一项服务需要公共(public) IP 地址。所以在对应的 ecs-params.yml文件,我把 assign_public_ip: ENABLED .但是没有分配公共(public) IP 地址。在 ECS 控制台中,服务详细信息显示为 Auto-assign public IP DISABLED ,对于任务,它列出了一个私有(private) IP 地址,没有公共(public) IP 地址。
    不幸的是,根据 Task Networking with the awsvpc Network Mode 上的文档,这似乎是不可能的。 :

    The awsvpc network mode does not provide task ENIs with public IP addresses for tasks that use the EC2 launch type. To access the internet, tasks that use the EC2 launch type should be launched in a private subnet that is configured to use a NAT gateway. For more information, see NAT Gateways in the Amazon VPC User Guide. Inbound network access must be from within the VPC using the private IP address or routed through a load balancer from within the VPC. Tasks launched within public subnets do not have access to the internet.


    问题 : 如何解决 AWS ECS EC2 启动类型的限制?
    我不明白为什么 EC2 启动类型不支持公共(public) IP 地址?或者 - 我是否使用不同的网络模式,然后分配公共(public) IP 地址?为什么 AWS 文档对此没有更清楚?
    源代码
    使用以下命令创建集群:
    ecs-cli up --cluster-config ecs-service-discovery-stack --ecs-profile ecs-service-discovery-stack --keypair notes-app-key-pair --instance-type t2.micro --capability-iam --force --size 2
    正如上述教程所建议的,定义了两个服务。 backend (容器中的简单 Node.js 应用程序)和 frontend (配置为代理到后端的简单 NGINX 服务器)每个服务都在它们自己的目录中。在每个目录中是 docker-compose.ymlecs-params.yml文件。
    前端服务通过以下方式启动:
    ecs-cli compose --project-name frontend service up --private-dns-namespace tutorial --vpc ${VPC_ID}  --enable-service-discovery --container-port 80 --cluster ecs-service-discovery-stack --force-deployment
    docker-compose.yml是:
    version: '3'

    services:
    nginx:
    image: USER-ID.dkr.ecr.REGION.amazonaws.com/nginx-ecs-service-discovery
    container_name: nginx
    ports:
    - '80:80'
    logging:
    driver: awslogs
    options:
    awslogs-group: simple-stack-app
    awslogs-region: REGION
    awslogs-stream-prefix: nginx
    ecs-params.yml是:
    version: 1
    task_definition:
    task_execution_role: ecsTaskExecutionRole
    ecs_network_mode: awsvpc
    task_size:
    mem_limit: 0.5GB
    cpu_limit: 256
    run_params:
    network_configuration:
    awsvpc_configuration:
    subnets:
    - "subnet-00928d3fc1339b27b"
    - "subnet-0ad961884e5f93fb1"
    security_groups:
    - "sg-0c9c95c6f02597546"
    # assign_public_ip: ENABLED
    使用类似的命令和类似的 docker-compose.yml 启动后端服务。和 ecs-params.yml文件。

    最佳答案

    没错,当使用 EC2 启动类型时,无法将公共(public) IP 分配给 ECS 任务。
    关于network modes除了 awsvpc,它们也无济于事:

    • If the network mode is set to none, the task's containers do not have external connectivity and port mappings can't be specified in the container definition.
    • If the network mode is bridge, the task utilizes Docker's built-in virtual network which runs inside each container instance.
    • If the network mode is host, the task bypasses Docker's built-in virtual network and maps container ports directly to the Amazon EC2 instance's network interface. In this mode, you can't run multiple instantiations of the same task on a single container instance when port mappings are used.

    选项 A - 负载均衡器
    如果您希望从 Internet 访问您的任务,您可以考虑创建集成了负载均衡器的 ECS 服务,以便客户端能够将请求路由到您的任务。请注意,具有使用 awsvpc 网络模式的任务的服务仅支持 Application Load Balancer 和 Network Load Balancer。
    选项 B - Fargate 启动类型
    另一种选择是将 ECS 任务配置为使用 Fargate 启动类型接收公共(public) IP 地址:

    When you create ECS services/tasks using Fargate launch type, you can choose whether to associate a public IP to the ENI which ECS task using. You can refer to how to Configure a Network to know how to configure public IP with a Fargate Type service in ECS. Base on this configuration, once the task running, the ENI which the task use should have public IP, it would able to let you access the task over the internet directly.

    关于amazon-web-services - 如何为在 EC2 模式下运行在 AWS ECS 集群中的容器分配公共(public) IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60878958/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com