gcloud CLI コマンドのスクリプティング

Google Cloud CLI コマンドは、コマンドラインからだけでなく、スクリプトや他の自動化からも実行できます。たとえば、Jenkins を使用して Google Cloud タスクの自動化を実行する場合などです。

gcloud CLI には、フィルタ、書式設定、--quiet フラグなどのさまざまなツールが付属しており、効率的に出力を処理し、タスクを自動化できます。

gcloud CLI を使用したスクリプトの基本

gcloud CLI を使用して基本的なスクリプトを作成する詳しい手順については、gcloud を使用したスクリプト: Google Cloud タスクの自動化に関する初心者ガイドをご覧ください。

承認

gcloud CLI を使用してスクリプトを作成する場合は、承認メソッドを検討する必要があります。gcloud CLI には次の 2 つのオプションがあります。

  • ユーザー アカウントの承認
  • サービス アカウントの承認

ユーザー アカウントの承認は、スクリプトや他の自動化を 1 台のマシンで実行する場合に推奨されます。

アクセスを承認し、gcloud CLI の他の共通設定手順を行うには、次のコマンドを実行します。

gcloud init

サービス アカウントの承認は、スクリプトや他の自動化を本番環境の複数のマシンにデプロイする場合に推奨されます。すべてのユーザーが root にアクセスできる Compute Engine 仮想マシン インスタンスで gcloud CLI コマンドを実行する場合にもこの承認方法が推奨されます。

サービス アカウントの承認を使用するには、既存のサービス アカウントを使用するか、サービス アカウント ページで新しいサービス アカウントを作成します。

[サービス アカウント] ページに移動

関連付けられた秘密鍵を JSON 形式の鍵ファイルとして作成およびダウンロードするには、サービス アカウントの操作メニューから [鍵を管理] を選択します。

承認を行うには、gcloud auth activate-service-account を実行します。

gcloud auth activate-service-account --key-file [KEY_FILE]

gcloud compute ssh を使用して VM インスタンスに SSH 接続すると、承認が処理されます。SSH 構成ファイルは、gcloud compute config-ssh を使用して構成できます。

gcloud CLI ツールを承認する詳細については、gcloud CLI の承認をご覧ください。

プロンプトの無効化

gcloud CLI コマンドには対話型のものがあり、ユーザーに操作の確認や、入力したコマンドに対するさらなる入力を求めます。

ほとんどの場合、スクリプトやその他の自動機能でコマンドを実行する場合、この機能は望ましくありません。gcloud CLI コマンドからのプロンプトを無効にするには、構成内のdisable_prompts プロパティを True に設定するか、グローバルな --quiet または -q フラグを使用します。ほとんどの対話型コマンドには、追加の確認や入力が必要な場合のデフォルト値があります。プロンプトを無効にすると、そのデフォルト値が使用されます。

次に例を示します。

gcloud debug targets list --quiet

出力のフィルタと書式設定

gcloud CLI を使用してスクリプトを作成するには、予測可能な出力を得ることが重要です。ここでは、--filter--format フラグが役立ちます。これらは、gcloud CLI を使用してコマンドを実行するときに、形式(json、yaml、csv、テキストなど)とフィルター(2015 年以降に作成された「test」で始まる VM 名など)の仕様に準拠した出力の生成を保証します。

フィルタと形式のフラグの使用に関するインタラクティブなチュートリアルを参照したい場合は、次のボタンを使用してチュートリアルを開始します。

Cloud Shell で開く

以下では、gcloud CLI の書式設定コマンドとフィルタ コマンドの一般的な使い方を説明します。

ゾーン us-central1-a で作成されたインスタンスをリストします。

gcloud compute instances list --filter="zone:us-central1-a"

ラベルが特定の値と一致するプロジェクトを JSON 形式でリストします(label.env が「test」であり、label.version が alpha であるなど)。

gcloud projects list --format="json" \
  --filter="labels.env=test AND labels.version=alpha"

プロジェクトを地域のタイムゾーンで示された作成日時とともにリストします。

gcloud projects list \
  --format="table(name, project_id, createTime.date(tz=LOCAL))"

特定の日付以降に作成されたプロジェクトを表形式でリストします。

gcloud projects list \
  --format="table(projectNumber,projectId,createTime)" \
  --filter="createTime.date('%Y-%m-%d', Z)='2016-05-11'"

最後の例では、キーの射影が使用されています。フィルタは、日付形式が設定された後、createTime キーに適用されます。

リージョンの割り当てのネストされた表をリストします。

gcloud compute regions describe us-central1 \
  --format="table(quotas:format='table(metric,limit,usage)')"

グローバル割り当てのフラット化されたリストを CSV 形式で出力します。

