複数プロジェクトのCloud SQLインスタンスをリストするbashスクリプト (original) (raw)

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

はじめに

概要

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

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

前提条件

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

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

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

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

blog.g-gen.co.jp

免責事項

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

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

ソースコード

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

list_all_sql_instances.sh

if [ -z "$1" ]; then echo "ERROR : Please specify project list file." exit 1 fi

list_file=$1 datetime=date "+%Y%m%d%H%M" output_file_name="all_sqls_${datetime}.csv"

while read project; do

result=`gcloud sql instances list --project=${project} --format=json --quiet 2>&1`


if [ $? -ne 0 ]; then
  echo "${project},failed" | tee -a ${output_file_name}
  continue
fi


IFS=$'\n'; for instance in `echo ${result} | jq -c '.[]'`; do
    
    name=`echo ${instance} | jq -r .name`
    databaseVersion=`echo ${instance} | jq -r .databaseVersion`
    region=`echo ${instance} | jq -r .region`
    tier=`echo ${instance} | jq  -r .settings.tier`
    availabilityType=`echo ${instance} | jq  -r .settings.availabilityType`
    edition=`echo ${instance} | jq  -r .settings.edition 2>/dev/null`
      
    
    echo "${project},${name},${databaseVersion},${edition},${region},${tier},${availabilityType}" | tee -a ${output_file_name}
done 

done < ${list_file}

echo "" echo "##### Listing finished #####" echo ""

ls -la ${output_file_name}

exit 0

出力例

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

プロジェクト ID インスタンス名 DB エンジン エディション リージョン インスタンスタイプ 高可用性設定
my-project-01 mysql-instance-01 MYSQL_8_0 ENTERPRISE asia-northeast1 db-custom-2-7680 REGIONAL
my-project-02 mysql-instance-02 MYSQL_8_0 ENTERPRISE asia-northeast1 db-custom-2-7680 REGIONAL
my-project-03 postgres-instance-01 POSTGRES_15 ENTERPRISE asia-northeast1 db-custom-1-3840 ZONAL

エディション列には、ENTERPRISEENTERPRISE_PLUS が入りますが、Cloud SQL editions がリリース以前に作成されたインスタンスは null になる場合もあります。

またインスタンスタイプの一覧は以下のドキュメントをご参照ください。

実行方法

入力ファイルの準備

まず、入力ファイルとして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_sql_instances.sh projects.txt

応用

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

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

{ "backendType": "SECOND_GEN", "connectionName": "my-project:us-central1:test", "createTime": "2024-10-10T10:55:21.856Z", "databaseInstalledVersion": "MYSQL_8_0_31", "databaseVersion": "MYSQL_8_0_31", "etag": "xxxxx", "failoverReplica": { "available": true }, "gceZone": "us-central1-a", "geminiConfig": { "activeQueryEnabled": true, "entitled": true, "flagRecommenderEnabled": true, "indexAdvisorEnabled": false }, "instanceType": "CLOUD_SQL_INSTANCE", "ipAddresses": [ { "ipAddress": "x.x.x.x", "type": "PRIMARY" } ], "kind": "sql#instance", "maintenanceVersion": "MYSQL_8_0_31.R20240915.01_02", "name": "test", "project": "my-project", "region": "us-central1", "satisfiesPzi": false, "secondaryGceZone": "us-central1-c", "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/my-project/instances/test", "serverCaCert": { "cert": "-----BEGIN CERTIFICATE-----\nxxxx=\n-----END CERTIFICATE-----", "certSerialNumber": "0", "commonName": "C=US,O=Google\, Inc,CN=Google Cloud SQL Server CA,dnQualifier=xxxx", "createTime": "2024-10-10T10:56:15.860Z", "expirationTime": "2034-10-08T10:57:15.860Z", "instance": "test", "kind": "sql#sslCert", "sha1Fingerprint": "xxx" }, "serviceAccountEmailAddress": "p1234567890-abcdefg@gcp-sa-cloud-sql.iam.gserviceaccount.com", "settings": { "activationPolicy": "ALWAYS", "availabilityType": "REGIONAL", "backupConfiguration": { "backupRetentionSettings": { "retainedBackups": 7, "retentionUnit": "COUNT" }, "binaryLogEnabled": true, "enabled": true, "kind": "sql#backupConfiguration", "location": "us", "startTime": "08:00", "transactionLogRetentionDays": 7, "transactionalLogStorageState": "CLOUD_STORAGE" }, "connectorEnforcement": "NOT_REQUIRED", "dataDiskSizeGb": "250", "dataDiskType": "PD_SSD", "deletionProtectionEnabled": false, "edition": "ENTERPRISE", "insightsConfig": {}, "ipConfiguration": { "enablePrivatePathForGoogleCloudServices": false, "ipv4Enabled": true, "requireSsl": false, "serverCaMode": "GOOGLE_MANAGED_INTERNAL_CA", "sslMode": "ALLOW_UNENCRYPTED_AND_ENCRYPTED" }, "kind": "sql#settings", "locationPreference": { "kind": "sql#locationPreference", "zone": "us-central1-a" }, "maintenanceWindow": { "day": 0, "hour": 0, "kind": "sql#maintenanceWindow", "updateTrack": "stable" }, "pricingPlan": "PER_USE", "replicationType": "SYNCHRONOUS", "settingsVersion": "5", "storageAutoResize": true, "storageAutoResizeLimit": "0", "tier": "db-custom-8-32768" }, "sqlNetworkArchitecture": "NEW_NETWORK_ARCHITECTURE", "state": "RUNNABLE" }

杉村 勇馬 (記事一覧)

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

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

Follow @y_sugi_it