PowerShellを活用したGCP Compute Engineインスタンス制御とコスト管理手順

PowerShellを活用してGoogle Cloud Platform(GCP)のCompute Engineインスタンスを管理し、コストを最適化する手法について解説します。
GCPは強力でスケーラブルなクラウドプラットフォームですが、その柔軟性ゆえにコストが予想以上に増大するリスクもあります。本記事では、PowerShellを用いてGCPのリソースを効率的に制御し、コスト管理を行うための具体的な手順を紹介します。
GCPとPowerShellの連携を理解し、インスタンスの作成・管理・スケジュール設定からコスト削減方法まで、実践的な方法を学びましょう。

目次

PowerShellからGCPを操作する準備


PowerShellでGCPを操作するには、GCPのリソースにアクセスするための環境を整える必要があります。以下に具体的な手順を説明します。

GCP APIの有効化

  1. GCPコンソールにログインします。
  2. ナビゲーションメニューから「APIとサービス」 > 「ライブラリ」を選択します。
  3. 「Compute Engine API」を検索し、有効化します。

サービスアカウントの作成とキーのダウンロード

  1. IAMと管理 > サービスアカウントに移動します。
  2. 新しいサービスアカウントを作成し、以下の権限を付与します:
  • Compute Admin(インスタンスの管理用)
  • Billing Viewer(コスト管理用)
  1. サービスアカウントのキーをJSON形式で作成し、ローカルにダウンロードします。

PowerShell環境のセットアップ

  1. ダウンロードしたサービスアカウントキーを安全な場所に保存します。
  2. PowerShellを開き、Google Cloud SDKをインストールします。以下のコマンドを実行してください:
   Invoke-WebRequest -Uri "https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe" -OutFile "GoogleCloudSDKInstaller.exe"
   Start-Process -FilePath "GoogleCloudSDKInstaller.exe" -Wait
  1. インストール後、gcloud auth activate-service-accountコマンドを使用して、サービスアカウントキーを指定し認証します:
   gcloud auth activate-service-account --key-file="path-to-key.json"

path-to-key.jsonはダウンロードしたサービスアカウントキーのパスに置き換えてください。

プロジェクトの設定

  1. デフォルトプロジェクトを設定するため、以下のコマンドを実行します:
   gcloud config set project PROJECT_ID

PROJECT_IDはGCPプロジェクトのIDに置き換えてください。

準備が整ったら


これでPowerShellからGCPのCompute Engineを操作する準備が整いました。次のセクションでは、GCP SDK for PowerShellのインストールと設定について解説します。

GCP SDK for PowerShellのインストールと設定


PowerShellからGCPリソースを操作するには、Google Cloud SDK for PowerShellをインストールし、適切に設定する必要があります。以下にその手順を説明します。

Google Cloud SDKの確認とインストール

  1. PowerShellを管理者権限で開きます。
  2. Google Cloud SDKがすでにインストールされているか確認します。以下のコマンドを実行してください:
   gcloud version

バージョン情報が表示されれば、すでにインストール済みです。

  1. インストールされていない場合、以下のコマンドでインストーラーをダウンロードして実行します:
   Invoke-WebRequest -Uri "https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe" -OutFile "GoogleCloudSDKInstaller.exe"
   Start-Process -FilePath "GoogleCloudSDKInstaller.exe" -Wait

Google Cloud PowerShellモジュールのインストール

  1. インストールが完了したら、PowerShell用のGoogle Cloudモジュールをインストールします。以下のコマンドを実行してください:
   Install-Module -Name GoogleCloud
  1. プロンプトが表示された場合、「Yes」または「All」を選択してインストールを続行します。

サービスアカウントの認証

  1. サービスアカウントキー(JSONファイル)を使用して認証します:
   gcloud auth activate-service-account --key-file="path-to-key.json"

