背景
AWSのSAMテンプレートを利用しており、AutoPublishAliasプロパティを使い、Lambda関数にエイリアスとバージョンを設定しています。この場合、関数を更新するたびに新しいバージョンが作られるため、これを何度も繰り返した場合、気づかないうちにLambdaのストレージの制限である75GBを超えてしまう恐れがあります。
現状、SAMのプロパティに古いバージョンのLambdaを削除するような設定は無く、Issuesを見る限り今後も実装されなさそうであるため、独自で古いバージョンのLambdaの削除を行う必要があります。
今回は、問題が発生した場合にすぐに戻せるよう、最新から数バージョンは残しておきつつ、それ以前の古いバージョンは削除するようなスクリプトを作成しました。
スクリプト
delete-lambda-old-version.sh
#! /bin/bash
# 古いバージョンのLambdaを削除する
# 第一引数:Lambda関数名
# 第二引数:残すバージョン数
aws lambda list-versions-by-function --function-name $1 | \
jq -r '.Versions[] | select(.Version != "$LATEST") | .Version' | \
sort -V | head -n -$2 | \
xargs -I{} aws lambda delete-function --function-name $1 --qualifier {}
仕掛けとしては、list-versions-by-functionで当該Lambda関数のバージョンを取得し、jqで整形しつつ$LATESTを除き昇順でバージョンをリスト化し、第二引数で指定した分だけバージョンをリストから除外し、最後にそのリストを使ってdelete-functionしています。
(※ご利用は自己責任でお願いします)
呼び出し例
# Lambda関数test-funcを最新10バージョン残し、残りを削除する
sh delete-lambda-old-version.sh test-func 10