【GCP】gcloud の便利なフィルタリングとフォーマット化について

| 0件のコメント

gcloud コマンドラインツールは GCP (Google Cloud Platform) 上のリソースやアプリケーションを管理するための CLI ツールで Google Cloud SDK の一部です。

この記事は,  gcloud コマンドラインツールで出力フォーマットを変更する –format フラグと, 結果のサブセットを選択する –filter フラグについての備忘録です。 これらのフラグを使い, Shell Script や設定ファイル化など用途に合ったフォーマットへの変換やフィルタリングを柔軟に行うことができます。

環境は Cloud Shell を使用します。 Cloud Shell は Cloud Console から無料で利用できます。

$ gcloud version
Google Cloud SDK 278.0.0

例として, 全ての GCE (Google Compute Engine) の zone を表示する gcloud compute zones list コマンドを用います。

format flag

–format フラグを使用するとコマンドの結果の出力フォーマットをデフォルトから変更できる。 json を指定すると JSON 形式で出力される。

$ gcloud compute zones list \
    --format json \
    --limit 1
[
  {
    "availableCpuPlatforms": [
      "Intel Cascade Lake",
      "Intel Skylake",
      "Intel Broadwell",
      "Intel Haswell"
    ],
    "creationTimestamp": "1969-12-31T16:00:00.000-08:00",
    "description": "us-east1-b",
    "id": "2231",
    "kind": "compute#zone",
    "name": "us-east1-b",
    "region": "https://www.googleapis.com/compute/v1/projects/t2sy-test-project/regions/us-east1",
    "selfLink": "https://www.googleapis.com/compute/v1/projects/t2sy-test-project/zones/us-east1-b",
    "status": "UP"
  }
]

yaml を指定すると YAML 形式で出力される。

$ gcloud compute zones list \
    --format yaml \
    --limit 1
---
availableCpuPlatforms:
- Intel Cascade Lake
- Intel Skylake
- Intel Broadwell
- Intel Haswell
creationTimestamp: '1969-12-31T16:00:00.000-08:00'
description: us-east1-b
id: '2231'
kind: compute#zone
name: us-east1-b
region: https://www.googleapis.com/compute/v1/projects/t2sy-test-project/regions/us-east1
selfLink: https://www.googleapis.com/compute/v1/projects/t2sy-test-project/zones/us-east1-b
status: UP

config を指定すると辞書スタイルで出力される。

$ gcloud compute zones list \
    --format config \
    --limit 1
creationTimestamp = 1969-12-31T16:00:00.000-08:00
description = us-east1-b
id = 2231
kind = compute#zone
name = us-east1-b
region = https://www.googleapis.com/compute/v1/projects/t2sy-test-project/regions/us-east1
selfLink = https://www.googleapis.com/compute/v1/projects/t2sy-test-project/zones/us-east1-b
status = UP
[availableCpuPlatforms]
0 = Intel Cascade Lake
1 = Intel Skylake
2 = Intel Broadwell
3 = Intel Haswell

csv を指定するとCSV で出力される。csv() 内に1つ以上の列 (フィールド) を指定する必要がある。

$ gcloud compute zones list \
    --format "csv(creationTimestamp,name)" \
    --limit 5
creation_timestamp,name
1969-12-31T16:00:00.000-08:00,us-east1-b
1969-12-31T16:00:00.000-08:00,us-east1-c
1969-12-31T16:00:00.000-08:00,us-east1-d
1969-12-31T16:00:00.000-08:00,us-east4-c
1969-12-31T16:00:00.000-08:00,us-east4-b

flattened を指定するとネストされた要素が平坦化され key-value 形式で出力される。

$ gcloud compute zones list \
    --format flattened \
    --limit 1
---
availableCpuPlatforms[0]: Intel Cascade Lake
availableCpuPlatforms[1]: Intel Skylake
availableCpuPlatforms[2]: Intel Broadwell
availableCpuPlatforms[3]: Intel Haswell
creationTimestamp:        1969-12-31T16:00:00.000-08:00
description:              us-east1-b
id:                       2231
kind:                     compute#zone
name:                     us-east1-b
region:                   https://www.googleapis.com/compute/v1/projects/t2sy-test-project/regions/us-east1
selfLink:                 https://www.googleapis.com/compute/v1/projects/t2sy-test-project/zones/us-east1-b
status:                   UP

ネストされた要素が配列の場合,  index が key の [] に入る。”flattened(availableCpuPlatforms[])” とすると availableCpuPlatforms 以下の配列を選択できる。

