Назад | Перейти на главную страницу

Как автоматизировать обновление OS / ECS-агента на инстансе EC2 в среде ECS Auto Scaling?

Во-первых: мне кажется, что я до сих пор не понимаю некоторых фундаментальных концепций AWS, поэтому, пожалуйста, потерпите меня, если этот вопрос нубический.

У меня в AWS настроена следующая конфигурация:


У меня сложилось несколько предубеждений / условий


С помощью CloudWatch и Лямбда, Я поставил перед собой следующие задачи:

Экземпляр идентифицируется по имени кластера, которое автоматически добавляется в тег Name.

Теперь я надеялся, что, как только Auto Scaling Group создаст новый экземпляр, он будет иметь последний и лучший AMI, включая последний агент ECS.

Поправьте меня, если я ошибаюсь, но когда я посмотрел на конфигурацию запуска для этой группы автоматического масштабирования, я понял, что это не так, потому что она всегда использует настроенный AMI.


Мой общий вопрос: Какая польза от этой настройки, когда мне нужно время от времени вручную проверять (когда именно?), Чтобы обновить AMI в конфигурации запуска, а затем завершить работу экземпляра, чтобы заменить его новым?

Я понимаю, что многие люди, вероятно, не хотят автоматизировать обновления ОС в производственном кластере, потому что они хотят сначала протестировать это. Но все же может потребоваться промежуточная среда, в которой обновления ОС применяются автоматически. Почему я использую платформу с высокой степенью автоматизации, если мне все еще нужно вручную запускать обновления ОС. Это концептуальное недоразумение с моей стороны?

Я создал лямбда-функцию для обновления агента экземпляра во всех моих кластерах ECS:

var AWS = require('aws-sdk');
AWS.config.update({ region: 'sa-east-1' });

exports.handler = async(event, context) => {
    var ecs = new AWS.ECS();

    var responseArray = [];

    const clusters = await ecs.listClusters({}).promise();

    for (var i = 0; i < clusters.clusterArns.length; i++) {
        const clusterArn = clusters.clusterArns[i];

        const clusterInstances = await ecs.listContainerInstances({
            cluster: clusterArn
        }).promise();

        for (var j = 0; j < clusterInstances.containerInstanceArns.length; j++) {
            const containerInstanceArn = clusterInstances.containerInstanceArns[j];

            try {
                const response = await ecs.updateContainerAgent({
                    containerInstance: containerInstanceArn,
                    cluster: clusterArn
                }).promise();

                responseArray.push({
                    cluster: clusterArn,
                    containerInstance: containerInstanceArn,
                    response: response
                });
            }
            catch (e) {
                responseArray.push({
                    cluster: clusterArn,
                    containerInstance: containerInstanceArn,
                    response: e
                });
            }
        }
    }

    return responseArray;
};

Затем я создал правило события CloudWatch для ежедневного выполнения лямбда-функции. У меня работает хорошо.