Cloud Functionsを使用してCompute Engineのマシンイメージを自動で削除する

記事タイトルとURLをコピーする

G-gen の藤岡です。当記事では、 Google Cloud(旧称 GCP)で定期的に取得した Compute Engine のマシンイメージを自動で古いイメージから削除する方法を紹介します。

はじめに

以下の記事では Compute Engine API のクライアントライブラリを使うことで、マシンイメージの取得を自動化しています。 blog.g-gen.co.jp

上記の記事にあるように、マシンイメージが増えていくとその分料金が発生します。そのため、定期的にマシンイメージを削除することで料金の節約につながります。

そこで当記事では、上記の記事とは逆に machineImages.delete メソッドを使いマシンイメージを自動で削除する方法を紹介します。

構成図

構成はマシンイメージの自動取得の記事と同様です。設定方法も基本的には同様ですが、当記事では Cloud Functions の第 2 世代を使用します。

構成図

Pub/Subトリガーの Cloud Functions を作成

コンソールからリソースを作成していきます。
1. Cloud Functions を作成します。以下のように 基本 項目を入力し、 トリガーを追加 をクリックします。

関数の作成-1
2. トピックを作成する をクリックします。
関数の作成-2
3. Pub/Subトピックの作成画面が表示されるので、トピック ID を入力して 作成 をクリックします。
関数の作成-3
4. Eventarc トリガーの画面が表示されるので、トリガーを保存 をクリックします。
関数の作成-4
5. ファンクションの作成画面に戻るので、次へ をクリックします。
関数の作成-5
6. コードの編集画面に進むので、以下の設定をし デプロイ をクリックします。

  • ランタイム:Python 3.11
  • エントリポイント:delete_machine_image
# main.py
from google.cloud.compute_v1.services.machine_images import MachineImagesClient
from datetime import datetime, timezone, timedelta
  
# マシンイメージ取得対象インスタンスの情報
project_id = 'プロジェクトID'  # 対象インスタンスが存在するプロジェクトID
instance_name = 'インスタンス名'  # 対象インスタンスの名前
  
def delete_machine_image(event, context):
    client = MachineImagesClient()
  
    # 2日前の日付を取得 (UTC→JSTの変換もここで実施)
    two_days_ago = datetime.now(timezone(timedelta(hours=9))) - timedelta(days=2)
    deletion_date = two_days_ago.strftime('%Y-%m-%d')
  
    # 削除対象のマシンイメージの名前を設定
    image_name = f'mimg-{instance_name}-{deletion_date}'
  
    # マシンイメージの削除
    try:
        client.delete(project=project_id, machine_image=image_name)
        print(f"Deleted machine image: {image_name}")
    except Exception as e:
        print(f"Error deleting machine image {image_name}: {e}")
# requirements.txt
google-cloud-compute==1.14.1

Cloud Scheduler ジョブの設定

Pub/Sub トピックへ定期的にメッセージを送るジョブを作成します。
1. Cloud Scheduler のコンソール画面から ジョブを作成 をクリックします。
2. ジョブの作成画面で各項目を設定します。 今回は日次実行のため 0 0 * * * を設定しています。各項目の入力をし 作成 をクリックします。

ジョブの作成

考慮事項

当記事では簡易的な設定をしているため、実際に運用する際には以下の部分なども考慮して設定してください。

  • サービスアカウント
    Cloud Functions ではデフォルトのサービスアカウントを使っているため、編集者(roles/editor) 権限が付与されています。最小限の権限の原則に従って適切な権限が付与されたサービスアカウントを使用してください。

  • Cloud Functions のメモリと CPU
    関数の実行に必要なメモリや CPU は環境に応じて適宜設定してください。

  • Cloud Functions のコード
    当記事では、コード内でプロジェクト ID やインスタンス名を記載していますが、環境変数にすることで、設定とコードを分離でき管理が容易になります。

  • 失敗時の通知
    何らかの理由で関数の実行が失敗した場合に E メールや Slack などに通知を発報するよう、ログベースのアラートを設定することなども検討してください。

アーキテクチャ例

当記事のマシンイメージの自動削除とマシンイメージの自動取得を組み合わせたアーキテクチャ例は以下です。
Cloud Pub/Sub を挟むことで疎結合アーキテクチャとなり、拡張性や保守性、可用性の向上が見込めます。

アーキテクチャ例

疎結合アーキテクチャに関する解説は以下の記事をご参照ください。

blog.g-gen.co.jp

藤岡 里美 (記事一覧)

クラウドソリューション部

数年前までチキン売ったりドレスショップで働いてました!2022年9月 G-gen にジョイン。ハイキューの映画を4回は見に行きたい。

Google Cloud All Certifications Engineer / Google Cloud Partner Top Engineer 2024