使ってないGCEインスタンスを洗い出す


経緯

  • 社内のいろんな人がGCE使ってインスタンス作りまくった結果、色々と不要そうなインスタンスが溜まってきたので、それらの洗い出しがしたかった
  • gcloud compute instance listとかで最終起動時間とか見れるかなーと思ったが見れなかったので

「使ってない」の定義

今回はインスタンスが指定の日数の間に稼動していなかった場合、「使ってない」と判断する

稼動しているかどうかの判断

今回はStackdriverLoggingの方のログが出ているかで判断することにした。なお、管理アクティビティ監査ログは400日間は保存されるので、それ以上の日数稼動していないとかの判断はできなさそう

やってみた

#!/bin/bash
while read instance
do
  id="$(jq -r ".id" <<<"$instance")"
  name="$(jq -r ".name" <<<"$instance")"

  filterdate=$(date -d "-14 days" "+%Y-%m-%dT15:00:00.000Z")
  # log=$(gcloud logging read "resource.type=\"gce_instance\" resource.labels.instance_id=\"${id}\" jsonPayload.event_subtype=\"compute.instances.start\" timestamp>=\"${filterdate}\"" --limit=1)
  log=$(gcloud logging read "resource.type=\"gce_instance\" resource.labels.instance_id=\"${id}\" timestamp>=\"${filterdate}\"" --limit=1)

  if [ -z "$log" ]; then
    # ログがない=稼動してない
    echo $name
  fi

done < <(jq -c "{ id: .id, name: .name }" <<<"$(gcloud compute instances list --format=json --filter="status!=RUNNING" | jq -r ".[]")")

懸念

  • なんかもっとスマートな方法がある気がしてならない
  • メンテナンスかなんかで稼動してない場合でもインスタンスのログが出力されるのだったらこの方法使えない
  • 稼動していても使ってないインスタンスは洗い出せない