コマンドラインから gcloud
コマンドライン ツールコマンドを実行できるだけでなく、スクリプトや他の自動化から実行することもできます(Jenkins を使用して Google Cloud のタスクを自動化する場合など)。
Cloud SDK には、フィルタ、書式設定、--quiet
フラグなどのさまざまなツールが付属しており、効率的に出力を処理し、タスクを自動化できます。
Cloud SDK を使用したスクリプトの基本
gcloud
ツールを使用して基本的なスクリプトを作成する詳しい手順については、Google Cloud タスクの自動化に関する初心者ガイドをご覧ください。
承認
Cloud SDK を使用してスクリプトを作成する場合は、承認メソッドを検討する必要があります。Cloud SDK には次の 2 つのオプションがあります。
- ユーザー アカウントの承認
- サービス アカウントの承認
ユーザー アカウントの承認は、スクリプトや他の自動化を 1 台のマシンで実行する場合に推奨されます。
アクセスを承認し、Cloud SDK のその他の一般的な設定手順を行うには、次のコマンドを実行します。
gcloud init
サービス アカウントの承認は、スクリプトや他の自動化を本番環境の複数のマシンにデプロイする場合に推奨されます。すべてのユーザーが root
にアクセスできる Compute Engine 仮想マシン インスタンスで gcloud
ツールコマンドを実行する場合にもこの承認方法が推奨されます。
サービス アカウントの承認を使用するには、既存のサービス アカウントを使用するか、サービス アカウント ページで新しいサービス アカウントを作成します。
関連付けられた秘密鍵を 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
を使用して構成できます。
Cloud SDK ツールの承認の詳細については、総合的なガイドをご覧ください。
プロンプトの無効化
gcloud
コマンドには対話型のものがあり、ユーザーに操作の確認や、入力したコマンドに対するさらなる入力を求めます。
ほとんどの場合、スクリプトやその他の自動機能でコマンドを実行する場合、この機能は望ましくありません。構成で disable_prompts
プロパティを True
に設定するか、グローバル --quiet
または -q
フラグを使用すると、gcloud
ツールコマンドからのプロンプトを無効にできます。ほとんどの対話型コマンドには、追加の確認や入力が必要な場合のデフォルト値があります。プロンプトを無効にすると、そのデフォルト値が使用されます。
例:
gcloud debug targets list --quiet
出力のフィルタと書式設定
gcloud
ツールを使用してスクリプトを作成するには、予測可能な出力を得ることが重要です。ここで --filter
と --format
フラグが役立ちます。これらは、gcloud
ツールを使用してコマンドを実行するときに、形式(json、yaml、csv、テキストなど)とフィルター(2015 年以降に作成された「test」で始まる VM 名など)の仕様に準拠した出力の生成を保証します。
フィルタと形式のフラグの使用に関するインタラクティブなチュートリアルを参照したい場合は、次のボタンを使用してチュートリアルを開始します。
以下では、gcloud
ツールコマンドでの書式設定とフィルタリングの一般的な使い方を示しています。
ゾーン 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
ツールの filters
、formats
、projections
フラグに組み込まれている出力の構成機能の例については、フィルタと書式設定に関するブログ投稿 をご覧ください。
おすすめの方法
スクリプトや他の自動化に、gcloud
ツールコマンドの出力に基づいた条件付きのアクションを実行させるには、次の点に注意してください。
コマンドの終了ステータスに依存するアクションを使用する。
終了ステータスが 0 ではない場合はエラーが発生しています。コマンドの説明に特に記載されていない限り、出力が不完全である可能性があります。 たとえば、複数のリソースを作成するコマンドで一部のリソースしか作成されない場合、それらのリソースが標準出力に表示され、0 以外のステータスで終了します。 または、
show_structured_logs
プロパティを使用してエラーログを解析します。詳しくは、gcloud config
を実行します。標準エラーに表示されるメッセージに依存するアクションを使用しない。
このメッセージの文言は
gcloud
ツールの今後のバージョンで変更され、自動化が機能しなくなる原因になる可能性があります。標準出力に表示されるメッセージの未加工の出力に依存するアクションを使用しない。
コマンドのデフォルトの出力は、今後のリリースで変更される可能性があります。このような変更の影響を最小限に抑えるには、
--format
フラグを次のいずれかとともに使用して出力の書式を設定します。返される値を指定するには、--format=json|yaml|csv|text|list
を使用します。その他のオプションについてはgcloud topic formats
を使用します。--format
によるデフォルトの出力は、projections
を使用して変更できます。さらに詳細に設定するには、--filter
フラグを使用して、式に応じて値のサブセットが返されるようにします。これらの戻り値からスクリプトを作成できます。以下のセクションで、出力の形式設定とフィルタ設定の例を示します。
スクリプトの例
書式とフィルタを設定する機能を使用して、gcloud
ツールコマンドを 1 つのスクリプトにまとめ、組み込まれた情報を簡単に抽出できます。
すべてのプロジェクトのサービス アカウントに関連付けられたすべてのキーをリストする場合、すべてのプロジェクト全体に対して、および各プロジェクトに対して手順を繰り返し、それに関連付けられたすべてのサービス アカウントを取得する必要があります。各サービス アカウントに対して、すべてのキーを取得します。以下のようにして、これを行うことができます。
バッチ スクリプト:
#!/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:
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