Живой вход ECS в Cloudwatch

Я использую задачу ECS, которая запускает контейнер Docker для выполнения некоторых команд терраформирования.

Я хотел бы записывать результаты команд терраформирования в Cloudwatch, если возможно, вживую. Я использую пакет Python 3. logging

Функция, которую я использую для вывода результата команды, следующая:

def execute_command(command):
    """
    This method is used to execute the several commands
    :param command: The command to be executed
    :return decoded: The result of the command execution
    """

    logging.info('Executing: {}'.format(command))
    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

    communicate = process.communicate()
    decoded = (communicate[0].decode('utf-8'), communicate[1].decode('utf-8'))

    for stdout in decoded[0].split('\n'):
        if stdout != '':
            logging.info(stdout)

    for stderr in decoded[1].split('\n'):
        if stderr != '':
            logging.warning(stderr)

    return decoded

Что называется так:

apply_command = 'terraform apply -input=false -auto-approve -no-color {}'.format(plan_path)
terraform_apply_output = utils.execute_command(apply_command)

if terraform_apply_output[1] is not '':
   logging.info('Apply has failed. See above logs')
   aws_utils.remove_message_from_queue(metadata['receipt_handle'])
   utils.exit_pipeline(1)

Когда команда terraform выполнена успешно, я могу увидеть ее результат после выполнения команды (то есть: увидеть результат команды apply после того, как ресурсы были применены), чего ожидает код.

Когда команда terraform завершилась неудачно (скажем, потому что некоторые ресурсы уже были развернуты и не сохранены в .tfstate), я не вижу входа в систему, и задача ECS завершается без сообщения об ошибке.

Я вижу для этого 2 причины:

  1. Результат неудачной команды terraform возвращает ненулевой код, что означает, что задача ECS завершается до вывода журналов в стандартный вывод (и, следовательно, в Cloudwatch).
  2. Результат неудачной команды terraform отправляется на stderr, который неправильно регистрируется.

В чем моя ошибка и как ее исправить? Любая помощь очень ценится :)


person Mornor    schedule 30.01.2019    source источник


Ответы (1)


Этот вопрос кажется мне подозрительно знакомым. Так или иначе. Добавление режима сна (10) непосредственно перед выходом из задачи решит проблему. Из службы поддержки AWS:

Я продолжил изучение проблемы и заметил внутренний тикет, касающийся журналов CloudWatch, которые иногда усекаются для задач Fargate. Об этой проблеме сообщалось как об известной проблеме в последней версии платформы Fargate (1.3.0). [1] Глядя на наши внутренние заявки на то же самое, как вы упомянули в описании случая, текущий обходной путь, чтобы избежать этой ситуации, продлевает время жизни существующего контейнера, добавляя задержку (~> 10 секунд) между выходными данными журнала приложение и выход из процесса (выход из контейнера). Я могу подтвердить, что наша сервисная группа все еще работает над окончательным решением этой проблемы, о которой я сообщил. К сожалению, пока неизвестно, когда будет установлено исправление. Однако я воспользовался этой возможностью, чтобы добавить этот случай во внутренний тикет, чтобы проинформировать команду о подобном и попытаться ускорить процесс. Кроме того, я бы рекомендовал следить за примечаниями к выпуску ECS для обновлений версии платформы Fargate, которые касаются этого поведения: - https://aws.amazon.com/new/
- https://docs.aws.amazon.com/AmazonECS/latest/developerguide/document_history.html

"

person QiQe Garbi    schedule 20.06.2019