Я использую задачу 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 причины:
- Результат неудачной команды terraform возвращает ненулевой код, что означает, что задача ECS завершается до вывода журналов в стандартный вывод (и, следовательно, в Cloudwatch).
- Результат неудачной команды terraform отправляется на stderr, который неправильно регистрируется.
В чем моя ошибка и как ее исправить? Любая помощь очень ценится :)