如何避免在AWS Elastic Beanstalk上出现TooManyApplicationVersion异常?

29
最近有没有人见证了这个。
TooManyApplicationVersions Exception

在部署新应用程序版本(war)时,在AWS Elastic Beanstalk控制台上看到这条消息吗?上传war后才出现这条消息,非常烦人。

我想知道为什么会出现这种异常情况,以及应该采取哪些预防措施以避免这种情况发生?


2
如果有人需要,这里有一篇关于如何使用AWS SDK在应用版本数量接近上限时删除过时/旧的应用程序版本的精美文章。 http://www.danmandle.com/blog/automatically-remove-old-aws-elastic-beanstalk-application-versions/ - A Null Pointer
6个回答

29

原因

您看到的异常源自于达到了AWS Elastic Beanstalk的相应帐户限制,参见CreateApplicationVersion错误部分:

  • TooManyApplicationVersions - 调用方已超出与其帐户相关联的应用程序版本数的限制。
  • TooManyApplications - 调用方已超出与其帐户相关联的应用程序数的限制。

当前限制概述在相应的常见问题中:

您最多可以创建25个应用程序和500个应用程序版本。默认情况下,您可以在所有应用程序中运行最多10个环境。如果您还在Elastic Beanstalk以外使用AWS,则可能不会[...]。如果您需要更多资源,请填写AWS Elastic Beanstalk请求表格,您的请求将得到及时评估。[我强调]

解决方案

正如强调的那样,如果您确实需要许多应用程序版本可供重复使用,AWS提供了通常的升级选项,并允许您提交增加AWS Elastic Beanstalk限制请求。否则,您只需删除您将不再使用的旧版本,问题应相应消失。

祝好运!


1
我也遇到过这个问题 - 有没有自动删除旧版本的方法?或者设置某种版本删除策略? - petr
@petr - 抱歉,我不知道 AWS 上是否有现成的东西可用。 - Steffen Opel
Beanstalk现在支持根据生命周期策略自动删除旧版本。请参见http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/applications-lifecycle.html。 - Odinodin

21
这是一行使用AWS CLI的代码,可帮助您清除旧的应用程序版本。用适当的日期替换grep中的文本(2013、2014-01、2014-02-0等)。

如果这个命令能够改进,删除所有已部署的应用程序版本(除了上一个应用程序版本)将会非常好(以备紧急情况保留最后一个版本)。我正在尝试找到一种方法来获取应用程序版本列表,并提供它们是否已部署的信息,但是describe-application-versions没有提供这样的信息。类似于Elastic Beanstalk Web控制台显示应用程序版本列表并详细说明每个版本的部署位置的功能。 - Jose Nobile

15
从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

1
不适用于3.7.8版本。这也是AWS代表建议的,但它根本不起作用。他也不知道如何使其工作。这与该平台的水平相当。 - lucian303
使用 EB CLI 3.20.6 对我来说运行良好。 - steinkel

13

您的版本数量已接近最大值,需要删除旧的或未使用的版本。

在当前的 Web 控制台中,您可以在 Beanstalk 环境的“应用程序版本”选项卡上轻松完成此操作。

输入图片描述


1
这是我们在部署脚本中使用的代码片段,用于删除最旧的应用程序版本。
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 + ')');
                }
            });
        }
    });
});

Elastic Beanstalk API(js)的文档:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElasticBeanstalk.html


0
在我的情况下:
>> 错误只出现在特定的环境和/或应用程序中。其他应用程序在部署方面没有问题。
>> 我没有超过默认的 Beanstalk 配额。我通过计数并与默认值进行比较来验证它。
环境计数
aws elasticbeanstalk describe-environments --output text --query 'Environments[*].[EnvironmentName]' | wc -l

版本数量

aws elasticbeanstalk describe-application-versions --output text --query 'ApplicationVersions[*].[ApplicationName]'  | wc -l

默认值

enter image description here

>> 我还实现了自动回收,类似于update-application-resource-lifecycle

>> 我删除了几个环境/版本,但错误仍然存在


如果您到达了这一行,我唯一的解决方案就是手动删除环境及其版本。在我的情况下,该环境只有一个版本。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接