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

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

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

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

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 завершается успешно, я вижу ее вывод после, команда была выполнена (т. е. я вижу результат команды применения после применения ресурсов), что и ожидается кодом.

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

Я вижу 2 причины этому:

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
268
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

I’ve been investigating the issue further and I noticed an internal ticket regarding CloudWatch logs sometimes being truncated for Fargate tasks. The problem was reported as a known issue in the latest Fargate platform version (1.3.0). [1] Looking at our internal tickets for the same, as you mentioned in the case description, the current workaround to avoid this situation is extending the lifetime of the existing container by adding a delay (~>10 seconds) between the logging output of the application and the exit of the process (exit of the container). I can confirm that our service team are still working to get a permanent resolution for this reported issue. Unfortunately, there is no ETA shared for when the fix will be deployed. However, I've taken this opportunity to add this case to the internal ticket to inform the team of the similar and try to expedite the process. In addition, I'd recommend keeping an eye on the ECS release notes for updates to the Fargate platform version which address this behaviour: -- https://aws.amazon.com/new/
-- https://docs.aws.amazon.com/AmazonECS/latest/developerguide/document_history.html

"

Другие вопросы по теме