$ gcloud compute zones list \
    --format "flattened(availableCpuPlatforms[])" \
    --limit 1
---
availableCpuPlatforms[0]: Intel Cascade Lake
availableCpuPlatforms[1]: Intel Skylake
availableCpuPlatforms[2]: Intel Broadwell
availableCpuPlatforms[3]: Intel Haswell

平坦化は –format フラグに flattened を指定せずに, –flatten フラグを指定することでも可能。–flatten と –format フラグを組み合わせると別のフォーマットで平坦化を実現できる。

$ gcloud compute zones list \
    --flatten "availableCpuPlatforms[]" \
    --format "csv(name,availableCpuPlatforms[])" \
    --limit 4
name,available_cpu_platforms
us-east1-b,Intel Cascade Lake
us-east1-b,Intel Skylake
us-east1-b,Intel Broadwell
us-east1-b,Intel Haswell

list を指定すると, アイテムの順序付きリストで出力される。

$ gcloud compute zones list \
    --format list \
    --limit 1
 - availableCpuPlatforms: [u'Intel Cascade Lake', u'Intel Skylake', u'Intel Broadwell', u'Intel Haswell']
   creationTimestamp: 1969-12-31T16:00:00.000-08:00
   description: us-east1-b
   id: 2231
   kind: compute#zone
   name: us-east1-b
   region: https://www.googleapis.com/compute/v1/projects/t2sy-test-project/regions/us-east1
   selfLink: https://www.googleapis.com/compute/v1/projects/t2sy-test-project/zones/us-east1-b
   status: UP

object を指定すると JSON シリアライゼーションを迂回しリソースのオブジェクト表現で出力される。

$ gcloud compute zones list \
    --format object \
    --limit 1
{u'status': u'UP', u'kind': u'compute#zone', u'description': u'us-east1-b', u'region': u'https://www.googleapis.com/compute/v1/projects/t2sy-test-project/regions/us-east1', u'availab
leCpuPlatforms': [u'Intel Cascade Lake', u'Intel Skylake', u'Intel Broadwell', u'Intel Haswell'], u'creationTimestamp': u'1969-12-31T16:00:00.000-08:00', u'id': u'2231', u'selfLink':
 u'https://www.googleapis.com/compute/v1/projects/t2sy-test-project/zones/us-east1-b', u'name': u'us-east1-b'}

table を指定すると読み易い表形式で出力される。

$ gcloud compute zones list \
    --format "table[box](creationTimestamp,name)" \
    --limit 1
┌───────────────────────────────┬────────────┐
│       CREATION_TIMESTAMP      │    NAME    │
├───────────────────────────────┼────────────┤
│ 1969-12-31T16:00:00.000-08:00 │ us-east1-b │
└───────────────────────────────┴────────────┘

また, title 属性を指定すると表のタイトルを付けられる。

$ gcloud compute zones list \
    --format "table[box,title='GCE Zones'](creationTimestamp,name)" \
    --limit 1
┌────────────────────────────────────────────┐
│                 GCE Zones                  │
├───────────────────────────────┬────────────┤
│       CREATION_TIMESTAMP      │    NAME    │
├───────────────────────────────┼────────────┤
│ 1969-12-31T16:00:00.000-08:00 │ us-east1-b │
└───────────────────────────────┴────────────┘

日時に対しては date() を指定すると, 必要に応じて日時の一部のみを取得することができる。年月日の例が以下。

$ gcloud compute zones list \
    --format "table[box](creationTimestamp.date('%Y-%m-%d'), selfLink.basename())" \
    --limit 1
┌────────────────────┬────────────┐
│ CREATION_TIMESTAMP │ SELF_LINK  │
├────────────────────┼────────────┤
│ 1969-12-31         │ us-east1-b │
└────────────────────┴────────────┘

value() にキーを指定すると, キーの値のみ出力される。

gcloud compute zones list \
    --format "value(selfLink)" \
    --limit 1
https://www.googleapis.com/compute/v1/projects/t2sy-test-project/zones/us-east1-b

scope() を使うと, 指定したスコープで部分的に取得することができる。スコープとして URL 中の projects を指定した例が以下。

$ gcloud compute zones list \
    --format "table[box](creationTimestamp.date('%Y-%m-%d'), selfLink.scope(projects))"
    --limit 1
