【问题标题】:Deploying multi-container docker application to AWS ECS Fargate using ECS-CLI使用 ECS-CLI 将多容器 docker 应用程序部署到 AWS ECS Fargate
【发布时间】:2021-01-24 13:38:08
【问题描述】:

我需要在 AWS ECS 上部署 this project(最好是 Fargate 或 EC2 最坏的情况)。 查看documentation,我尝试使用单个容器进行部署,它可以使用多个容器,但由于 ecs-cli 的限制,我无法直接从项目中使用 docker-compose.yml,因此我将 docker 图像上传到 ECR 并然后使用相应容器的摘要创建一个新的 docker-compose。

这里是原始docker-compose.yml 的链接。 这是我的 docker-compose 在将图像上传到 ECR 后现在的样子:

version: "3.0"
services:
    postgres:
        image: postgres:12  
        logging:
            driver: awslogs
            options: 
                awslogs-group: aws-ecs-docker-test
                awslogs-region: ap-south-1
                awslogs-stream-prefix: docker

    db:
        image: sha256:123123123123123213213213213
        logging:
            driver: awslogs
            options: 
                awslogs-group: aws-ecs-docker-test
                awslogs-region: ap-south-1
                awslogs-stream-prefix: docker   

    traefik:
        image: sha256:123123123123123213213213213
        logging:
            driver: awslogs
            options: 
                awslogs-group: aws-ecs-docker-test
                awslogs-region: ap-south-1
                awslogs-stream-prefix: docker

    queue:
        image: sha256:123123123123123213213213213
        logging:
            driver: awslogs
            options: 
                awslogs-group: aws-ecs-docker-test
                awslogs-region: ap-south-1
                awslogs-stream-prefix: docker
    
    flower:
        image: sha256:123123123123123213213213213
        env_file: 
            - .env
        logging:
            driver: awslogs
            options: 
                awslogs-group: aws-ecs-docker-test
                awslogs-region: ap-south-1
                awslogs-stream-prefix: docker

    backend:
        image: sha256:123123123123123213213213213
        env_file: 
            - .env
        environment:
            - SERVER_NAME=${DOMAIN?Variable not set}
            - SERVER_HOST=https://${DOMAIN?Variable not set}
            - SMTP_HOST=${SMTP_HOST}
        ports:
            - "80:80"
        logging:
            driver: awslogs
            options: 
                awslogs-group: aws-ecs-docker-test
                awslogs-region: ap-south-1
                awslogs-stream-prefix: docker

    celeryworker:
        image: sha256:123123123123123213213213213
        env_file:
            - .env
        environment:
            - SERVER_NAME=${DOMAIN?Variable not set}
            - SERVER_HOST=https://${DOMAIN?Variable not set}
            # Allow explicit env var override for tests
            - SMTP_HOST=${SMTP_HOST?Variable not set}
        logging:
            driver: awslogs
            options: 
                awslogs-group: aws-ecs-docker-test
                awslogs-region: ap-south-1
                awslogs-stream-prefix: docker
    

    frontend:
        image: sha256:123123123123123213213213213
        logging:
            driver: awslogs
            options: 
                awslogs-group: aws-ecs-docker-test
                awslogs-region: ap-south-1
                awslogs-stream-prefix: docker
    
volumes:
  app-db-data:

这里是 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-123123123
        - subnet-123123123
      security_groups:
        - sg-123123123
      assign_public_ip: ENABLED

ecsTaskExecutionRole 拥有对 ECS、ECR 和 Cloudwatch 日志的所有访问权限。但是,每当我部署时,ecs 都会创建一些任务定义,然后超时:

Deployment has not completed: Running count has not changed for 5.00 minutes

即使我将超时时间延长到 30 分钟,它也不会改变输出。日志什么也没输出,所以我对潜在的问题一无所知。 我是 Devops 和 Docker 的新手,所以我不确定我到底错过了什么。

【问题讨论】:

  • 任务无法启动的详细信息可能很难找到。检查这个问题的答案,看看它是否可以帮助您找到错误消息:stackoverflow.com/questions/56229059/…
  • 嗨@MarkB 我遇到了这个问题,但任务的详细信息部分没有指定容器停止的原因。它只显示以下内容: Privileged - false 只读根文件系统 - false。如果我在集群上执行“服务 ps”,则 9 个容器中有 3 个发布此“已停止原因:CannotPullContainerError:来自守护进程的错误响应:sha256 的拉取访问被拒绝,存储库不存在或可能需要“docker login”:拒绝:请求访问资源被拒绝”
  • 那些sha256 图片是什么?它们存在于 Dockerhub 中吗?
  • 这些图像在 AWS Elastic Container Registry 上。
  • 嘿伙计,您最终使用了 ECS 吗?我有一个非常相似的用例(Flask + Celery + Flower),但我似乎无法让容器相互交谈。并且找不到使 .env 文件也能正常工作的方法......你有什么要分享的吗?谢谢!

标签: amazon-web-services docker docker-compose amazon-ecs amazon-ecr


【解决方案1】:

我最终能够解决这个问题。问题在于 traefik 映像和 IAM 角色缺少 Cloudwatch 权限。

【讨论】:

    【解决方案2】:

    作为 ecs-cli 的替代方案,我建议您使用 ECS Compose-X,它可以让您即插即用您现有的网络 (VPC) 并处理所有其余部分(IAM、安全组等)。 此外,如果您想将您的服务链接到其他 AWS 资源,您可以使用它来发现这些资源(如果已经存在)或创建新资源,同样,关于 IAM 和安全性的一切都会为您处理好。

    如果您创建了 kinesis 流,您的容器也将通过 env var 自动获得流的 ARN 和名称,因此您无需命名资源,您将始终拥有指向它的指针。

    【讨论】:

      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 2022-10-28
      • 2017-09-30
      • 1970-01-01
      • 2020-12-30
      • 2016-11-06
      • 1970-01-01
      • 2020-11-22
      相关资源
      最近更新 更多