2

我需要在 AWS ECS 上部署这个项目(最好是 Fargate 或 EC2 最坏的情况)。查看我尝试使用单个容器部署的文档,但它可以使用多个容器,由于 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 的新手,所以我不确定我到底错过了什么。

4

2 回答 2

0

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

于 2020-10-15T10:01:51.157 回答
0

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

例如,如果您创建了一个 kinesis 流,您的容器也将通过 env var 自动获得流的 ARN 和名称,因此您永远不需要命名您的资源,您总是有一个指向它的指针。

于 2021-03-10T06:56:26.987 回答