ECSの定期ローリングアップデートをJenkinsでやった話

こんにちは。 エキサイト株式会社の三浦です。

突然ですが、ずーっと同じコンテナを使い続けていると問題がある、という状況になった方はいないでしょうか? 例えばメモリリークなどで、時間が経てば経つほどメモリ使用率が上がっていってしまい、最後にはパフォーマンスが出なくなってしまうなどです。

今回は、AWS ECSにてそれに対応する方法の1つとして、定期ローリングアップデートをJenkinsで行った話をしていきます。

ずっと同じコンテナを使い続けると起きる問題

アプリケーションの作り方の問題で、同じコンテナをずっと使い続けていると問題が発生する場合があります。 例えばメモリリークでメモリ使用率が際限なく上がってしまう、ゴミデータがたまり続けてストレージを圧迫してしまうなどです。

アプリケーションの修正によってそれらの問題に対応できるならそれで問題はないのですが、あまりに古いアプリケーションだったりして修正が困難な場合もあるでしょう。

弊社でも、あるアプリケーションでコンテナを更新せずにずっと使い続けるとメモリ使用率が上がっていってしまい、パフォーマンスが下がってしまうという問題が発生していました。 そこで弊社では、コンテナごと定期的に更新する方法で対処しました。

定期ローリングアップデート法

やり方は簡単で、Jenkins上で、定期的に対象ECSを強制ローリングアップデートするだけです。

ローリングアップデートは、AWS CLIを以下のように使用しました。

stages {
    stage("Rolling Update: ECS") {
        steps {
            // ローリングアップデート実行
            sh """
            aws ecs update-service \
                --cluster $CLUSTER_NAME \
                --service $SERVICE_NAME \
                --platform-version 1.4.0 \
                --force-new-deployment
            """

            // アップデートが完了するまで待つ
            sh """
            aws ecs wait services-stable  \
                --cluster $CLUSTER_NAME \
                --service $SERVICE_NAME
            """
        }
    }
}

それを、以下のように定期的にアップデートします。

H(0-30) 10 * * *

毎朝10:00~10:30の間で、よしなに実行してくれます。

さいごに

根本的な解決になっているとは言い難いかもしれませんが、とりあえずの処置としては十分に機能するのではないでしょうか。