path-to-key.jsonはサービスアカウントキーの保存場所に置き換えてください。

  1. 認証後、デフォルトプロジェクトを設定します:
   gcloud config set project PROJECT_ID

PROJECT_IDはGCPプロジェクトのIDです。

動作確認

  1. 設定が正しいか確認するため、以下のコマンドで現在のプロジェクト情報を取得します:
   gcloud config list

プロジェクトIDや認証情報が正しく表示されれば、セットアップは完了です。

次のステップ


これでGCP SDK for PowerShellのインストールと設定が完了しました。次のセクションでは、Compute Engineインスタンスの作成と基本操作について解説します。

Compute Engineインスタンスの作成と基本操作


PowerShellを使ってGCP Compute Engineインスタンスを操作する方法を解説します。ここでは、インスタンスの作成、起動、停止、削除の基本的な操作を紹介します。

Compute Engineインスタンスの作成

  1. インスタンスを作成するには、以下のコマンドを使用します:
   gcloud compute instances create INSTANCE_NAME `
       --zone=ZONE `
       --machine-type=MACHINE_TYPE `
       --image-family=IMAGE_FAMILY `
       --image-project=IMAGE_PROJECT

パラメータの詳細

  • INSTANCE_NAME: 作成するインスタンスの名前。
  • ZONE: インスタンスを作成するリージョン(例: us-central1-a)。
  • MACHINE_TYPE: マシンの種類(例: n1-standard-1)。
  • IMAGE_FAMILY: 使用するOSイメージのファミリー(例: debian-11)。
  • IMAGE_PROJECT: イメージの提供元プロジェクト(例: debian-cloud)。 :Debian OSのインスタンスを作成する場合:
   gcloud compute instances create my-instance `
       --zone=us-central1-a `
       --machine-type=n1-standard-1 `
       --image-family=debian-11 `
       --image-project=debian-cloud

インスタンスの起動


停止したインスタンスを起動するには、以下のコマンドを使用します:

gcloud compute instances start INSTANCE_NAME --zone=ZONE

gcloud compute instances start my-instance --zone=us-central1-a

インスタンスの停止


不要なインスタンスを停止してコストを削減するには、以下のコマンドを使用します:

gcloud compute instances stop INSTANCE_NAME --zone=ZONE

gcloud compute instances stop my-instance --zone=us-central1-a

インスタンスの削除


不要になったインスタンスを削除するには、以下のコマンドを使用します:

gcloud compute instances delete INSTANCE_NAME --zone=ZONE

gcloud compute instances delete my-instance --zone=us-central1-a

インスタンスの状態確認


現在のインスタンスの状態を確認するには、以下のコマンドを使用します:

gcloud compute instances list

これにより、インスタンスの名前、ゾーン、ステータスなどが一覧で表示されます。

まとめ


これらの基本的なコマンドを活用することで、GCP Compute Engineインスタンスの作成と管理をPowerShellから効率的に行うことができます。次のセクションでは、インスタンスの状態を確認するコマンドについて詳しく説明します。

インスタンスの状態を確認するコマンド


GCP Compute Engineインスタンスを効率的に管理するためには、現在の状態やリソース使用量を確認することが重要です。ここでは、PowerShellから実行できる状態確認コマンドを紹介します。

全インスタンスのリスト表示


現在のプロジェクト内に存在するすべてのインスタンスを一覧表示するには、以下のコマンドを使用します:

gcloud compute instances list


これにより、インスタンス名、ゾーン、マシンタイプ、ステータス、外部IPアドレスなどの情報が表示されます。

出力例:

NAME          ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
my-instance   us-central1-a  n1-standard-1  false        10.128.0.2   34.72.100.1  RUNNING

特定インスタンスの詳細情報


特定のインスタンスに関する詳細情報を取得するには、以下のコマンドを使用します:

gcloud compute instances describe INSTANCE_NAME --zone=ZONE


:

gcloud compute instances describe my-instance --zone=us-central1-a


