削除済みのAPI Gatewayのロググループをスクリプトで一括削除してみた

2017.10.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

最近よくAmazon API Gatewayで遊んでいたのですが、あまり考えずにAPIを作成したり削除したりしていたら削除済みのAPIのロググループがたくさん残ってしまい、なんとなく邪魔だったので一括削除した際のスクリプトを紹介します。

注意

本スクリプトは、現時点でのAPI Gatewayのロググループの命名規則に依存しています。 この命名規則ですが、仕様として記述されているドキュメントを見つけられませんでした。

もしこの命名規則が変わってしまうとスクリプトの動作が変わってしまい、最悪未削除のAPIのロググループがまとめて削除されてしまう可能性があります。 そのため、本スクリプトを定期的に起動するバッチに組み込んだり、本番環境など万が一消えてしまうと問題のある環境での利用は推奨しません。

前提条件

必要なアプリケーション

jq

スクリプト内でjqを使用しているため、前提としてjqをインストールしている必要があります。

AWS CLI

リソースの取得やロググループの削除などAWSとの接続にCLIを使用するのでインストールしている必要があります。

動作確認環境

以下の環境で動作確認しています。

  • macOS : Sierra(バージョン10.12.6)
  • bash : GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
  • AWS CLI : aws-cli/1.11.139 Python/2.7.10 Darwin/16.7.0 botocore/1.6.6
  • jq : jq-1.5

スクリプト

#!/bin/bash
API_GATEWAY_LOG_NAMES=apigatewayslogs.txt
API_GATEWAY_LOG_NAMES_TMP=apigatewayslogs.tmp
API_NAMES=existapis.txt

aws apigateway get-rest-apis | jq -r '.items[].id' > ${API_NAMES}
aws logs describe-log-groups | jq ".logGroups[]" | jq 'select(.arn | test("arn:aws:logs:[^:]+:[0-9]+:log-group:API-Gateway-Execution-Logs_"))' | jq -r '.logGroupName'  > ${API_GATEWAY_LOG_NAMES}

echo "*** EXISTING API LIST ***"
cat ${API_NAMES}

echo "*** EXISTING API GATEWAY LOG GROUP LIST ***"
cat ${API_GATEWAY_LOG_NAMES}

while read line
do
  grep -v ${line} ${API_GATEWAY_LOG_NAMES} > ${API_GATEWAY_LOG_NAMES_TMP}
  cat ${API_GATEWAY_LOG_NAMES_TMP} > ${API_GATEWAY_LOG_NAMES}
done < ${API_NAMES}
echo done

echo "*** DELETE TARGET LIST ***"
cat ${API_GATEWAY_LOG_NAMES}

echo "delete log groups (y/n)?"
read ANS
if [ $ANS != 'y' ]; then
  exit 1
fi

while read line
do
  aws logs delete-log-group --log-group-name ${line}
done < ${API_GATEWAY_LOG_NAMES}

rm ${API_GATEWAY_LOG_NAMES}
rm ${API_GATEWAY_LOG_NAMES_TMP}
rm ${API_NAMES}

やってみた

現時点で存在するAPI一覧

一応現時点で存在するAPI一覧を確認します。(長いのでidだけ)

$ aws apigateway get-rest-apis | jq -r '.items[].id'
kigsf8z3li
l614daswx2
xosw40j749

API Gatewayのロググループ一覧

API Gatewayのロググループ一覧も見てみます。APIとして存在しないロググループがたくさんあります。

