最近誰かが目撃しました
TooManyApplicationVersions Exception
新しいアプリケーションバージョン(war)のデプロイ中にAWS Elastic Beanstalkコンソールで?戦争のアップロードが終了した後にのみ表示されるこのメッセージを見るのはとても迷惑です。
この例外が発生する理由と、そのような状況を回避するためにどのような予防措置を講じるべきかを知りたいと思います。
最近誰かが目撃しました
TooManyApplicationVersions Exception
新しいアプリケーションバージョン(war)のデプロイ中にAWS Elastic Beanstalkコンソールで?戦争のアップロードが終了した後にのみ表示されるこのメッセージを見るのはとても迷惑です。
この例外が発生する理由と、そのような状況を回避するためにどのような予防措置を講じるべきかを知りたいと思います。
表示されている例外は、 AWS ElasticBeanstalkのそれぞれのアカウント制限に達したことが原因です。CreateApplicationVersionのエラーのセクションを参照してください[言い換え]:
- TooManyApplicationVersions-呼び出し元が、アカウントに関連付けられているアプリケーションバージョンの数の制限を超えました。
- TooManyApplications-発信者がアカウントに関連付けられているアプリケーションの数の制限を超えました。
現在の制限は、それぞれのFAQに概説されています。AWSElasticBeanstalkで実行できるアプリケーションの数はいくつですか。:
最大25のアプリケーションと500のアプリケーションバージョンを作成できます。デフォルトでは、すべてのアプリケーションで最大10の環境を実行できます。Elastic Beanstalk以外でもAWSを使用している場合は、そうではない可能性があります[...]さらにリソースが必要な場合は、AWS ElasticBeanstalkリクエストフォームに記入してください。リクエストはすぐに評価されます。 [強調鉱山]
強調されているように、AWSは通常のエスカレーションオプションを提供し、AWS Elastic Beanstalkの制限を増やすリクエストを送信できるようにします。これは、まだ多くのアプリケーションバージョンを再利用できるようにする必要がある場合です。そうしないと、使用しなくなった古いものを削除するだけで、問題はそれに応じて消えるはずです。
幸運を!
これは、古いアプリケーションバージョンをクリアするのに役立つAWSCLIを使用する1つのライナーです。
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など)に置き換えます。
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
これは、デプロイスクリプトで最も古いアプリケーションバージョンを削除するために使用するコードです。
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