これにより、ネットワーク設定、ディスク情報、メタデータ、ステータスなどの詳細情報が表示されます。

インスタンスのログ確認


インスタンスの動作に関するログを確認するには、以下のコマンドを使用します:

gcloud logging read "resource.type='gce_instance' AND resource.labels.instance_id='INSTANCE_ID'" --limit=10


:

gcloud logging read "resource.type='gce_instance' AND resource.labels.instance_id='1234567890123456789'" --limit=10


このコマンドでは、特定のインスタンスに関連する最新のログを取得できます。

リソース使用量のモニタリング


インスタンスのCPU使用率やメモリ使用量を確認するには、以下の手順でStackdriver Monitoringを設定します:

  1. Monitoring APIを有効にします:
   gcloud services enable monitoring.googleapis.com
  1. 使用量を取得するために、以下のクエリを実行します:
   gcloud monitoring metrics read "compute.googleapis.com/instance/cpu/utilization" --filter='resource.labels.instance_id="INSTANCE_ID"' --limit=10

ゾーン内インスタンスの稼働状況


特定ゾーン内のインスタンスの稼働状況を確認するには、以下のコマンドを使用します:

gcloud compute instances list --filter="zone:(ZONE)"


:

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

まとめ


これらのコマンドを活用することで、GCP Compute Engineインスタンスの状態やリソース使用状況をリアルタイムで把握できます。次のセクションでは、スケジュールを活用したインスタンスの自動制御について解説します。

スケジュールを活用した自動制御


GCP Compute Engineインスタンスの効率的な運用には、自動的にインスタンスを起動・停止するスケジュール設定が役立ちます。ここでは、PowerShellを利用してスケジュールを設定し、リソースを自動制御する方法を解説します。

スケジュール設定の概要


Google CloudのCloud Schedulerを利用して、定期的なタスクをトリガーできます。これにより、必要な時間にインスタンスを起動または停止し、コストを削減できます。

Cloud Schedulerの有効化

  1. Cloud Scheduler APIを有効化します:
   gcloud services enable cloudscheduler.googleapis.com
  1. 必要に応じて、Pub/Sub APIも有効にします:
   gcloud services enable pubsub.googleapis.com

Pub/Subトピックの作成


スケジュールトリガー用にPub/Subトピックを作成します:

gcloud pubsub topics create TOPIC_NAME


:

gcloud pubsub topics create instance-control-topic

スケジュールの作成

  1. インスタンスを起動または停止するためのスケジュールを作成します。以下は起動スケジュールの例です:
   gcloud scheduler jobs create pubsub JOB_NAME `
       --schedule="0 9 * * *" `
       --topic=TOPIC_NAME `
       --message-body='{"zone":"ZONE", "instance":"INSTANCE_NAME", "action":"start"}'

: 毎日午前9時にインスタンスを起動する場合:

   gcloud scheduler jobs create pubsub start-instance-job `
       --schedule="0 9 * * *" `
       --topic=instance-control-topic `
       --message-body='{"zone":"us-central1-a", "instance":"my-instance", "action":"start"}'
  1. インスタンスを停止するスケジュールの例:
   gcloud scheduler jobs create pubsub stop-instance-job `
       --schedule="0 18 * * *" `
       --topic=instance-control-topic `
       --message-body='{"zone":"us-central1-a", "instance":"my-instance", "action":"stop"}'

Cloud Functionsでのトリガー設定


スケジュールに応じたインスタンスの起動・停止を実行するには、Cloud Functionsを作成します:

  1. Cloud Functionsを有効化:
   gcloud services enable cloudfunctions.googleapis.com
  1. インスタンスを操作するスクリプト(例:Python)を作成し、Cloud Functionsにデプロイします。以下はPythonの例です:
   from googleapiclient import discovery
   import json

   def control_instance(event, context):
       message = json.loads(event['data'])
       zone = message['zone']
       instance = message['instance']
       action = message['action']

       compute = discovery.build('compute', 'v1')

       if action == 'start':
           compute.instances().start(project='YOUR_PROJECT_ID', zone=zone, instance=instance).execute()
       elif action == 'stop':
           compute.instances().stop(project='YOUR_PROJECT_ID', zone=zone, instance=instance).execute()
  1. スクリプトをCloud Functionsにデプロイ:
   gcloud functions deploy control-instance `
       --runtime python39 `
       --trigger-topic instance-control-topic `
       --entry-point control_instance

