Подтвердить что ты не робот

Как избежать исключения TooManyApplicationVersion на AWS Elastic Beanstalk?

В последнее время кто-нибудь видел

TooManyApplicationVersions Exception

на консоли AWS Elastic Beanstalk при развертывании новой версии приложения (войны)? Это так неприятно видеть это сообщение, как оно появляется только после того, как вы закончили загрузку войны.

Мне было бы интересно узнать, почему это исключение происходит и какие меры предосторожности следует предпринять, чтобы избежать таких ситуаций?

4b9b3361

Ответ 1

Причина

Исключение, которое вы видите, связано с достижением ваших соответствующих ограничений для AWS Elastic Beanstalk, см. раздел "Ошибки в CreateApplicationVersion [перефразировать]:

  • TooManyApplicationVersions. Вызывающий превысил лимит на количество версий приложений, связанных с их учетной записью.
  • TooManyApplications. Пользователь превысил лимит количества приложений, связанных с их учетной записью.

Текущие ограничения указаны в соответствующих FAQ Сколько приложений я могу запустить с помощью AWS Elastic Beanstalk?:

Вы можете создать до 25 приложений и 500 версий приложений. От по умолчанию вы можете запускать до 10 окружений на всех ваших Приложения. Если вы также используете AWS вне эластичного бобового стебля, вы не можете быть [...] Если вам нужно больше ресурсов, заполните AWS Elastic Beanstalk, и ваш запрос будет быстро оценен. [акцент мой]

Решение

Как было подчеркнуто, AWS предлагает обычную опцию эскалации и позволяет вам отправить запрос на увеличение пределов AWS для эластичных beanstalk, если вам это действительно нужно многие версии приложений будут доступны для повторного использования. В противном случае вы можете просто удалить старые, которые больше не будут использоваться, и проблема должна исчезнуть соответственно.

Удачи!

Ответ 2

Здесь один лайнер, который использует AWS CLI, который поможет вам очистить старые версии приложений:

aws elasticbeanstalk describe-application-versions --output text --query 'ApplicationVersions[*].[ApplicationName,VersionLabel,DateCreated]' | grep "2014-02" | while read app ver date; do aws elasticbeanstalk delete-application-version --application-name $app --version-label $ver --delete-source-bundle; done

Замените grep любой датой (2013, 2014-01, 2014-02-0 и т.д.), которую вы сочтете нужным.

Ответ 3

Начиная с EB CLI 3.3, вы можете запустить следующее, чтобы очистить старые версии:

$ eb labs cleanup-versions

По умолчанию это будет очистка до последних 10 версий и/или старше 60 дней. Добавляя --help, выдает следующее:

usage: eb labs cleanup-versions [options...]

Cleans up old application versions.

optional arguments:
--num-to-leave NUM    number of versions to leave DEFAULT=10
--older-than DAYS     delete only versions older than x days DEFAULT=60
--force               don't prompt for confirmation

Ответ 4

Вы приближаетесь к максимальному количеству версий и вам нужно удалить старые или неиспользованные версии.

В текущей веб-консоли вы можете просто сделать это на вкладке "Версии приложений" вашей среды Beanstalk.

enter image description here

Ответ 5

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

console.log('Deleting oldest application version.');
params = {};
local.waitFor(function(done) {
    eb.describeApplicationVersions(params, function(err, data) {
        if (err) {
            console.error(err, err.stack);
            local.abort('Could not retrieve the list of application version.');
        } else {
            // This is probably not needed as the list is already sorted but it is
            // not written anywhere that this will always be the case
            function compare(a,b) {
                if (a.DateCreated > b.DateCreated)
                    return -1;
                if (a.DateCreated < b.DateCreated)
                    return 1;
                return 0;
            }
            var applicationsVersion = data['ApplicationVersions'].sort(compare),
                oldestApplication   = applicationsVersion[applicationsVersion.length - 1],
                applicationName     = oldestApplication['ApplicationName'],
                versionLabel        = oldestApplication['VersionLabel'];
            params = {
                ApplicationName: applicationName, /* required */
                VersionLabel:    versionLabel,    /* required */
                DeleteSourceBundle: false /* Do not delete source bundle from S3 */
            };
            eb.deleteApplicationVersion(params, function(err, data) {
                if (err) {
                    console.error(err, err.stack);
                    local.abort('Could not delete the oldest application version. (' + versionLabel + ')')
                } else {
                    console.log('Successfully deleted the oldest application version. (' + versionLabel + ')');
                }
            });
        }
    });
});

Документация для API эластичных beantalk (js): http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElasticBeanstalk.html