arrow_back

未使用の永続ディスクと孤立した永続ディスクのクリーンアップ

参加 ログイン
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

未使用の永続ディスクと孤立した永続ディスクのクリーンアップ

Lab 1時間 universal_currency_alt クレジット: 5 show_chart 中級
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP648

Google Cloud セルフペース ラボ

概要

このラボでは、Cloud FunctionsCloud Scheduler を使用して、活用されていないクラウド リソースを特定してクリーンアップします。このケースでは、Cloud Functions 関数のスケジュールを設定し、アタッチされていない永続ディスクと孤立した永続ディスクを特定してクリーンアップします。

演習内容

  • 2 つの永続ディスクを作成する。
  • ディスクの 1 つを使用する VM を作成する。
  • ディスクを VM から切断する。
  • Cloud Functions 関数のコードを確認する。
  • Cloud Functions 関数をデプロイする。
  • Cloud Scheduler ジョブを使用して Cloud Functions 関数をテストする。

アーキテクチャ

次の図は、このラボの最初のセクションで使用されるアーキテクチャを示しています。ここでは、Cloud Functions 関数のスケジュールを設定し、未使用の永続ディスクと孤立した永続ディスクを特定してクリーンアップします。

アーキテクチャの図

設定

このセクションでは、ラボの実施に必要なインフラストラクチャと ID を構成します。

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。
  • ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Cloud Shell をアクティブにする

Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン 「Cloud Shell をアクティブにする」アイコン をクリックします。

接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  1. (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
  1. [承認] をクリックします。

  2. 出力は次のようになります。

出力:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project = <project_ID>

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: Google Cloud における gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。

タスク 1. API の有効化とリポジトリのクローン作成

  1. Cloud Shell で、Cloud Scheduler API を有効にします。

    gcloud services enable cloudscheduler.googleapis.com
  2. リポジトリのクローンを作成します。

    gsutil cp -r gs://spls/gsp648 . && cd gsp648
  3. 環境変数を設定し、リポジトリ フォルダを $WORKDIR にします。このラボに関連するすべてのコマンドを $WORKDIR で実行します。

    export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null) WORKDIR=$(pwd)
  4. このラボのプロジェクト リージョンを設定します。

    gcloud config set compute/region {{{project_0.default_region | "REGION"}}}
  5. リージョンの変数を作成します。

    export REGION={{{project_0.default_region | Region}}}
  6. ゾーンの変数を作成します。

    export ZONE={{{project_0.default_zone | Zone}}}

詳しくは、リージョンとゾーンのドキュメントをご確認ください。

注: 自分のマシンで gcloud を実行する場合はセッション間で config 設定が維持されますが、Cloud Shell で実行する場合はセッションごと、または再接続するたびに設定する必要があります。

タスク 2. 永続ディスクの作成

  1. Cloud Shell で unattached-pd ディレクトリに移動します。

    cd $WORKDIR/unattached-pd
  2. ディスクの名前を変数としてエクスポートします。

    export ORPHANED_DISK=orphaned-disk export UNUSED_DISK=unused-disk
  3. 2 つのディスクを作成します。

    gcloud compute disks create $ORPHANED_DISK --project=$PROJECT_ID --type=pd-standard --size=500GB --zone=$ZONE gcloud compute disks create $UNUSED_DISK --project=$PROJECT_ID --type=pd-standard --size=500GB --zone=$ZONE

    このラボでは リージョンを使用しますが、別のリージョンを選択することもできます。その場合、このラボの以降の操作で、指定したリージョンを一貫して参照してください。

  4. 2 つのディスクが作成されたことを確認します。

    gcloud compute disks list

    出力は次のようになります。

    NAME LOCATION LOCATION_SCOPE SIZE_GB TYPE STATUS orphaned-disk {{{project_0.default_zone | Zone}}} zone 500 pd-standard READY unused-disk {{{project_0.default_zone | Zone}}} zone 500 pd-standard READY

完了したタスクをテストする

[進行状況を確認] をクリックして、実行したタスクを確認します。永続ディスクが正常に作成された場合は、評価スコアが表示されます。

永続ディスクを作成する

タスク 3. VM の作成とディスクの検査

  1. Cloud Shell でインスタンスを作成します。

    gcloud compute instances create disk-instance \ --zone=$ZONE \ --machine-type=n1-standard-1 \ --disk=name=$ORPHANED_DISK,device-name=$ORPHANED_DISK,mode=rw,boot=no
  2. VM にアタッチされたディスクを検査します。

    gcloud compute disks describe $ORPHANED_DISK --zone=$ZONE --format=json | jq

    出力は次のようになります。

    { "creationTimestamp": "2019-06-12T12:21:25.546-07:00", "id": "7617542552306904666", "kind": "compute#disk", "labelFingerprint": "42WmSpB8rSM=", "lastAttachTimestamp": "2019-06-12T12:24:53.989-07:00", "name": "orphaned-disk", "physicalBlockSizeBytes": "4096", "selfLink": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/disks/orphaned-disk", "sizeGb": "500", "status": "READY", "type": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/diskTypes/pd-standard", "users": [ "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/instances/disk-instance" ], "zone": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}" }

    上のコードサンプルでは、次の点が重要になります。

    • users は、ディスクがアタッチされている VM を識別します。
    • lastAttachTimestamp は、ディスクが VM に最後にアタッチされた日時を識別します。