まとめ


スケジュールと自動化を活用することで、GCP Compute Engineインスタンスを効率的に管理し、不要なリソース使用によるコストを削減できます。次のセクションでは、インスタンスのコスト管理と削減方法について解説します。

インスタンスのコスト管理と削減方法


GCP Compute Engineを効率的に運用するためには、リソースのコスト管理が欠かせません。ここでは、PowerShellとGCPツールを活用したコスト管理と削減方法について解説します。

リソース使用量とコストの追跡

課金情報のエクスポート

  1. GCPのBilling APIを有効化します:
   gcloud services enable cloudbilling.googleapis.com
  1. 課金データをBigQueryにエクスポート設定し、詳細な分析を行います:
   gcloud billing export enable `
       --billing-account=BILLING_ACCOUNT_ID `
       --bigquery-table=PROJECT_ID:DATASET_NAME.TABLE_NAME


:

   gcloud billing export enable `
       --billing-account=012345-678901-ABCDEF `
       --bigquery-table=my-project:billing_data.usage_cost
  1. BigQueryからコストデータを取得して分析します。たとえば、最もコストのかかるインスタンスを確認するクエリを実行します:
   SELECT resource.name, SUM(cost) AS total_cost
   FROM `my-project.billing_data.usage_cost`
   WHERE service.name = 'Compute Engine'
   GROUP BY resource.name
   ORDER BY total_cost DESC
   LIMIT 10;

使用量ダッシュボードの作成


GCPのCloud Monitoringを活用して、インスタンスごとのリソース使用量やコストのダッシュボードを作成します:

  1. Monitoring APIを有効にします:
   gcloud services enable monitoring.googleapis.com
  1. Cloud MonitoringのWeb UIから、Compute Engine関連メトリクス(CPU使用率、ディスクI/Oなど)をトラッキングします。

コスト削減方法

不要なインスタンスの停止


定期的に以下のコマンドで稼働中のインスタンスを確認し、不要なインスタンスを停止または削除します:

gcloud compute instances list
gcloud compute instances stop INSTANCE_NAME --zone=ZONE

プリエンプティブルVMの活用


一時的なワークロードには、コストが低いプリエンプティブルVMを使用します:

gcloud compute instances create INSTANCE_NAME `
    --zone=ZONE `
    --machine-type=MACHINE_TYPE `
    --preemptible

インスタンスのリサイズ


実際の使用量に基づきインスタンスのサイズを調整します:

gcloud compute instances set-machine-type INSTANCE_NAME `
    --zone=ZONE `
    --machine-type=NEW_MACHINE_TYPE

:

gcloud compute instances set-machine-type my-instance `
    --zone=us-central1-a `
    --machine-type=n1-standard-1

割引プランの活用

  1. 永続使用割引(SUDs): 長時間利用するインスタンスに自動的に適用されます。
  2. コミットメント型割引: 特定の期間にわたり一定のリソースを予約し、コストを削減します。以下のコマンドで予約を作成します:
   gcloud compute reservations create RESERVATION_NAME `
       --machine-type=MACHINE_TYPE `
       --zone=ZONE `
       --commitment=1y

スケジュールによる自動化


前述のスケジュールを活用し、稼働時間外にインスタンスを停止して無駄なコストを削減します。

まとめ


