前提
Google App Engineのバージョン
GAEはデプロイするたびにバージョンを保持しており、特定のバージョンでインスタンスを起動し、トラフィックを分散したりできるようになっている。GAEに関しては以下の記事を参照されたし
Google App Engineのフレキシブル環境にpythonアプリケーションをデプロイする方法
定期削除が必要な理由
厄介な点として、GAEは最大210個までしかデプロイのバージョンを保持できず、それ以上はエラーとなってデプロイできない。バージョンはデプロイの度に増えるので、定期的に削除する必要があるので、今回はその仕組みを構築する手順を紹介
全体像
対象のプロジェクトのバージョン一覧を取得
↓
n行目移行のみのversion.idのデータ群(古いバージョン)を生成
↓
version.idのデータ群を引数として受け取り、そのバージョンをCLIで削除
手順
対象のプロジェクトのバージョン一覧を取得
この際、バージョンIDのみ出力しバージョンIDで降順に並び替えする
gcloud app versions list --project <PROJECT_ID> --format 'value(version.id)' --sort-by '~version'
versions listを実行すると、不要なカラムもついてくるので、これを--formatでversion.idのみにできる
SERVICE VERSION.ID TRAFFIC_SPLIT LAST_DEPLOYED SERVING_STATUS
default 20230822t150847 0.00 2023-08-22T15:09:01+09:00 STOPPED
default 20230905t174001 0.00 2023-09-05T17:40:26+09:00 STOPPED
default 20230905t174807 0.00 2023-09-05T17:48:18+09:00 STOPPED
default 20230905t175504 1.00 2023-09-05T17:55:16+09:00 STOPPED
↓
20230822t150847
20230905t174807
20230905t174001
20230905t175504
n行目移行のみのversion.idのデータ群を生成
tail -n +n。たとえば100件あり、バージョンが50番目に古いもの以降を取得したければ、+50
gcloud app versions list --project <PROJECT_ID> --format 'value(version.id)' --sort-by '~version' | tail -n +n
バージョン削除
上記手順で生成したversion.idのデータ群を引数として受け取り、そのバージョンを削除
gcloud app versions list --project <PROJECT_ID> --format 'value(version.id)' --sort-by '~version' | tail -n +n | xargs --no-run-if-empty gcloud app versions delete --project <PROJECT_ID> --quiet
現在4つのバージョンが存在するので、最新と次に新しいバージョンのみ残して残りを全て削除する(tail -n +3)
gcloud app versions list --project <PROJECT_ID> --format 'value(version.id)' --sort-by '~version.id' | tail -n +3 | xargs --no-run-if-empty gcloud app versions delete --project <PROJECT_ID> --quiet
無事削除完了。あとはこの処理をcloud buildでビルドする際等に実行するようにすればOK。cloud buildについては以下の記事を参照されたし
Google Cloud Buildを使用してCI/CDパイプラインをサクッと構築する
まとめ
いかがでしたでしょうか。本記事では、古いGoogle App Engine のバージョンを定期的に削除する仕組みを紹介しました。ぜひ参考にしてみて下さい。