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ïŒ Google Cloud SDK 488.0.0 ïŒ jq ïŒ jq-1.6 ïŒ ãŸãå®è¡æã¯ãgcloud ã³ãã³ãã®èªèšŒæ
å ±ã«ãCloud SQL ã€ã³ã¹ã¿ã³ã¹ã®äžèŠ§è¡šç€ºæš©éãæã€ Google ã¢ã«ãŠã³ããèšå®ãããŠããå¿
èŠããããŸãã åè : ãŠãŒã¶ãŒ ã¢ã«ãŠã³ãã䜿çšããŠèªå¯ãã åè : ãµãŒãã¹ ã¢ã«ãŠã³ãã䜿çšããŠæ¿èªãã åè : Cloud SQL ã®ããŒã« ãªããçµç¹å
ã®å
šãããžã§ã¯ããäžèЧååŸããæ¹æ³ã«ã€ããŠã¯ã以äžãåç
§ããŠãã ããã blog.g-gen.co.jp å
責äºé
åœèšäºã§ç޹ä»ããããã°ã©ã ã®ãœãŒã¹ã³ãŒãã¯ããèªèº«ã®è²¬ä»»ã®ããšã䜿çšãåŒçšãæ¹å€ãåé
åžããŠæ§ããŸããã ãã ããåãœãŒã¹ã³ãŒããåå ã§çºçããäžå©çããã©ãã«ã«ã€ããŠã¯ãåœç€Ÿã¯äžåã®è²¬ä»»ãè² ããŸããã ãœãŒã¹ã³ãŒã åœãœãŒã¹ã³ãŒãã¯ãåè¿°ã® å
責äºé
ããçè§£ã®ããããå©çšãã ããã list_all_sql_instances.sh #!/bin/bash # åŒæ°ãã§ã㯠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 # JSON ããåèŠçŽ ãæœåº 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 ãšãã£ã·ã§ã³åã«ã¯ã ENTERPRISE ã ENTERPRISE_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----- \n xxxx= \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