PowerShellとGCPのツールを組み合わせることで、リソースの使用状況を正確に把握し、効率的なコスト管理が可能です。さらに、プリエンプティブルVMや割引プランの活用により、運用コストを最小限に抑えることができます。次のセクションでは、トラブルシューティングとよくある問題への対処方法を解説します。

トラブルシューティングとよくある問題


GCPとPowerShellを連携させた際に発生する可能性のあるトラブルと、その解決方法を紹介します。これらのトラブルシューティング手法を活用することで、作業の中断を最小限に抑えられます。

認証エラー

問題: サービスアカウントキーの認証に失敗


エラー例: ERROR: (gcloud.auth.activate-service-account) There was a problem with your key file.

原因:

  • サービスアカウントキーが正しく指定されていない。
  • キーファイルが破損している、または形式が不正。

解決方法:

  1. サービスアカウントキーのパスを確認し、正しいパスを指定します:
   gcloud auth activate-service-account --key-file="path-to-key.json"
  1. JSONファイルが破損している場合、新しいキーを作成して再試行します。

APIエラー

問題: APIが有効化されていない


エラー例: The API "compute.googleapis.com" is not enabled for the project.

原因:
GCPプロジェクトで対象のAPIが有効化されていない。

解決方法:

  1. APIを有効化します:
   gcloud services enable compute.googleapis.com
  1. 有効化した後、再度操作を試みます。

問題: 不正なAPIリクエスト


エラー例: Invalid value for field 'resource': Instance not found.

原因:

  • 指定したインスタンス名やゾーンが間違っている。
  • 操作対象のインスタンスが削除済み。

解決方法:

  1. インスタンス一覧を確認し、正しい情報を取得します:
   gcloud compute instances list
  1. 正しいインスタンス名とゾーンを指定して再試行します。

権限エラー

問題: 必要な権限が不足している


エラー例: PERMISSION_DENIED: The caller does not have permission.

原因:

  • サービスアカウントまたはユーザーに必要な権限が付与されていない。

解決方法:

  1. サービスアカウントに必要なロールを付与します:
   gcloud projects add-iam-policy-binding PROJECT_ID `
       --member="serviceAccount:SERVICE_ACCOUNT_EMAIL" `
       --role="roles/compute.admin"


:

   gcloud projects add-iam-policy-binding my-project `
       --member="serviceAccount:my-service-account@my-project.iam.gserviceaccount.com" `
       --role="roles/compute.admin"
  1. 必要な権限を確認し、追加します(例:roles/billing.viewer)。

ネットワークエラー

問題: 接続タイムアウト


エラー例: ERROR: Timed out connecting to Compute Engine.

原因:

  • ネットワーク設定に問題がある。
  • ファイアウォールルールが適切に設定されていない。