gcloud compute project-info describe --flatten='quotas[]' \
  --format='csv(quotas.metric,quotas.limit,quotas.usage)'

ボックスの装飾とタイトルを含む Compute インスタンスを名前でソートし、表形式でリストします。

gcloud compute instances list \
  --format='table[box,title=Instances](name:sort=1,zone:label=zone,status)'

ユーザーのメールアドレスで認証されたプロジェクトをリストします。

gcloud info --format='value(config.account)'

gcloud CLI の filtersformatsprojections フラグに組み込まれている出力構成機能の例については、フィルタリングと書式設定に関するブログ投稿をご覧ください。

ベスト プラクティス

スクリプトや他の自動化に、gcloud CLI コマンドの出力に基づいた条件付きのアクションを実行させるには、次の点に注意してください。

  • コマンドの終了ステータスに依存するアクションを使用する。

    終了ステータスが 0 ではない場合はエラーが発生しています。コマンドの説明に特に記載されていない限り、出力が不完全である可能性があります。 たとえば、複数のリソースを作成するコマンドで一部のリソースしか作成されない場合、それらのリソースが標準出力に表示され、0 以外のステータスで終了します。 または、show_structured_logs プロパティを使用してエラーログを解析します。詳しくは、gcloud config を実行します。

  • 標準エラーに表示されるメッセージに依存するアクションを使用しない。

    このメッセージの文言は gcloud CLI の今後のバージョンで変更され、自動化が機能しなくなる原因になる可能性があります。

  • 標準出力に表示されるメッセージの未加工の出力に依存するアクションを使用しない。

    コマンドのデフォルトの出力は、今後のリリースで変更される可能性があります。このような変更の影響を最小限に抑えるには、--format フラグを次のいずれかとともに使用して出力の書式を設定します。返される値を指定するには、--format=json|yaml|csv|text|list を使用します。その他のオプションについては gcloud topic formats を使用します。

    --format によるデフォルトの出力は、projections を使用して変更できます。さらに詳細に設定するには、--filter フラグを使用して、式に応じて値のサブセットが返されるようにします。これらの戻り値からスクリプトを作成できます。

    以下のセクションで、出力の形式設定とフィルタ設定の例を示します。

スクリプトの例

書式とフィルタを設定する機能を使用して、gcloud CLI コマンドを 1 つのスクリプトにまとめ、組み込まれた情報を簡単に抽出できます。

すべてのプロジェクトのサービス アカウントのキーを一覧表示する

以下のサンプル スクリプトでは、次の方法でプロジェクトのすべてのサービス アカウントに関連付けられたキーを一覧表示します。

  • プロジェクトを反復処理する
  • プロジェクトごとに、関連するサービス アカウントを取得する
  • サービス アカウントごとに、関連するキーを取得する

Bash

#!/bin/bash
for project in  $(gcloud projects list --format="value(projectId)")
do
  echo "ProjectId:  $project"
  for robot in $(gcloud iam service-accounts list --project $project --format="value(email)")
   do
     echo "    -> Robot $robot"
     for key in $(gcloud iam service-accounts keys list --iam-account $robot --project $project --format="value(name.basename())")
        do
          echo "        $key"
     done
   done
done

Windows PowerShell

Windows PowerShell:

foreach ($project in gcloud projects list --format="value(projectId)")
{
  Write-Host "ProjectId: $project"
  foreach ($robot in  gcloud iam service-accounts list --project $project --format="value(email)")
  {
      Write-Host "    -> Robot $robot"
      foreach ($key in gcloud iam service-accounts keys list --iam-account $robot --project $project --format="value(name.basename())")
      {
        Write-Host "        $key"
      }
  }
}

処理するために出力を解析する

次のサンプルは、処理するために出力を解析するデモです。特に、サンプル スクリプトは、サービス アカウント情報を配列に書き込み、複数の値を持つ CSV 形式の serviceAccounts.scope() フィールドの値を分離します。

#!/bin/bash
for scopesInfo in $(
    gcloud compute instances list --filter=name:instance-1 \
        --format="csv[no-heading](name,id,serviceAccounts[].email.list(),
                      serviceAccounts[].scopes[].map().list(separator=;))")
do
      IFS=',' read -r -a scopesInfoArray<<< "$scopesInfo"
      NAME="${scopesInfoArray[0]}"
      ID="${scopesInfoArray[1]}"
      EMAIL="${scopesInfoArray[2]}"
      SCOPES_LIST="${scopesInfoArray[3]}"

      echo "NAME: $NAME, ID: $ID, EMAIL: $EMAIL"
      echo ""
      IFS=';' read -r -a scopeListArray<<< "$SCOPES_LIST"
      for SCOPE in  "${scopeListArray[@]}"
      do
        echo "  SCOPE: $SCOPE"
      done
done