如何避免 AWS Elastic Beanstalk 上的 TooManyApplicationVersion 异常?

Posted

技术标签:

【中文标题】如何避免 AWS Elastic Beanstalk 上的 TooManyApplicationVersion 异常?【英文标题】:How to avoid a TooManyApplicationVersion exception on AWS Elastic Beanstalk? 【发布时间】:2012-03-24 06:36:56 【问题描述】:

最近有人目睹了

TooManyApplicationVersions Exception

在AWS Elastic Beanstalk 控制台上部署新的应用程序版本(战争)?看到这条消息真烦人,因为它只有在你上传完战争后才会出现。

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

【问题讨论】:

如果对任何人有帮助,有一篇写得很好的文章,介绍了如何在即将超过限制时使用 AWS 开发工具包删除过时/旧的应用程序版本。 danmandle.com/blog/… 【参考方案1】:

原因

您看到的异常是由于达到了AWS Elastic Beanstalk 各自的帐户限制,请参阅CreateApplicationVersion 中的错误部分[释义]

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

相应的常见问题解答How many applications can I run with AWS Elastic Beanstalk? 中概述了当前限制:

您最多可以创建 25 个应用程序和 500 个应用程序版本。经过 默认情况下,您最多可以运行 10 个环境 应用程序。如果您还在 Elastic Beanstalk 之外使用 AWS, 您可能不是 [...] 如果您需要更多资源,请完成 AWS Elastic Beanstalk 申请表和您的申请将得到及时评估。 [强调我的]

解决方案

正如强调的那样,AWS 提供了通常的升级选项,并允许您提交Request to Increase AWS Elastic Beanstalk Limits,如果您确实需要那么多应用程序版本可供重用。否则,您可能会删除不再使用的旧版本,问题应该会相应消失。

祝你好运!

【讨论】:

我也遇到过这种情况 - 有没有自动删除旧版本的方法?或者设置某种版本的删除策略? @petr - 据我所知,AWS 没有现成可用的东西,抱歉。 Beanstalk 现在支持根据生命周期策略自动删除旧版本。见docs.aws.amazon.com/elasticbeanstalk/latest/dg/…【参考方案2】:

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

在当前的 Web 控制台中,您只需在 Beanstalk 环境的“应用程序版本”选项卡上执行此操作即可。

【讨论】:

【参考方案3】:

这是一个使用 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 等)。

【讨论】:

如果改进此命令以删除所有未部署的应用程序版本减去以前部署的应用程序版本(在紧急情况下保留最后一个),那就太好了。我试图找出一种方法来获取应用程序版本列表以及是否已部署的信息,但 describe-application-versions 不提供此类信息。类似于 Elastic Beanstalk Web 控制台的东西,它显示应用程序版本列表,详细说明每个版本的部署位置。【参考方案4】:

这是我们在部署脚本中用于删除最旧的应用程序版本的一段代码。

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 Beantalk API (js) 的文档:http://docs.aws.amazon.com/AWSjavascriptSDK/latest/AWS/ElasticBeanstalk.html

【讨论】:

【参考方案5】:

从 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

【讨论】:

在 3.7.8 中不起作用。这也是 AWS 代表所建议的,但它根本行不通。他也不知道如何让它发挥作用。与该平台相当。

以上是关于如何避免 AWS Elastic Beanstalk 上的 TooManyApplicationVersion 异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过包括数据库补丁的 Elastic Beanstalk 部署避免停机?

如何使用外部 RDS 数据库在 AWS Elastic Beanstalk 中设置 Laravel 应用程序

AWS Elastic Beanstalk:通过缓存避免在 EB 应用程序更新时重新下载应用程序的静态文件

直接从 Bitbucket 部署到 AWS Elastic Beanstalk

如何使用 Elastic beanstalk 和 Dockerrun.aws.json 正确部署到 AWS?

如何在运行 AWS Linux 2 的 AWS Elastic Beanstalk 上配置 Linux 交换空间?