解決方法:

  1. ファイアウォールルールを確認して適切な設定に修正します:
   gcloud compute firewall-rules list
  1. 必要に応じてルールを追加します:
   gcloud compute firewall-rules create allow-ssh `
       --allow tcp:22 `
       --target-tags=instance-tag `
       --direction=INGRESS

スケジュールエラー

問題: Cloud Schedulerが正しく動作しない


エラー例: Unable to trigger the scheduled job.

原因:

  • Pub/SubトピックやCloud Functionsが正しく設定されていない。

解決方法:

  1. Pub/Subトピックが正しく作成されていることを確認します:
   gcloud pubsub topics list
  1. Cloud Functionsのログを確認してエラーを特定します:
   gcloud functions logs read FUNCTION_NAME

まとめ


GCPとPowerShellを連携する際には、認証、API設定、権限、ネットワークに関する問題が発生することがあります。これらの解決方法を参考にして、スムーズに作業を進めてください。次のセクションでは、複数インスタンスを一括管理する方法について解説します。

応用例:複数インスタンスの一括管理


大規模な環境では、複数のCompute Engineインスタンスを効率的に一括管理することが重要です。ここでは、PowerShellを使用した複数インスタンスの一括操作方法を紹介します。

複数インスタンスのリスト化と操作

インスタンスリストの取得


まず、プロジェクト内のすべてのインスタンスを取得してリスト化します:

$instances = gcloud compute instances list --format="csv(name,zone)" | ConvertFrom-Csv


これにより、インスタンス名とゾーンを含むリストが作成されます。

一括停止のスクリプト


すべてのインスタンスを一括で停止するスクリプトの例:

foreach ($instance in $instances) {
    $name = $instance.name
    $zone = $instance.zone
    Write-Host "Stopping instance: $name in zone: $zone"
    gcloud compute instances stop $name --zone=$zone
}


このスクリプトは、すべてのインスタンスを順番に停止します。

一括起動のスクリプト


すべてのインスタンスを一括で起動するスクリプトの例:

foreach ($instance in $instances) {
    $name = $instance.name
    $zone = $instance.zone
    Write-Host "Starting instance: $name in zone: $zone"
    gcloud compute instances start $name --zone=$zone
}

タグを利用した条件付き管理

特定のタグを持つインスタンスを操作


特定のタグを持つインスタンスのみを操作したい場合、フィルタリングを行います:

$taggedInstances = gcloud compute instances list --filter="tags.items='web-server'" --format="csv(name,zone)" | ConvertFrom-Csv

foreach ($instance in $taggedInstances) {
    $name = $instance.name
    $zone = $instance.zone
    Write-Host "Stopping tagged instance: $name in zone: $zone"
    gcloud compute instances stop $name --zone=$zone
}


この例では、web-serverタグを持つインスタンスを一括停止します。

スケジュールによる自動一括管理

定期的な一括操作


Cloud Schedulerを使用して、複数インスタンスの一括起動・停止を自動化できます。例えば、以下のようにスケジュールを設定します:

gcloud scheduler jobs create pubsub stop-multiple-instances `
    --schedule="0 20 * * *" `
    --topic=instance-control-topic `
    --message-body='{"action":"stop", "filter":"tags.items=web-server"}'

Cloud Functionsでの一括操作


Pub/Subトピックをトリガーにして、Cloud Functions内で一括操作を行います:

def control_multiple_instances(event, context):
    from googleapiclient import discovery
    import json

    message = json.loads(event['data'])
    action = message['action']
    filter_expression = message.get('filter')

    compute = discovery.build('compute', 'v1')

    instances = compute.instances().list(project='YOUR_PROJECT_ID', filter=filter_expression).execute()
    for instance in instances['items']:
        zone = instance['zone'].split('/')[-1]
        name = instance['name']
        if action == 'start':
            compute.instances().start(project='YOUR_PROJECT_ID', zone=zone, instance=name).execute()
        elif action == 'stop':
            compute.instances().stop(project='YOUR_PROJECT_ID', zone=zone, instance=name).execute()

まとめ


PowerShellとGCPのツールを組み合わせることで、複数のCompute Engineインスタンスを効率的に一括管理できます。タグやスケジュールを活用することで、柔軟な管理が可能になります。次のセクションでは、本記事の内容をまとめます。

まとめ


本記事では、PowerShellを利用したGCP Compute Engineインスタンスの制御とコスト管理方法について解説しました。以下が主なポイントです:

  • PowerShellからGCPを操作するための準備(API有効化、サービスアカウント設定)。
  • GCP SDK for PowerShellを用いたインスタンスの作成・起動・停止などの基本操作。
  • スケジュールを活用した自動起動・停止でコストを最適化。
  • リソース使用量のモニタリングやBigQueryを使った課金データの追跡によるコスト管理。
  • 複数インスタンスの一括操作やスクリプトによる効率的な運用方法。

PowerShellとGCPツールを組み合わせることで、インフラ管理の効率化とコスト削減を実現できます。これらの手法を活用して、スムーズかつコスト効率の高いクラウド運用を目指してください。

コメント

コメントする

目次