完了したタスクをテストする

[進行状況を確認] をクリックして、実行したタスクを確認します。永続ディスクを持つ VM インスタンスが正常に作成された場合は、評価スコアが表示されます。

永続ディスクを持つ VM インスタンスを作成する
  1. 孤立したディスクを VM から切断します。

    gcloud compute instances detach-disk disk-instance --device-name=$ORPHANED_DISK --zone=$ZONE
  2. 孤立したディスクを検査します。

    gcloud compute disks describe $ORPHANED_DISK --zone=$ZONE --format=json | jq

    出力は次のようになります。

    { "creationTimestamp": "2019-06-12T12:21:25.546-07:00", "id": "7617542552306904666", "kind": "compute#disk", "labelFingerprint": "42WmSpB8rSM=", "lastAttachTimestamp": "2019-06-12T12:24:53.989-07:00", "lastDetachTimestamp": "2019-06-12T12:34:56.040-07:00", "name": "orphaned-disk", "physicalBlockSizeBytes": "4096", "selfLink": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/disks/orphaned-disk", "sizeGb": "500", "status": "READY", "type": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}/diskTypes/pd-standard", "zone": "https://www.googleapis.com/compute/v1/projects/automating-cost-optimization/zones/{{{project_0.default_zone | Zone}}}" }

    上のコードサンプルでは、次の点が重要になります。

    • ディスクに対応する users が出力されていないのは、現在使用されていないためです。
    • ディスクが最後に切断されたとき(ディスクが最後に使用された日時)を示す lastDetachTimestamp エントリがあります。
    • lastAttachTimestamp フィールドはまだ残っています。

完了したタスクをテストする

[進行状況を確認] をクリックして、実行したタスクを確認します。孤立したディスクが VM から正常に切断された場合は、評価スコアが表示されます。

孤立したディスクを VM から切断する

タスク 4. Cloud Functions 関数のコードの確認

  1. Cloud Shell で、プロジェクト内のすべての永続ディスクを取得するコードの部分を出力します。

    cat $WORKDIR/unattached-pd/main.py | grep "(request)" -A 12

    出力は次のとおりです。

    def delete_unattached_pds(request): # get list of disks and iterate through it: disksRequest = compute.disks().aggregatedList(project=project) while disksRequest is not None: diskResponse = disksRequest.execute() for name, disks_scoped_list in diskResponse['items'].items(): if disks_scoped_list.get('warning') is None: # got disks for disk in disks_scoped_list['disks']: # iterate through disks diskName = disk['name'] diskZone = str((disk['zone'])).rsplit('/',1)[1] print (diskName) print (diskZone)

    この関数は aggregatedList メソッドを使用して、実行中の Google Cloud プロジェクト内のすべての永続ディスクを取得し、各ディスクに対して反復処理を実行します。

  2. lastAttachTimestamp フィールドをチェックしてこの値が存在しない場合はディスクを削除する、という処理を記述したコードの部分を出力します。

    cat $WORKDIR/unattached-pd/main.py | grep "handle never" -A 11

    出力は次のとおりです。

    # handle never attached disk - delete it # lastAttachedTimestamp is not present try: if disk["lastAttachTimestamp"] is None: print ("none!") except KeyError: print ("disk " + diskName + " was never attached - deleting") deleteRequest = compute.disks().delete(project=project, zone=diskZone, disk=diskName) deleteResponse = deleteRequest.execute() waitForZoneOperation(deleteResponse, project, diskZone) print ("disk " + diskName + " was deleted") continue

    この部分では、lastAttachTimestamp の値が存在しない場合、つまりそのディスクが一度も使用されていない場合、ディスクを削除します。

  3. ディスクが孤立している場合は経過時間を計算し、ディスクのスナップショットを作成して削除する、という処理を記述したコードの部分を出力します。

    cat $WORKDIR/unattached-pd/main.py | grep "handle detached" -A 32

    出力は次のとおりです。

    # handle detached disk - snapshot and delete # lastAttachTimestamp is present AND users is not present try: if disk['users'] is None and disk['lastDetachTimestamp'] is not None: print ("users is none") except KeyError: print ("disk " + diskName + " has no users and has been detached") detachTimestamp = dateutil.parser.parse(disk['lastDetachTimestamp']) detachedFor = pytz.utc.localize(datetime.utcnow()) - detachTimestamp print ("disk has been detached for " + str(detachedFor)) # update this for your preferred age if detachedFor.days > -1: # take a snapshot snapShotName = diskName + str(int(time.time())) print ("taking snapshot: " + snapShotName) snapshotBody = { "name": snapShotName } snapshotRequest = compute.disks().createSnapshot(project=project, zone=diskZone, disk=diskName, body=snapshotBody) snapshotResponse = snapshotRequest.execute() waitForZoneOperation(snapshotResponse, project, diskZone) print ("snapshot completed") # delete the disk print ("deleting disk " + diskName) deleteRequest = compute.disks().delete(project=project, zone=diskZone, disk=diskName) deleteResponse = deleteRequest.execute() waitForZoneOperation(deleteResponse, project, diskZone) print ("disk " + diskName + " was deleted") continue

    コードのこの部分は、ディスクに対応する users が出力されておらず、lastDetachTimestamp の値が存在する場合(現在はディスクが使用されていないが使用されたことがある場合)に使用されます。この場合、Cloud Functions 関数はディスクのスナップショットを作成してデータを保持してから、ディスクを削除します。

  4. Cloud Shell で [エディタを開く] をクリックして Cloud Shell エディタを開き、main.py ファイルを編集します。

注: プロンプトが表示されたら、[新しいウィンドウで開く] をクリックします。
  1. gsp648/unattached-pd に移動します。

  2. main.py を開きます。

  3. ファイルの 15 行目を編集して、automating-cost-optimization をプロジェクト ID(次のような文字列)に置き換えます。

    project = 'qwiklabs-gcp-b5dbc291a25a68db'
  4. [File] > [Save] をクリックしてファイルを保存します。

タスク 5. Cloud Functions 関数のデプロイ

  1. Cloud Shell で Cloud Functions 関数をデプロイします(必要に応じて [ターミナルを開く] をクリックします)。

    gcloud functions deploy delete_unattached_pds --trigger-http --runtime=python39 --region {{{project_0.default_region | Region}}} 注: 次の質問には「y」と入力します。Allow unauthenticated invocations of new function [delete_unattached_pds]? (y/N)? 注: Cloud Functions 関数のデプロイには 2~5 分ほどかかります。所要時間はリージョンによって異なります。
  2. Cloud Functions 関数のトリガー URL を環境変数として取得します。

    export FUNCTION_URL=$(gcloud functions describe delete_unattached_pds --format=json --region {{{project_0.default_region | Region}}} | jq -r '.httpsTrigger.url')

完了したタスクをテストする

[進行状況を確認] をクリックして、実行したタスクを確認します。Cloud Functions 関数が正常にデプロイされた場合は、評価スコアが表示されます。

Cloud Functions 関数をデプロイする

タスク 6. Cloud Functions 関数のスケジュール設定とテスト

  1. Cloud Scheduler を使用するために、Cloud Shell で App Engine アプリを作成します。
gcloud app create --region={{{project_0.startup_script.app_region | REGION}}}
  1. Cloud Shell で、毎日午前 2 時に Cloud Functions 関数を実行する Cloud Scheduler タスクを作成します。

    gcloud scheduler jobs create http unattached-pd-job \ --schedule="* 2 * * *" \ --uri=$FUNCTION_URL \ --location=$REGION

完了したタスクをテストする

[進行状況を確認] をクリックして、実行したタスクを確認します。Cloud Functions 関数を実行する Cloud Scheduler タスクが正常に作成された場合は、評価スコアが表示されます。

Cloud Functions 関数を実行する Cloud Scheduler タスクを作成する
  1. ジョブを手動でトリガーしてテストします。

    gcloud scheduler jobs run unattached-pd-job \ --location=$REGION
  2. 孤立したディスクのスナップショットが作成されたことを確認します。

    gcloud compute snapshots list

    出力は次のようになります。

    NAME DISK_SIZE_GB SRC_DISK STATUS orphaned-disk1560455894 500 {{{project_0.default_zone | Zone}}}/disks/orphaned-disk READY
  3. 未使用のディスクと孤立したディスクが削除されたことを確認します。

    gcloud compute disks list

    出力は次のようになります。

    NAME LOCATION LOCATION_SCOPE SIZE_GB TYPE STATUS disk-instance {{{project_0.default_zone | Zone}}} zone 10 pd-standard READY

完了したタスクをテストする

[進行状況を確認] をクリックして、実行したタスクを確認します。手動でトリガーしたジョブのテストが正常に完了した場合は、評価スコアが表示されます。

ジョブを手動でトリガーしてテストする

お疲れさまでした

このラボでは、次のタスクを実行しました。

  • 2 つの永続ディスクを作成しました。
  • ディスクの 1 つを使用する VM を作成しました。
  • ディスクを VM から切断しました。
  • Cloud Functions 関数のコードを確認しました。
  • Cloud Functions 関数をデプロイしました。
  • Cloud Scheduler ジョブを使用して Cloud Functions 関数をテストしました。

クエストを完了する

このセルフペース ラボは、「Optimizing your Google Cloud Costs」クエストの一部です。クエストとは学習プログラムを構成する一連のラボのことで、完了すると成果が認められてバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。このラボの修了後、こちらのクエストまたはこのラボが含まれるクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能なすべてのクエストについては、Google Cloud Skills Boost カタログをご覧ください。

次のラボを受講する

ネットワーク ティア - ネットワーク コストの最適化」に進んでクエストを続けるか、以下のおすすめのラボをご確認ください。

Google Cloud トレーニングと認定資格

Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。

マニュアルの最終更新日: 2023 年 10 月 20 日

ラボの最終テスト日: 2023 年 10 月 20 日

Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。