複数プロジェクトのVMをリストするbashスクリプト

記事タイトルとURLをコピーする

G-gen の杉村です。複数の Google Cloud プロジェクトの Compute Engine VM の情報一覧を取得する bash スクリプトを紹介します。

はじめに

概要

当記事で紹介するのは、複数の Google Cloud プロジェクトに存在する Compute Engine VM の一覧を CSV ファイルに出力するためのスクリプトです。

当スクリプトを使うことで、Google Cloud 組織配下の全 VM を一覧にすることができます。組織内での VM の棚卸し等にご利用ください。

前提条件

当 bash スクリプトは、Debian GNU/Linux 12 (bookworm) 上で開発され、動作確認されています。

また、以下のソフトウェアがインストールされていることが前提です。括弧内は開発時のバージョンです。

  • gcloud(Google Cloud SDK 488.0.0
  • jq (jq-1.6

また実行時は、gcloud コマンドの認証情報に、VM の一覧表示権限を持つ Google アカウントが設定されている必要があります。

なお、組織内の全プロジェクトを一覧取得する方法については、以下も参照してください。

blog.g-gen.co.jp

免責事項

当記事で紹介するプログラムのソースコードは、ご自身の責任のもと、使用、引用、改変、再配布して構いません。

ただし、同ソースコードが原因で発生した不利益やトラブルについては、当社は一切の責任を負いません。

ソースコード

当ソースコードは、前述の 免責事項 をご理解のうえ、ご利用ください。

list_all_vms.sh

#!/bin/bash
  
# 引数チェック
if [ $# -ne 1 ]; then
  echo "ERROR : Please specify project list file."
  exit 1
fi
  
# 変数定義
input_file=$1
datetime=`date "+%Y%m%d%H%M"`
output_file_name="all_vms_${datetime}.csv"
  
# プロジェクトごとにループを実行
while read project; do
    ## VM 情報取得処理
    result=`gcloud compute instances list --project=${project} --format=json --quiet`
  
    ## エラーの場合はスキップ
    if [ $? -ne 0 ]; then
      continue
    fi
  
    ## ファイルに記録
    IFS=$'\n'; for vm in `echo ${result} | jq -c '.[]'`; do
        # JSON から各要素を抽出
        id=`echo ${vm} | jq -r .id`
        name=`echo ${vm} | jq -r .name`
        zone=`echo ${vm} | jq -r .zone | rev | cut -d / -f 1 | rev`
        machine_type=`echo ${vm} | jq  -r .machineType | rev | cut -d / -f 1 | rev`
        internal_ip=`echo ${vm} | jq  -r .networkInterfaces[0].networkIP`
        service_account=`echo ${vm} | jq  -r .serviceAccounts[0].email`
        
        # ファイルと標準出力に出力
        echo "${project},${id},${name},${zone},${machine_type},${internal_ip},${service_account}" | tee -a ${output_file_name}
    done 
  
    continue
done < ${input_file}
  
echo ""
echo "##### All VMs are listed in the file below #####"
ls -la ${output_file_name}
  
exit 0

出力例

以下のような CSV ファイルが出力されます。わかりやすいようにテーブル形式で掲載していますが、実際には出力は csv であり、ヘッダは出力されません。

プロジェクト ID インスタンス ID インスタンス 名 ゾーン マシンタイプ 内部 IP アドレス サービスアカウント
my-project-01 12345 my-test-vm-01 us-central1-b e2-micro 10.128.0.33 1234567890-compute@developer.gserviceaccount.com
my-project-01 23456 my-test-vm-02-tokyo asia-northeast1-b e2-medium 10.146.0.2 1234567890-compute@developer.gserviceaccount.com
my-project-02 78901 example-vm-1 us-central1-c e2-medium 10.128.0.2 0987654321-compute@developer.gserviceaccount.com
my-project-03 54321 hoge-vm asia-northeast1-c e2-micro 10.146.0.5 2345678901-compute@developer.gserviceaccount.com

実行方法

入力ファイルの準備

まず、入力ファイルとして1行に1つの Google Cloud プロジェクト ID を記載したテキストファイルを用意します(プロジェクト名ではなく、ID であることに注意してください)。

projects.txt

my-project-01
my-project-02
my-project-03

このファイルを作るには、以下の記事で紹介しているスクリプトを利用することもできます。

blog.g-gen.co.jp

スクリプトの実行

その後、以下のようにスクリプトを実行します。projects.txt は、用意したテキストファイル名に置き換えてください。

./list_all_vms.sh projects.txt

応用

ソースコードの28行目〜36行目を修正することで、任意の情報を CSV ファイルに含めることができます。

同箇所では、JSON 形式で取得した VM 情報を、jq コマンドでフィルタして情報を取得しています。参考として、VM 情報は以下のようなフォーマットになっています(2024年9月現在)。

{
  "canIpForward": false,
  "confidentialInstanceConfig": {
    "enableConfidentialCompute": false
  },
  "cpuPlatform": "Unknown CPU Platform",
  "creationTimestamp": "2024-08-31T18:53:29.048-07:00",
  "deletionProtection": false,
  "description": "",
  "disks": [
    {
      "architecture": "X86_64",
      "autoDelete": true,
      "boot": true,
      "deviceName": "my-test-vm",
      "diskSizeGb": "10",
      "guestOsFeatures": [
        {
          "type": "UEFI_COMPATIBLE"
        },
        {
          "type": "VIRTIO_SCSI_MULTIQUEUE"
        },
        {
          "type": "GVNIC"
        },
        {
          "type": "SEV_CAPABLE"
        },
        {
          "type": "SEV_LIVE_MIGRATABLE_V2"
        }
      ],
      "index": 0,
      "interface": "SCSI",
      "kind": "compute#attachedDisk",
      "licenses": [
        "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-12-bookworm"
      ],
      "mode": "READ_WRITE",
      "source": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-b/disks/my-test-vm",
      "type": "PERSISTENT"
    }
  ],
  "displayDevice": {
    "enableDisplay": false
  },
  "fingerprint": "xxxxxxxxxxx=",
  "id": "1234567890123456789",
  "keyRevocationActionType": "NONE",
  "kind": "compute#instance",
  "labelFingerprint": "xxxxxxxxxxx=",
  "lastStartTimestamp": "2024-09-02T19:49:37.720-07:00",
  "lastStopTimestamp": "2024-09-02T20:07:08.821-07:00",
  "machineType": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-b/machineTypes/e2-micro",
  "metadata": {
    "fingerprint": "xxxxxxxxxxx=",
    "items": [
      {
        "key": "enable-oslogin",
        "value": "true"
      }
    ],
    "kind": "compute#metadata"
  },
  "name": "my-test-vm",
  "networkInterfaces": [
    {
      "accessConfigs": [
        {
          "kind": "compute#accessConfig",
          "name": "External NAT",
          "networkTier": "PREMIUM",
          "type": "ONE_TO_ONE_NAT"
        }
      ],
      "fingerprint": "xxxxxxxxxxx=",
      "kind": "compute#networkInterface",
      "name": "nic0",
      "network": "https://www.googleapis.com/compute/v1/projects/my-project/global/networks/default",
      "networkIP": "10.0.0.2",
      "stackType": "IPV4_ONLY",
      "subnetwork": "https://www.googleapis.com/compute/v1/projects/my-project/regions/us-central1/subnetworks/default"
    }
  ],
  "reservationAffinity": {
    "consumeReservationType": "ANY_RESERVATION"
  },
  "satisfiesPzi": false,
  "scheduling": {
    "automaticRestart": true,
    "onHostMaintenance": "MIGRATE",
    "preemptible": false,
    "provisioningModel": "STANDARD"
  },
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-b/instances/my-test-vm",
  "serviceAccounts": [
    {
      "email": "1234567890-compute@developer.gserviceaccount.com",
      "scopes": [
        "https://www.googleapis.com/auth/devstorage.read_only",
        "https://www.googleapis.com/auth/logging.write",
        "https://www.googleapis.com/auth/monitoring.write",
        "https://www.googleapis.com/auth/service.management.readonly",
        "https://www.googleapis.com/auth/servicecontrol",
        "https://www.googleapis.com/auth/trace.append"
      ]
    }
  ],
  "shieldedInstanceConfig": {
    "enableIntegrityMonitoring": true,
    "enableSecureBoot": false,
    "enableVtpm": true
  },
  "shieldedInstanceIntegrityPolicy": {
    "updateAutoLearnPolicy": true
  },
  "startRestricted": false,
  "status": "TERMINATED",
  "tags": {
    "fingerprint": "xxxxxxxxxxx="
  },
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-b"
}

杉村 勇馬 (記事一覧)

執行役員 CTO / クラウドソリューション部 部長

元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。