$ aws logs describe-log-groups | jq ".logGroups[]" | jq 'select(.arn | test("arn:aws:logs:[^:]+:[0-9]+:log-group:API-Gateway-Execution-Logs_"))' | jq -r '.logGroupName'
API-Gateway-Execution-Logs_5cc3pvhz5a/prod
API-Gateway-Execution-Logs_b8dgm11uqc/test
API-Gateway-Execution-Logs_ef9k5msy6l/test
API-Gateway-Execution-Logs_gwuqlzoiv3/Prod
API-Gateway-Execution-Logs_gwuqlzoiv3/Stage
API-Gateway-Execution-Logs_ir1mwyypck/prod
API-Gateway-Execution-Logs_kigsf8z3li/Prod
API-Gateway-Execution-Logs_kigsf8z3li/Stage
API-Gateway-Execution-Logs_l614daswx2/prod
API-Gateway-Execution-Logs_mqco8iy8h7/test
API-Gateway-Execution-Logs_qn5hr16rh6/prod
API-Gateway-Execution-Logs_s1f62h7cog/prod
API-Gateway-Execution-Logs_xosw40j749/prod
API-Gateway-Execution-Logs_xsrdsjbp13/prod

API Gatewayのロググループ名は、API-Gateway-Execution-Logs_${APIのID}/${ステージ}となっているようです。

スクリプトでは、aws apigateway get-rest-apisによって取得したAPIのIDと、aws logs describe-log-groupsによって取得したロググループ名のIDを比較し、APIとして存在せず、ロググループには存在するIDのロググループを削除しています。

スクリプトを実行してロググループを削除してみる

$ sh rm_not_exist_api_gateway_logs.sh
*** EXISTING API LIST ***
kigsf8z3li
l614daswx2
xosw40j749
*** EXISTING API GATEWAY LOG GROUP LIST ***
API-Gateway-Execution-Logs_5cc3pvhz5a/prod
API-Gateway-Execution-Logs_b8dgm11uqc/test
API-Gateway-Execution-Logs_ef9k5msy6l/test
API-Gateway-Execution-Logs_gwuqlzoiv3/Prod
API-Gateway-Execution-Logs_gwuqlzoiv3/Stage
API-Gateway-Execution-Logs_ir1mwyypck/prod
API-Gateway-Execution-Logs_kigsf8z3li/Prod
API-Gateway-Execution-Logs_kigsf8z3li/Stage
API-Gateway-Execution-Logs_l614daswx2/prod
API-Gateway-Execution-Logs_mqco8iy8h7/test
API-Gateway-Execution-Logs_qn5hr16rh6/prod
API-Gateway-Execution-Logs_s1f62h7cog/prod
API-Gateway-Execution-Logs_xosw40j749/prod
API-Gateway-Execution-Logs_xsrdsjbp13/prod
done
*** DELETE TARGET LIST ***
API-Gateway-Execution-Logs_5cc3pvhz5a/prod
API-Gateway-Execution-Logs_b8dgm11uqc/test
API-Gateway-Execution-Logs_ef9k5msy6l/test
API-Gateway-Execution-Logs_gwuqlzoiv3/Prod
API-Gateway-Execution-Logs_gwuqlzoiv3/Stage
API-Gateway-Execution-Logs_ir1mwyypck/prod
API-Gateway-Execution-Logs_mqco8iy8h7/test
API-Gateway-Execution-Logs_qn5hr16rh6/prod
API-Gateway-Execution-Logs_s1f62h7cog/prod
API-Gateway-Execution-Logs_xsrdsjbp13/prod
delete log groups (y/n)?
y

削除後のロググループを確認

$ aws logs describe-log-groups | jq ".logGroups[]" | jq 'select(.arn | test("arn:aws:logs:[^:]+:[0-9]+:log-group:API-Gateway-Execution-Logs_"))' | jq -r '.logGroupName'
API-Gateway-Execution-Logs_kigsf8z3li/Prod
API-Gateway-Execution-Logs_kigsf8z3li/Stage
API-Gateway-Execution-Logs_l614daswx2/prod
API-Gateway-Execution-Logs_xosw40j749/prod

実行時に存在していた(削除していない)APIのロググループ以外が削除できました。

終わりに

基本的に不要なリソースは都度削除するのが良いと思いますが、溜まってしまったものはCLIを使って一括で削除すると楽です。

繰り返しとなりますが、本スクリプトを定期的に起動するバッチに組み込んだり本番環境など万が一消えてしまうと問題のある環境での利用は推奨しません。

私からは以上です。