本稿は Sansan Advent Calendar 2019 の20日目の記事です。
今年は GCP に触れることが多い一年でした。GCP に触れてきた中で気になるアップデートがあったので紹介をします。
OS Inventory Management とは
OS Inventory Management は GCE インスタンスに関する OS やパッケージ情報を収集し、取得することができるサービスです。2019年7月8日にBetaがリリースされ、2019年10月2日に GA になりました。
AWS だと AWS System Manager インベントリ という機能がありますがそれと同じようなものですが、マネジメントコンソールはなく、操作はコマンドラインのみとなります。
OS Inventory Management によって収集された情報は GCE メタデータのゲスト属性に保存され、以下の用途によって利用されることを想定されています。
- 特定のバージョンのオペレーティングシステムを実行している仮想マシンを識別する
- VMインスタンスにインストールされているパッケージを表示する
- 各VMインスタンスで利用可能なパッケージ更新のリストを取得する
- VMインスタンスの不足しているパッケージ、更新、またはパッチ情報を取得する
OS Inventory Management の有効化
実際に試してみましょう。OS Inventory Management を使用するには、メタデータで有効化する必要があります。
GCE インスタンスかプロジェクトのメタデータに以下の値を設定します。
enable-guest-attributes
:TRUE
enable-os-inventory
:TRUE
GCE インスタンスのメタデータに設定するとその GCE インスタンスのみ有効化され、プロジェクト全体のメタデータに設定するとプロジェクト内すべての GCE インスタンスで有効になります。
今回はプロジェクト全体のメタデータで設定します。
GCE インスタンスの作成、OS 構成エージェントのインストール
イベントリを取得するための GCE インスタンスを作成します。今回は Linux(Ubuntu 18)と Windows Server 2019 の2つを作ります。
Cloud Shell を立ち上げ、以下のようなコマンドを実行してインスタンスを作ります。また、起動時に OS 構成エージェントをインストールするように起動スクリプトを仕込みます。
$ gcloud config set project [PROJECT] # デフォルトのサービスアカウントを取得 $ SA_EMAIL=$(gcloud iam service-accounts list \ --filter="displayName:Compute Engine default service account" \ --format='value(email)') # Linux インスタンス ## 起動スクリプト $ cat << EOF > startup_linux.sh #! /bin/bash sudo su -c "echo 'deb http://packages.cloud.google.com/apt google-osconfig-agent-stretch-stable main' > \ /etc/apt/sources.list.d/google-osconfig-agent.list" curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - sudo apt-get update sudo apt-get install -y google-osconfig-agent EOF $ gcloud beta compute instances create linux-test \ --zone=us-central1-a \ --machine-type=n1-standard-1 \ --subnet=default \ --network-tier=PREMIUM \ --maintenance-policy=MIGRATE \ --service-account=$SA_EMAIL \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --image=ubuntu-1804-bionic-v20191211 \ --image-project=ubuntu-os-cloud \ --boot-disk-size=10GB \ --boot-disk-type=pd-standard \ --boot-disk-device-name=linux-test \ --metadata-from-file=startup-script=startup_linux.sh # Windows インスタンス $ gcloud beta compute instances create windows-test \ --zone=us-central1-a \ --machine-type=n1-standard-1 \ --subnet=default \ --network-tier=PREMIUM \ --maintenance-policy=MIGRATE \ --service-account=$SA_EMAIL \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --image=windows-server-2019-dc-core-v20191210 \ --image-project=windows-cloud \ --boot-disk-size=32GB \ --boot-disk-type=pd-standard \ --boot-disk-device-name=windows-test \ --metadata windows-startup-script-ps1="googet -noconfirm install google-osconfig-agent"
OS 構成エージェントが正常にインストールされていると、次のコマンドでインスタンス一覧に表示されます。
$ gcloud compute instances os-inventory list-instances NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS linux-test us-central1-a n1-standard-1 10.128.0.4 34.68.43.177 RUNNING windows-test us-central1-a n1-standard-1 10.128.0.5 34.67.54.215 RUNNING
イベントリデータを表示してみる
次のコマンドを実行すると、OS情報とインストールされているパッケージ情報などが出力されます。
取得できる情報はドキュメントを参照してください。
$ gcloud compute instances os-inventory describe linux-test --zone us-central1-a $ gcloud compute instances os-inventory describe windows-test --zone us-central1-a
このように表示されます。
Linux サーバ
Windows サーバ
このままでも良いのですが、加工しやすいようにアップデートできるパッケージ一覧を取得してみましょう。--format
オプションを駆使することで任意の情報を取得できます。
$ gcloud compute instances os-inventory describe linux-test --zone us-central1-a \ --format "json(PackageUpdates.apt[].Name,PackageUpdates.apt[].Version)" { "PackageUpdates": { "apt": [ { "Name": "libdevmapper1.02.1", "Version": "2:1.02.145-4.1ubuntu3.18.04.2" }, { "Name": "libdevmapper-event1.02.1", "Version": "2:1.02.145-4.1ubuntu3.18.04.2" }, ...(省略)... { "Name": "open-vm-tools", "Version": "2:11.0.1-2ubuntu0.18.04.2" } ] } } $ gcloud compute instances os-inventory describe windows-test --zone us-central1-a \ --format "json(PackageUpdates.googet[].Name,PackageUpdates.googet[].Version)" { "PackageUpdates": { "googet": [ { "Name": "google-compute-engine-diagnostics", "Version": "1.1.0@0" } ] } }
まとめ
OSやパッケージ情報を収集する OS Inventory Management について紹介しました。API 経由でパッケージ一覧を取得できるため、外部システムとの連携ができます。例えば、脆弱性管理などに使えそうです。
まだ、コマンドラインでしか操作できないのでマネジメントコンソールでパッケージ一覧が表示されるようになるとさらに便利になりそうですね。