Как устранить неполадки при ведении журнала в CloudWatch из докера в контейнере ECS?

Я рву из-за этого волосы. Вот моя установка:

  • Контейнер ECS на инстансе EC2, который содержит
  • Определение задачи ECS, которое запускает
  • Экземпляр Docker со скриптом python, который регистрируется в stderr

Я вижу группу журналов Cloudwatch для создания задачи ECS, но ничего, что я печатаю в stderr, не появляется. Группа журналов Cloudwatch

В моем контейнере ECS по умолчанию используется роль ecsInstanceRole. EcsInstanceRole имеет следующую политику AmazonEC2ContainerServiceforEC2Role:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:CreateCluster",
                "ecs:DeregisterContainerInstance",
                "ecs:DiscoverPollEndpoint",
                "ecs:Poll",
                "ecs:RegisterContainerInstance",
                "ecs:StartTelemetrySession",
                "ecs:UpdateContainerInstancesState",
                "ecs:Submit*",
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
                ],
                "Resource": "*"
            }
        ]
    }

Определение задачи

{
    "containerDefinitions": [
        {
            "dnsSearchDomains": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "torres",
                    "awslogs-region": "us-west-2",
                    "awslogs-stream-prefix": "torres"
                }
            },
            "command": [
                "sleep",
                "infinity"
            ],
            "cpu": 100,
            "mountPoints": [
                {
                    "readOnly": null,
                    "containerPath": "/mnt/efs",
                    "sourceVolume": "efs"
                }
            ],
            "memoryReservation": 512,
            "image": "X.dkr.ecr.us-west-2.amazonaws.com/torres-docker:latest",
            "interactive": true,
            "essential": true,
            "pseudoTerminal": true,
            "readonlyRootFilesystem": false,
            "privileged": false,
            "name": "torres"
        }
    ],
    "family": "torres",
    "volumes": [
        {
            "name": "efs",
            "host": {
                "sourcePath": "/mnt/efs"
            }
        }
    ]
}

person sshevlyagin    schedule 02.12.2018    source источник
comment
Можете ли вы также поделиться деталями определения задачи? Вы убедились, что у агента ECS включен драйвер awslogs. ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"]. Кроме того, убедитесь, что ваше приложение (python) выполняет вход в консоль.   -  person Imran    schedule 03.12.2018
comment
Спасибо, что ответил, Имран. Я добавил определение задачи. Приложение выполняло вход в консоль, агент ECS версии 1.22, поэтому ему не нужна эта конфигурация, как указано здесь docs.aws.amazon.com/AmazonECS/latest/developerguide/   -  person sshevlyagin    schedule 03.12.2018


Ответы (1)


Я понял проблему, но не знаю, почему она ее решает. Когда я изменил свою команду с sleep infinity на простой запуск фрагмента кода, который регистрирует python script.py, запись в CloudWatch начала работать.

Раньше я запускал контейнер с sleep infinity ssh-ing в контейнер и запускал script.py из оболочки, а это НЕ регистрировалось.

person sshevlyagin    schedule 03.12.2018
comment
Я предполагаю, что результат, который ваша программа написала до sleep infinity, просто находится в буфере и никогда не записывается. Вы можете попробовать PYTHONUNBUFFERED=1 в разделе вашей среды определения задачи. - person timbaileyjones; 08.12.2020