┌────────────────────┬────────────────────────────────────┐
│ CREATION_TIMESTAMP │             SELF_LINK              │
├────────────────────┼────────────────────────────────────┤
│ 1969-12-31         │ t2sy-test-project/zones/us-east1-b │
└────────────────────┴────────────────────────────────────┘

segment() を使うとさらに絞り込みができる。 例えば以下のように segment(0) を指定することで “t2sy-test-project/zones/us-east1-b” を “/” で区切った最初の要素のみを取得できる。

$ gcloud compute zones list \
    --format "table[box](creationTimestamp.date('%Y-%m-%d'), selfLink.scope(projects).segment(0))" \
    --limit 1
┌────────────────────┬───────────────────┐
│ CREATION_TIMESTAMP │     SELF_LINK     │
├────────────────────┼───────────────────┤
│ 1969-12-31         │ t2sy-test-project │
└────────────────────┴───────────────────┘

–format フラグの詳細は reference – gcloud topic formats または gcloud topic formats コマンドで確認できる。

filter flag

–filter フラグを使用するとコマンド結果をサブセットに絞り込むことができる。
フィルタ条件を記述するための Terms は key operator value の tuple で構成される。
等しい値でフィルタリングしたい場合は “key:pattern” や “key=value” のように書く。ただし, “key:pattern” は非推奨となっている。
以下は, 東京リージョンの zone 名を取得する例。

$ gcloud compute zones list \
    --format "json(name)" \
    --filter "name=asia-northeast1"
[
  {
    "name": "asia-northeast1-b"
  },
  {
    "name": "asia-northeast1-c"
  },
  {
    "name": "asia-northeast1-a"
  }
]

論理演算は AND や OR, NOT をサポートしている。

$ gcloud compute zones list \
    --format "json(name,id)" \
    --filter "name=asia-northeast1 AND NOT id=2250"
[
  {
    "id": "2251",
    "name": "asia-northeast1-b"
  },
  {
    "id": "2252",
    "name": "asia-northeast1-c"
  }
]

“key=(value1,value2,…)” は () 内のいずれかの値と等しい場合に True となる。区切りは space, tab, newline, comma のいずれか。

$ gcloud compute zones list \
    --format "json(name,id)" \
    --filter "name=(asia-northeast1-a,us-east1-b)"
[
  {
    "id": "2231",
    "name": "us-east1-b"
  },
  {
    "id": "2250",
    "name": "asia-northeast1-a"
  }
]

以下は, date(‘%Y-%m-%d’) により変換された年月日でフィルタリングする例。

$ gcloud compute zones list \
    --format json \
    --filter "creationTimestamp.date('%Y-%m-%d')='1969-12-31'" \
    --limit 1
[
  {
    "availableCpuPlatforms": [
      "Intel Cascade Lake",
      "Intel Skylake",
      "Intel Broadwell",
      "Intel Haswell"
    ],
    "creationTimestamp": "1969-12-31T16:00:00.000-08:00",
    "description": "us-east1-b",
    "id": "2231",
    "kind": "compute#zone",
    "name": "us-east1-b",
    "region": "https://www.googleapis.com/compute/v1/projects/t2sy-test-project/regions/us-east1",
    "selfLink": "https://www.googleapis.com/compute/v1/projects/t2sy-test-project/zones/us-east1-b",
    "status": "UP"
  }
]

以下は, id が 2360 以上の zone に絞り込み id の昇順で出力する例。

$ gcloud compute zones list \
    --format "table[box](id:sort=1,name)" \
    --filter "id >= 2360"
┌──────┬───────────────────┐
│  ID  │        NAME       │
├──────┼───────────────────┤
│ 2360 │ us-west2-c        │
│ 2361 │ us-west2-b        │
│ 2362 │ us-west2-a        │
│ 2370 │ asia-east2-c      │
│ 2371 │ asia-east2-b      │
│ 2372 │ asia-east2-a      │
│ 2380 │ europe-west6-b    │
│ 2381 │ europe-west6-c    │
│ 2382 │ europe-west6-a    │
│ 2390 │ asia-northeast2-b │
│ 2391 │ asia-northeast2-c │
│ 2392 │ asia-northeast2-a │
│ 2410 │ asia-northeast3-a │
│ 2411 │ asia-northeast3-c │
│ 2412 │ asia-northeast3-b │
└──────┴───────────────────┘

–filter フラグの詳細は reference – gcloud topic filters または gcloud topic filters コマンドで確認できる。

[1] Filtering and formatting fun with gcloud, GCP’s command line interface