こんにちは。
GMOアドマーケティングの@zakisanbaimanです。
GCP上のバックエンド一覧を取得するのに少し苦労したため、一度まとめておきます。
やりたかったこと
バックエンドサービス一覧からcapacityScalerが1.0(100%)のバックエンドのみを抽出したい。
▼バックエンド一覧(画面)
どのコマンドを使うべきか?
バックエンド一覧を直接リストで取得できるコマンドはなさそうなので、gcloud compute backend-services listを使います。
まずは何もオプションを付けず実行してみる。
1 2 3 4 |
$ gcloud compute backend-services list NAME BACKENDS PROTOCOL backend-service01 us-central1-a/instanceGroups/instance-group-1,us-central1-a/instanceGroups/instance-group-2 HTTP |
実行はできましたが、解決すべき問題点が3点あります。
ここでの問題点
- capacityScalerがない
- バックエンドサービス単位でリスト化されている
- バックエンド名がURL形式になっている
問題点1: capacityScalerがない
--format=json
を付けてあげると裏にどんな項目を持っているか確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$ gcloud compute backend-services list --format=json [ { "affinityCookieTtlSec": 0, "backends": [ { "balancingMode": "UTILIZATION", "capacityScaler": 1.0, "group": "https://www.googleapis.com/compute/v1/projects/gcp-study01/zones/us-central1-a/instanceGroups/instance-group-1", "maxUtilization": 0.8 }, { "balancingMode": "UTILIZATION", "capacityScaler": 0.3, "group": "https://www.googleapis.com/compute/v1/projects/gcp-study01/zones/us-central1-a/instanceGroups/instance-group-2", "maxUtilization": 0.8 } ], "connectionDraining": { "drainingTimeoutSec": 300 }, "creationTimestamp": "2020-01-25T19:47:03.566-08:00", "description": "", "enableCDN": false, "fingerprint": "Zygazqm7FoI=", "healthChecks": [ "https://www.googleapis.com/compute/v1/projects/gcp-study01/global/healthChecks/health-check01" ], "id": "6411488831861732696", "kind": "compute#backendService", "loadBalancingScheme": "EXTERNAL", "name": "backend-service01", "port": 80, "portName": "http", "protocol": "HTTP", "selfLink": "https://www.googleapis.com/compute/v1/projects/gcp-study01/global/backendServices/backend-service01", "sessionAffinity": "NONE", "timeoutSec": 30 } ] |
capacityScalerの項目はありました。
これでフィルターはできそうです。
問題点2: バックエンドサービス単位でリスト化されている
このままではバックエンドサービス単位で表示されているため、バックエンド単位でflattenをかけます。
1 2 3 4 5 |
$ gcloud compute backend-services list --flatten="backends[]" NAME BACKENDS PROTOCOL backend-service01 HTTP backend-service01 HTTP |
flattenはできましたが肝心のBACKENDSが消えてしまったため、formatオプションを使って明示的に表示させましょう。
1 2 3 4 |
$ gcloud compute backend-services list --flatten="backends[]" --format="value(backends[])" balancingMode=UTILIZATION;capacityScaler=1.0;group=https://www.googleapis.com/compute/v1/projects/gcp-study01/zones/us-central1-a/instanceGroups/instance-group-1;maxUtilization=0.8 balancingMode=UTILIZATION;capacityScaler=0.3;group=https://www.googleapis.com/compute/v1/projects/gcp-study01/zones/us-central1-a/instanceGroups/instance-group-2;maxUtilization=0.8 |
ちょっとごちゃっとしてますが、バックエンド単位でリスト化できたので、一旦問題点2は解決です。
問題点3: バックエンド名がURL形式になっている
URLの最後の文字列を取得したい場合はbasename関数を使いましょう。
1 2 3 4 |
$ gcloud compute backend-services list --flatten="backends[]" --format="value(backends[])" --format="value(backends.group.basename())" instance-group-1 instance-group-2 |
これでバックエンド一覧を取得できました!
おまけ(capacityScalerでフィルターを掛ける)
capacityScalerが1.0のものだけ取得したいので、filter式を使います。
1 2 3 4 5 6 |
$ gcloud compute backend-services list --flatten="backends[]" --format="value(backends.group.basename())" --filter="name=backend-service01 AND backends.capacityScaler=1" instance-group-1 $ gcloud compute backend-services list --flatten="backends[]" --format="value(backends.group.basename())" --filter="name=backend-service01 AND backends.capacityScaler=0.3" instance-group-2 |
まとめ
何度も諦めかけましたが、なんとかgcloudコマンドだけで完結させることができました。
こんなことせずとも早くバックエンド一覧だけのコマンドができると嬉しいです。
参考
gcloud による出力情報のフィルタと整形
gcloud topic filters