AWS
ElasticBeanstalk

Elastic Beanstalk で古い Application Versions は自動で消すようにする

概要

CircleCI などを通して ElasticBeanstalk に対して継続的にデプロイしていると、時々 Application Versions の最大数制限に引っかかって失敗してしまいます
これくらい自動で消してくれよ…と思っていたのだが、 AWS CLI 経由であれば自動削除の設定ができるとういことで、試してみました

$ eb deploy YOUR_APP_NAME

WARNING: You have uncommitted changes.
Creating application version archive "app-********".

Uploading: [##################################################] 100% Done...

ERROR: You cannot have more than 500 Application Versions. Either remove some Application Versions or request a limit increase.

準備

AWS コマンドラインインターフェイス をインストールしましょう。
awsebcli ではなく awscli です。

実践

UpdateApplicationResourceLifecycle - AWS Elastic Beanstalk を参考に進めていきます。

今の設定を取得

$ aws elasticbeanstalk describe-applications --application-names YOUR_APP_NAME

{
    "Applications": [
        {
            "ApplicationName": "YOUR_APP_NAME",
            "Description": "Application created from the EB CLI using \"eb init\"",
            "Versions": [
                "app-********",
                ...
                "app-********"
            ],
            "DateCreated": "2017-03-29T12:06:02.417Z",
            "ConfigurationTemplates": [
                "default",
                "variable_environment_setted"
            ],
            "DateUpdated": "2017-03-29T12:06:02.417Z",
            "ResourceLifecycleConfig": {
                "VersionLifecycleConfig": {
                    "MaxCountRule": {
                        "DeleteSourceFromS3": false,
                        "Enabled": false,
                        "MaxCount": 300
                    },
                    "MaxAgeRule": {
                        "DeleteSourceFromS3": false,
                        "Enabled": false,
                        "MaxAgeInDays": 180
                    }
                },
                "ServiceRole": "YOUR_SERVICE_ROLE"
            }
        }
    ]
}

自動削除をApplication Version の もしくは 保持日数 のどちらで設定するか決めます。
それぞれ以下の箇所が現在の設定になります。

数の場合

"MaxCountRule": {
    "DeleteSourceFromS3": false,
    "Enabled": false,
    "MaxCount": 300
}

保持日数の場合

"MaxAgeRule": {
    "DeleteSourceFromS3": false,
    "Enabled": false,
    "MaxAgeInDays": 180
}

デフォルトでは両方とも false になっており、自動削除はオフになっています。

更新コマンドの詳細

今回は awscli 経由で行いますので、 update-application-resource-lifecycle を利用します。

以下のオプションを指定してコマンドを実行します。

key value
--application-name アプリケーションの名前
--resource-lifecycle-config 自動削除の設定

--resource-lifecycle-config は以下の構造になっています。

{
  "ServiceRole": "string",
  "VersionLifecycleConfig": {
    "MaxCountRule": {
      "Enabled": true|false,
      "MaxCount": integer,
      "DeleteSourceFromS3": true|false
    },
    "MaxAgeRule": {
      "Enabled": true|false,
      "MaxAgeInDays": integer,
      "DeleteSourceFromS3": true|false
    }
  }
}

これを --cli-input-json オプションを付けて JSON 形式で指定するか、オプションなしで以下のように送ります。

ServiceRole=string,VersionLifecycleConfig={MaxCountRule={Enabled=boolean,MaxCount=integer,DeleteSourceFromS3=boolean},MaxAgeRule={Enabled=boolean,MaxAgeInDays=integer,DeleteSourceFromS3=boolean}}

設定変更

数の場合

300個で自動削除するようにしてみましょう

$ aws elasticbeanstalk update-application-resource-lifecycle \
    --application-name YOUR_APP_NAME \
    --resource-lifecycle-config "ServiceRole=YOUR_SERVICE_ROLE,VersionLifecycleConfig={MaxCountRule={Enabled=true,MaxCount=300,DeleteSourceFromS3=true}}"
{
    "ApplicationName": "YOUR_APP_NAME",
    "ResourceLifecycleConfig": {
        "VersionLifecycleConfig": {
            "MaxCountRule": {
                "DeleteSourceFromS3": true,
                "Enabled": true,
                "MaxCount": 300
            },
            "MaxAgeRule": {
                "DeleteSourceFromS3": false,
                "Enabled": false,
                "MaxAgeInDays": 180
            }
        },
        "ServiceRole": "YOUR_SERVICE_ROLE"
    }
}

日数の場合

60日で自動削除するようにしてみましょう

$ aws elasticbeanstalk update-application-resource-lifecycle \
    --application-name YOUR_APP_NAME \
    --resource-lifecycle-config "ServiceRole=YOUR_SERVICE_ROLE,VersionLifecycleConfig={MaxAgeRule={Enabled=true,MaxAgeInDays=60,DeleteSourceFromS3=true}}"
{
    "ApplicationName": "YOUR_APP_NAME",
    "ResourceLifecycleConfig": {
        "VersionLifecycleConfig": {
            "MaxCountRule": {
                "DeleteSourceFromS3": false,
                "Enabled": false,
                "MaxCount": 300
            },
            "MaxAgeRule": {
                "DeleteSourceFromS3": true,
                "Enabled": true,
                "MaxAgeInDays": 60
            }
        },
        "ServiceRole": "YOUR_SERVICE_ROLE"
    }
}

なお、数と日数を同時にしていすると以下のように怒られます。

$ aws elasticbeanstalk update-application-resource-lifecycle \
    --application-name YOUR_APP_NAME \
    --resource-lifecycle-config "ServiceRole=YOUR_SERVICE_ROLE,VersionLifecycleConfig={MaxCountRule={Enabled=true,MaxCount=300,DeleteSourceFromS3=true},MaxAgeRule={Enabled=true,MaxAgeInDays=30,DeleteSourceFromS3=true}}"

An error occurred (InvalidParameterValue) when calling the UpdateApplicationResourceLifecycle operation: 'MaxAgeRule' and 'MaxCountRule' cannot be enabled simultaneously.

所感

なんでこれがデフォルト設定されていないかつ Web Console から設定できないんでしょうね 🤔

その後

@yasuhiroki さんからコメントを頂きまして、 WebConsole 上から設定ができるようになったようです :tada:

ElasticBeanstalk のアプリケーションバージョンから設定できます。

image.png

image.png

便利になりました〜 :pray: