GSP648

概要
このラボでは、Cloud Functions と Cloud 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 コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。
左側の [ラボの詳細] ペインには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] ペインでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] ペインでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスにアクセスするには、ナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。
Cloud Shell をアクティブにする
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン
をクリックします。
-
ウィンドウで次の操作を行います。
- Cloud Shell 情報ウィンドウで操作を進めます。
- Cloud Shell が認証情報を使用して Google Cloud API を呼び出すことを承認します。
接続した時点で認証が完了しており、プロジェクトに各自の Project_ID、 が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
- [承認] をクリックします。
出力:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注: Google Cloud における gcloud
ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。
タスク 1. API の有効化とリポジトリのクローン作成
-
Cloud Shell で、Cloud Scheduler API を有効にします。
gcloud services enable cloudscheduler.googleapis.com
-
リポジトリのクローンを作成します。
gsutil cp -r gs://spls/gsp648 . && cd gsp648
-
環境変数を設定し、リポジトリ フォルダを $WORKDIR にします。このラボに関連するすべてのコマンドを $WORKDIR で実行します。
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null)
WORKDIR=$(pwd)
-
このラボのプロジェクト リージョンを設定します。
gcloud config set compute/region {{{project_0.default_region | "REGION"}}}
-
リージョンの変数を作成します。
export REGION={{{project_0.default_region | Region}}}
-
ゾーンの変数を作成します。
export ZONE={{{project_0.default_zone | Zone}}}
詳しくは、リージョンとゾーンのドキュメントをご確認ください。
注: 自分のマシンで gcloud
を実行する場合はセッション間で config 設定が維持されますが、Cloud Shell で実行する場合はセッションごと、または再接続するたびに設定する必要があります。
タスク 2. 永続ディスクの作成
-
Cloud Shell で unattached-pd ディレクトリに移動します。
cd $WORKDIR/unattached-pd
-
ディスクの名前を変数としてエクスポートします。
export ORPHANED_DISK=orphaned-disk
export UNUSED_DISK=unused-disk
-
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
このラボでは リージョンを使用しますが、別のリージョンを選択することもできます。その場合、このラボの以降の操作で、指定したリージョンを一貫して参照してください。
-
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 の作成とディスクの検査
-
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
-
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 インスタンスを作成する
-
孤立したディスクを VM から切断します。
gcloud compute instances detach-disk disk-instance --device-name=$ORPHANED_DISK --zone=$ZONE
-
孤立したディスクを検査します。
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 関数のコードの確認
-
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 プロジェクト内のすべての永続ディスクを取得し、各ディスクに対して反復処理を実行します。
-
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
の値が存在しない場合、つまりそのディスクが一度も使用されていない場合、ディスクを削除します。
-
ディスクが孤立している場合は経過時間を計算し、ディスクのスナップショットを作成して削除する、という処理を記述したコードの部分を出力します。
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 関数はディスクのスナップショットを作成してデータを保持してから、ディスクを削除します。
-
Cloud Shell で [エディタを開く] をクリックして Cloud Shell エディタを開き、main.py
ファイルを編集します。
注:
プロンプトが表示されたら、[新しいウィンドウで開く] をクリックします。
-
gsp648/unattached-pd
に移動します。
-
main.py
を開きます。
-
ファイルの 15 行目を編集して、automating-cost-optimization
をプロジェクト ID(次のような文字列)に置き換えます。
project = 'qwiklabs-gcp-b5dbc291a25a68db'
-
[File] > [Save] をクリックしてファイルを保存します。
タスク 5. Cloud Functions 関数のデプロイ
-
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 分ほどかかります。所要時間はリージョンによって異なります。
-
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 関数のスケジュール設定とテスト
- Cloud Scheduler を使用するために、Cloud Shell で App Engine アプリを作成します。
gcloud app create --region={{{project_0.startup_script.app_region | REGION}}}
-
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 タスクを作成する
-
ジョブを手動でトリガーしてテストします。
gcloud scheduler jobs run unattached-pd-job \
--location=$REGION
-
孤立したディスクのスナップショットが作成されたことを確認します。
gcloud compute snapshots list
出力は次のようになります。
NAME DISK_SIZE_GB SRC_DISK STATUS
orphaned-disk1560455894 500 {{{project_0.default_zone | Zone}}}/disks/orphaned-disk READY
-
未使用のディスクと孤立したディスクが削除されたことを確認します。
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 2025 Google LLC. All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。