blog_vmmanager.md
皆さん、こんにちは。入社4年目のクラウド技術統括部のR.Aです。
弊社では2020年からGoogle Cloud Platform (以下、GCP)を使ったシステム提案/開発に注力しており、各種イベントやGCPサービスを展開しております。
技術ブログでもGCP関連のネタを随時公開していきますので、是非ご活用下さい。
今回はVM Managerというサービスを使用して、GCE VMインスタンスのOS管理の自動化を試してみます。
具体的にどのようなことが起こるのか、注意事項など本ブログで紹介します。
より詳細な内容は、公式ドキュメントを参照してください。
目次
1. VM Managerでできること
2. 実際にやってみた
3. 躓いたところ
4. 本番環境で使用する上での注意事項を考えてみる
1. VM Managerでできること
サービス概要
LinuxやWindows (OS)を管理しやすくなるツールです。以下の3つのサービスに分かれています。(説明はわかりやすく、Linuxを想定して記載します。
# |
サービス |
説明 |
① |
OS Patch Management |
yumなどのパッケージ管理ツールを使用して、OS Configエージェントが代わりにパッチ適用(パッケージアップデート)してくれるサービス。 最大500台のインスタンス※1に対して同時にパッチ適用することが可能で、一度にパッチ適用する割合や台数を指定することができます。 $ yum update のオプション「--security」とか、除外するrpmパッケージとか設定できます。 ※1 1つのパッチジョブに対して500VMsを適用することができる。 |
② |
OS Inventory Management |
OSの詳細情報をOS Configエージェントから収集し、console上から確認できるサービス。 詳細情報は、OSバージョンからインストールされているrpmパッケージとそのバージョンなどです。 10分ごとに情報をOS ConfigエージェントからOS Configサービス(VM Manager)に転送しているそうです。 |
③ |
OS Configuration Management |
OSの状態を監視し、設定したポリシーに違反していたら、OS Configエージェントがポリシーに従った内容に状態を修正してくれるサービス。 60分ごとにポリシーをOS Configサービス(VM Manager)からOS Configエージェントに転送して、エージェントがポリシーを適用するか否かを判断しているそうです。 |
構成概要図
構成されている要素は以下の画像をご確認ください。
ちょっとした注意点ですが、インスタンスにOS Configエージェントを導入するだけでは設定が適用されず、インスタンス メタデータでVM Managerが有効化されているインスタンスに設定が適用される設計になっています。(Opsエージェントとは少し違いますね。

画像は公式ドキュメントから引用しています。
VM Managerのすごいところ
パッチ適用前後にスクリプトを設定できる!(OS Patch Management)
パッチ適用を適用する前と後にそれぞれ実行するスクリプトを1つずつ選択することが可能です。本番環境だとどうしてもパッチ適用前にサービス止めておきたいなどの要件が出てくると思います。
スクリプトにsystemctl stop/start httpdなど記載しておけば、パッチ適用前後に必要なサービスを停止/起動が実現できます。わざわざJP1だとか、cronを設定するとかせずにOS Patch Managementのパッチジョブで設定を完結することができます。(これ魅力!)
1つのパッチジョブですべてのOSに対応できる!(OS Patch Management)
1つのパッチジョブ(=OS Patch Managementで作成するリソース)にLinuxもWindowsもOS関係なく適用することができます。1つのパッチジョブにすべてのOSのパッチ適用設定をあらかじめ定義しておくことで、適用されたインスタンスのOSを判別して適している定義を適用してくれます。(WindowsなのにRHELのパッチが適用されちゃうとか、当たり前ですがないです。)
これもWindows用のスクリプト、Linux用のスクリプトで用意してくれているので、WindowsであればWindows、LinuxであればLinuxで用意したスクリプトが実行されます。
YAML書くだけでOS上の状態を維持してくれる!(OS Configuration Management)
OS設定はこうあってほしいなという内容をYAML形式で記載しておくことでその状態を維持してくれます。例えば、Aというサービスは動作していて欲しいという内容を記載しておくと、Aサービスが自動的に起動した状態になってくれるのです。(これ魅力!!!)
Aサービスが何らかの操作ミスで停止してしまっても、最大1時間後には起動した状態に戻ります。#これはterraformとかのIaC(=Infrastructure as Code)でなくて、k8sとかと同じCaD(=Configuration as Data)に相当するものだと思います。
2. 実際にやってみた
⓪準備
まずは簡単なところから。
1. VM Managerが使用できるように、OS Config Service APIを有効化する。

2. VM Managerの設定を適用するために、インスタンス メタデータに「enable-osconfig:true」と「enable-guest-attributes:true」を設定する。※2

※2 ここでは、プロジェクトに所属するすべてのインスタンスに適用されるメタデータの設定画面です。
インスタンス個別に適用する際は、インスタンスの編集からインスタンス個別のメタデータを編集して適用してください。
3. OS Config エージェントをインストールする。
新規作成したインスタンス(CentOS7)には初期構築時から自動で導入されていました。(2023年4月5日時点)
[root@rei-vmmanager-test-01 ~]# systemctl restart google-osconfig-agent
[root@rei-vmmanager-test-01 ~]# systemctl status google-osconfig-agent
● google-osconfig-agent.service - Google OSConfig Agent
Loaded: loaded (/usr/lib/systemd/system/google-osconfig-agent.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-04-05 07:10:58 UTC; 2s ago
Main PID: 1417 (google_osconfig)
CGroup: /system.slice/google-osconfig-agent.service
└─1417 /usr/bin/google_osconfig_agent
Apr 05 07:10:58 rei-vmmanager-test-01 systemd[1]: Stopped Google OSConfig Agent.
Apr 05 07:10:58 rei-vmmanager-test-01 systemd[1]: Started Google OSConfig Agent.
Apr 05 07:10:58 rei-vmmanager-test-01 OSConfigAgent[1417]: 2023-04-05T07:10:58.7935Z OSConfigAgent Info: ...ed.
Hint: Some lines were ellipsized, use -l to show in full.
[root@rei-vmmanager-test-01 ~]#
インストール方法は
公式ドキュメントで確認してください。
環境
instance name: rei-vmmanager-test-01
zone: asia-northeast1-a
os: centos 7
natIP: xx.xx.xx.xx(外部IPアドレスを付与しています。)
インスタンス構築しただけなので、Apacheは入っていないです。
[root@rei-vmmanager-test-01 ~]# rpm -qa | grep httpd
[root@rei-vmmanager-test-01 ~]# httpd -v
-bash: httpd: command not found
[root@rei-vmmanager-test-01 ~]# ll /etc/httpd
ls: cannot access /etc/httpd: No such file or directory
[root@rei-vmmanager-test-01 ~]# ll /etc/ | grep http
[root@rei-vmmanager-test-01 ~]#
OS Config APIのデータアクセス監査ログを有効化しています。
①OS Patch Management
目標:パッチジョブが動くことと、スクリプトが実行されること
1. パッチジョブ作成する。

2. 検証用のスクリプトを作成する。
●パッチ適用前用スクリプト
#!/bin/bash
logger -p info "$(date): Start applying patch!"
logger -p info "$(date): This is a test log message generated by the script!"
●パッチ適用後用スクリプト
#!/bin/bash
logger -p info "$(date): This is a test log message generated by the script!"
logger -p info "$(date): Patch application completed!"
●実行結果
■ 開始
スケジュールした時間になると「google_osconfig」が実行されました。

以下のログが出力されます。
パッチ適用前に、start.shスクリプトが実行されていること(上から2,3行目)がわかります。
Apr 5 08:20:03 rei-vmmanager-test-01 OSConfigAgent[1417]: 2023-04-05T08:20:03.7050Z OSConfigAgent Info: Beginning ExecStepTask
Apr 5 08:20:03 rei-vmmanager-test-01 root: Wed Apr 5 08:20:03 UTC 2023: Start applying patch!
Apr 5 08:20:03 rei-vmmanager-test-01 root: Wed Apr 5 08:20:03 UTC 2023: This is a test log message generated by the script!
Apr 5 08:20:03 rei-vmmanager-test-01 OSConfigAgent[1417]: 2023-04-05T08:20:03.9003Z OSConfigAgent Info: Command exit code: 0, out:
Apr 5 08:20:04 rei-vmmanager-test-01 OSConfigAgent[1417]: 2023-04-05T08:20:04.0117Z OSConfigAgent Info: Successfully completed ApplyConfigTask
Apr 5 08:20:35 rei-vmmanager-test-01 OSConfigAgent[1417]: 2023-04-05T08:20:35.7877Z OSConfigAgent Info: Beginning ApplyPatchesTask
Apr 5 08:20:36 rei-vmmanager-test-01 OSConfigAgent[1417]: 2023-04-05T08:20:36.0760Z OSConfigAgent Info: System indicates a reboot is not required.
Apr 5 08:20:43 rei-vmmanager-test-01 OSConfigAgent[1417]: 2023-04-05T08:20:43.9660Z OSConfigAgent Info: Updating 15 packages:
■ 途中
その後、パッチ適用に必要な「yum」などのプロセスが実行されています。

途中はyum updateのログがたくさん出力されていました。

今回のパッチジョブ設定だとカーネルもupdate対象なことと再起動が必要な場合は再起動するというパッチジョブ設定をしているため、インスタンスの再起動も実行されました。

■ 完了

パッチ適用が完了した時間のログです。パッチ適用完了後に、end.shスクリプトが実行されていること(下から3,4行目)がわかります。
Apr 5 08:47:39 rei-vmmanager-test-01 systemd: Startup finished in 825ms (kernel) + 1.153s (initrd) + 6.323s (userspace) = 8.302s.
Apr 5 08:47:41 rei-vmmanager-test-01 chronyd[450]: Selected source 169.254.169.254
Apr 5 08:47:42 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T08:47:42.7546Z OSConfigAgent Info: No packages to update.
Apr 5 08:47:43 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T08:47:43.0213Z OSConfigAgent Info: System indicates a reboot is not required.
Apr 5 08:47:43 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T08:47:43.3297Z OSConfigAgent Info: Successfully completed ApplyPatchesTask
Apr 5 08:48:08 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T08:48:08.6093Z OSConfigAgent Info: Beginning ExecStepTask
Apr 5 08:48:08 rei-vmmanager-test-01 root: Wed Apr 5 08:48:08 UTC 2023: This is a test log message generated by the script!
Apr 5 08:48:08 rei-vmmanager-test-01 root: Wed Apr 5 08:48:08 UTC 2023: Patch application completed!
Apr 5 08:48:08 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T08:48:08.8731Z OSConfigAgent Info: Command exit code: 0, out:
Apr 5 08:48:08 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T08:48:08.9945Z OSConfigAgent Info: Successfully completed ApplyConfigTask
Cloud logging※3 からも確認できます。

※3 本環境はOpsエージェントを導入/設定していないため、OS上の/var/log/messagesはCloud Loggingから確認できません。
②OS Inventory Management
GUIで確認しました。問題があるインスタンスは更新可能なパッケージとして表示されます。

CLIだと他のサービス(Cloud Asset InventoryやSecurity Command Centerとか)とも連携してたくさんの情報を取得できるようです。
③ OS Configuration Management
目標:OSポリシー(apacheのインストールと起動)が適用されること
1. OSポリシー(YAMLファイル)を作成する。
●install.yaml

id: apache-install-policy
description: apache install os policy
mode: ENFORCEMENT
resourceGroups:
- resources:
- id: install-pkg
pkg:
desiredState: INSTALLED
yum:
name: httpd
- id: install-script
exec:
validate:
script:
if rpm -qa --queryformat '%{NAME}\n' | grep -qw httpd; then exit 100; else exit 101; fi
interpreter: SHELL
enforce:
script:
sudo yum remove -y httpd || true; sudo yum install -y httpd && exit 100
interpreter: SHELL
allowNoResourceGroupMatch: false
●start.yaml
id: apache-always-up-policy
mode: ENFORCEMENT
resourceGroups:
- resources:
- id: running-script
exec:
validate:
script:
if sudo systemctl is-active --quiet httpd; then exit 100; else exit 101; fi
interpreter: SHELL
enforce:
script:
sudo systemctl start httpd && sudo systemctl enable httpd && exit 100
interpreter: SHELL
allowNoResourceGroupMatch: false
2.
OSポリシーを割り当てる。
●実行結果
■ OSポリシー適用前(=⓪準備と同じlogです)
[root@rei-vmmanager-test-01 ~]# rpm -qa | grep httpd
[root@rei-vmmanager-test-01 ~]# httpd -v
-bash: httpd: command not found
[root@rei-vmmanager-test-01 ~]# ll /etc/httpd
ls: cannot access /etc/httpd: No such file or directory
[root@rei-vmmanager-test-01 ~]#
[root@rei-vmmanager-test-01 ~]# netstat -an | grep :80
tcp 0 0 10.10.10.27:51130 169.254.169.254:80 TIME_WAIT
tcp 0 0 10.10.10.27:50832 169.254.169.254:80 ESTABLISHED
tcp 0 0 10.10.10.27:50838 169.254.169.254:80 ESTABLISHED
[root@rei-vmmanager-test-01 ~]#
■ OSポリシー適用後
OSポリシーが適用され、Apacheのインストールと起動がされています。
[rei_ando@rei-vmmanager-test-01 ~]$ rpm -qa | grep httpd
httpd-tools-2.4.6-98.el7.centos.6.x86_64
httpd-2.4.6-98.el7.centos.6.x86_64
[rei_ando@rei-vmmanager-test-01 ~]$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Jan 27 2023 17:36:29
[rei_ando@rei-vmmanager-test-01 ~]$ ll /etc/httpd
total 0
drwxr-xr-x. 2 root root 37 Apr 5 09:15 conf
drwxr-xr-x. 2 root root 82 Apr 5 09:15 conf.d
drwxr-xr-x. 2 root root 146 Apr 5 09:15 conf.modules.d
lrwxrwxrwx. 1 root root 19 Apr 5 09:15 logs -> ../../var/log/httpd
lrwxrwxrwx. 1 root root 29 Apr 5 09:15 modules -> ../../usr/lib64/httpd/modules
lrwxrwxrwx. 1 root root 10 Apr 5 09:15 run -> /run/httpd
[rei_ando@rei-vmmanager-test-01 ~]$ netstat -an | grep :80
tcp 0 0 10.10.10.27:50832 169.254.169.254:80 ESTABLISHED
tcp 0 0 10.10.10.27:50838 169.254.169.254:80 ESTABLISHED
tcp6 0 0 :::80 :::* LISTEN
[rei_ando@rei-vmmanager-test-01 ~]$
[rei_ando@rei-vmmanager-test-01 ~]$ curl http://localhost:80
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Apache HTTP Server Test Page powered by CentOS</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
また、/var/log/messagesにOSConfigAgentが実行した内容が確認できした。
Apr 5 09:15:29 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T09:15:29.2325Z OSConfigAgent Info: Beginning ApplyConfigTask.
Apr 5 09:15:29 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T09:15:29.5271Z OSConfigAgent Info: Executing policy "apache-install-policy"
Apr 5 09:15:29 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T09:15:29.5283Z OSConfigAgent Info: Validate: resource "install-pkg" validation successful.
Apr 5 09:15:30 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T09:15:30.2170Z OSConfigAgent Info: Check state: resource "install-pkg" state is NON_COMPLIANT.
Apr 5 09:15:30 rei-vmmanager-test-01 OSConfigAgent[829]: 2023-04-05T09:15:30.2182Z OSConfigAgent Info: Installing yum package "httpd"
Apacheが起動しているのでWebブラウザからApacheテスト用Webサイトが確認できます。
検証:OSポリシーに違反する設定変更したら自動で戻してくれる??
1. 手動でhttpdを停止する。(=OSポリシーの違反行為)

[root@rei-vmmanager-test-01 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2023-04-06 01:22:26 UTC; 2h 15min ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 1819 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─1819 /usr/sbin/httpd -DFOREGROUND
├─1820 /usr/sbin/httpd -DFOREGROUND
├─1821 /usr/sbin/httpd -DFOREGROUND
├─1822 /usr/sbin/httpd -DFOREGROUND
├─1823 /usr/sbin/httpd -DFOREGROUND
└─1824 /usr/sbin/httpd -DFOREGROUND
Apr 06 01:22:26 rei-vmmanager-test-01 systemd[1]: Starting The Apache HTTP Server...
Apr 06 01:22:26 rei-vmmanager-test-01 systemd[1]: Started The Apache HTTP Server.
[root@rei-vmmanager-test-01 ~]# systemctl disable httpd && systemctl stop httpd
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
[root@rei-vmmanager-test-01 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:httpd(8)
man:apachectl(8)
Apr 06 00:25:22 rei-vmmanager-test-01 systemd[1]: Stopping The Apache HTTP Server...
Apr 06 00:25:23 rei-vmmanager-test-01 systemd[1]: Stopped The Apache HTTP Server.
Apr 06 00:25:44 rei-vmmanager-test-01 systemd[1]: Starting The Apache HTTP Server...
Apr 06 00:25:44 rei-vmmanager-test-01 systemd[1]: Started The Apache HTTP Server.
Apr 06 00:28:19 rei-vmmanager-test-01 systemd[1]: Stopping The Apache HTTP Server...
Apr 06 00:28:20 rei-vmmanager-test-01 systemd[1]: Stopped The Apache HTTP Server.
Apr 06 01:22:26 rei-vmmanager-test-01 systemd[1]: Starting The Apache HTTP Server...
Apr 06 01:22:26 rei-vmmanager-test-01 systemd[1]: Started The Apache HTTP Server.
Apr 06 03:37:51 rei-vmmanager-test-01 systemd[1]: Stopping The Apache HTTP Server...
Apr 06 03:37:52 rei-vmmanager-test-01 systemd[1]: Stopped The Apache HTTP Server.
[root@rei-vmmanager-test-01 ~]#
念のため、ログでも確認します。
/var/log/messagesでもちゃんと止まっているログが出てます。
Apr 6 03:37:50 rei-vmmanager-test-01 systemd: Reloading.
Apr 6 03:37:51 rei-vmmanager-test-01 systemd: Stopping The Apache HTTP Server...
Apr 6 03:37:52 rei-vmmanager-test-01 systemd: Stopped The Apache HTTP Server.
2. OSポリシーが適用されるまで待ってみる。
3. OSポリシーが適用されたか確認する。

httpdのステータスが起動されています。(最終時刻が更新されてる)
[root@rei-vmmanager-test-01 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2023-04-06 04:23:59 UTC; 2min 0s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 2751 (httpd)
Status: "Total requests: 10; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─2751 /usr/sbin/httpd -DFOREGROUND
├─2752 /usr/sbin/httpd -DFOREGROUND
├─2753 /usr/sbin/httpd -DFOREGROUND
├─2754 /usr/sbin/httpd -DFOREGROUND
├─2756 /usr/sbin/httpd -DFOREGROUND
├─2813 /usr/sbin/httpd -DFOREGROUND
├─2814 /usr/sbin/httpd -DFOREGROUND
├─2815 /usr/sbin/httpd -DFOREGROUND
├─2816 /usr/sbin/httpd -DFOREGROUND
├─2817 /usr/sbin/httpd -DFOREGROUND
└─2818 /usr/sbin/httpd -DFOREGROUND
Apr 06 04:23:59 rei-vmmanager-test-01 systemd[1]: Starting The Apache HTTP Server...
Apr 06 04:23:59 rei-vmmanager-test-01 systemd[1]: Started The Apache HTTP Server.
[root@rei-vmmanager-test-01 ~]#
同じようにログでも確認してみます。
/var/log/messagesからOSConfigAgentさんが OSポリシーを適用していることが確認できた。
Apr 6 04:23:58 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:58.0528Z OSConfigAgent Info: Beginning ApplyConfigTask.
Apr 6 04:23:58 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:58.3548Z OSConfigAgent Info: Executing policy "apache-install-policy"
Apr 6 04:23:58 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:58.3562Z OSConfigAgent Info: Validate: resource "install-pkg" validation successful.
Apr 6 04:23:59 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:58.9993Z OSConfigAgent Info: Check state: resource "install-pkg" state is COMPLIANT.
Apr 6 04:23:59 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:59.0010Z OSConfigAgent Info: Validate: resource "install-script" validation successful.
Apr 6 04:23:59 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:59.6469Z OSConfigAgent Info: Check state: resource "install-script" state is COMPLIANT.
Apr 6 04:23:59 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:59.6471Z OSConfigAgent Info: Executing policy "apache-always-up-policy"
Apr 6 04:23:59 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:59.6476Z OSConfigAgent Info: Validate: resource "running-script" validation successful.
Apr 6 04:23:59 rei-vmmanager-test-01 systemd: Started Session c11 of user root.
Apr 6 04:23:59 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:59.7506Z OSConfigAgent Info: Check state: resource "running-script" state is NON_COMPLIANT.
Apr 6 04:23:59 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:23:59.7507Z OSConfigAgent Info: Running "Enforce" for ExecResource.
Apr 6 04:23:59 rei-vmmanager-test-01 systemd: Started Session c12 of user root.
Apr 6 04:23:59 rei-vmmanager-test-01 systemd: Starting The Apache HTTP Server...
Apr 6 04:23:59 rei-vmmanager-test-01 systemd: Started The Apache HTTP Server.
Apr 6 04:23:59 rei-vmmanager-test-01 systemd: Started Session c13 of user root.
Apr 6 04:24:00 rei-vmmanager-test-01 systemd: Reloading.
Apr 6 04:24:00 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:24:00.1815Z OSConfigAgent Info: Enforce state: resource "running-script" enforcement successful.
Apr 6 04:24:00 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:24:00.1816Z OSConfigAgent Info: Check state post enforcement: resource "install-pkg" state is COMPLIANT.
Apr 6 04:24:00 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:24:00.1817Z OSConfigAgent Info: Policy "apache-install-policy" resource "install-pkg" state: COMPLIANT
Apr 6 04:24:00 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:24:00.8353Z OSConfigAgent Info: Check state post enforcement: resource "install-script" state is COMPLIANT.
Apr 6 04:24:00 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:24:00.8354Z OSConfigAgent Info: Policy "apache-install-policy" resource "install-script" state: COMPLIANT
Apr 6 04:24:00 rei-vmmanager-test-01 systemd: Started Session c14 of user root.
Apr 6 04:24:00 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:24:00.8768Z OSConfigAgent Info: Check state post enforcement: resource "running-script" state is COMPLIANT.
Apr 6 04:24:00 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:24:00.8769Z OSConfigAgent Info: Policy "apache-always-up-policy" resource "running-script" state: COMPLIANT
Apr 6 04:24:00 rei-vmmanager-test-01 OSConfigAgent[827]: 2023-04-06T04:24:00.9821Z OSConfigAgent Info: Successfully completed ApplyConfigTask
Loggingからも確認できます。
install.yamlポリシーのログ
start.yamlポリシーのログ
もちろんブラウザからもapacheのテスト用Webサイトが見られます。
検証:OSポリシーを適用外すとどうなるの??
OSポリシーが適用されているサーバをOSポリシーのフィルターを使用して適用させないようにしてみました。

この時、OSポリシーによってインストールされたApacheのパッケージやApacheのステータスはどうなるのでしょうか。
詳細は以下を確認すればわかりますが、インストールされたままの状態を保ちました。

[root@rei-vmmanager-test-01 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2023-04-06 05:24:31 UTC; 37min ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 4329 (httpd)
Status: "Total requests: 64; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─4329 /usr/sbin/httpd -DFOREGROUND
├─4330 /usr/sbin/httpd -DFOREGROUND
├─4331 /usr/sbin/httpd -DFOREGROUND
├─4332 /usr/sbin/httpd -DFOREGROUND
├─4333 /usr/sbin/httpd -DFOREGROUND
├─4334 /usr/sbin/httpd -DFOREGROUND
├─4390 /usr/sbin/httpd -DFOREGROUND
├─4391 /usr/sbin/httpd -DFOREGROUND
└─4392 /usr/sbin/httpd -DFOREGROUND
Apr 06 05:24:30 rei-vmmanager-test-01 systemd[1]: Starting The Apache HTTP Server...
Apr 06 05:24:31 rei-vmmanager-test-01 systemd[1]: Started The Apache HTTP Server.
[root@rei-vmmanager-test-01 ~]# rpm -qa | grep httpd
httpd-tools-2.4.6-98.el7.centos.6.x86_64
httpd-2.4.6-98.el7.centos.6.x86_64
[root@rei-vmmanager-test-01 ~]# curl http://localhost:80
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Apache HTTP Server Test Page powered by CentOS</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3. 躓いたところ
OS ConfigエージェントにErrorログが出力されてる
事象:systemctl status google-osconfig-agentを実行すると、activeで起動しているようですが、以下のエラーが出力されていました。
Error response: Guest attributes endpoint access...
原因:メタデータに「enable-guest-attributes:true」を設定していない。
対応:上を設定してあげれば、エラーなく起動しました。
4. 本番環境で使用する上での注意事項を考えてみる
費用
お金は気にしますよねぇ。驚くことにVM Managerは毎月の無料枠が存在します!!公式ドキュメントを確認する限り、インスタンスが100台未満であれば毎月無料になりそうです。
100台を超えて以下の2点がすべて満たされるときに101台以降のインスタンスに対して$0.003/時間の課金が発生します。
1. VM Managerが設定していること
2. OS Config エージェントがOS Config サービスと通信していること
#VM Mangerを有効化しているインスタンスが起動している時間に発生するということになりますね。
詳細は、
公式ドキュメントを参照してください。
お客様に「OS管理したいけど、高い!!」って言われたときにどう回避するかこの場で考えときます、、!!
費用削減案を2つ考えました。
1. 絶対にOS管理したいインスタンスだけに適用しておく。
プロジェクト全体のメタデータでVM Manager有効化する方法がすべてのインスタンスに適用されるので楽ですが、インスタンス個別のメタデータでVM Managerを有効化することで必要なインスタンスのみに適用できます。
2. 必要なタイミングだけ有効化する。
それぞれのサービスで必要なタイミングとか考えてみます。
「Scheduler + Pub/Sub + Functions」構成でインスタンスメタデータを更新します。(サーバレスで定期実行といったらの定番構成ですね)
# |
サービス |
説明 |
1 |
OS Patch Management |
環境を運用するうえでパッチ適用するスケジュールは決まっていると思うので、その前後に定期実行出来そうです。 また、手動でSchedulerを動かすこともできるので不意なタイミングでも実行できます。 |
2 |
OS Inventory Management |
OSの詳細情報を見たい時に手動でSchedulerを実行すればよさそうです。 また、無効化しても有効化していた最終の状態を表示してくれるので、そこまで困らなそうです。 #有効化されている間は10分ごとに情報を更新します。(ConfigAgent→ConfigService) |
3 |
OS Configuration Management |
このサービスに関しては、必要なタイミングだけ有効化するって行為自体がこのサービスの目的に反している気がします。 これを使用する場合は常に有効化し、OSの状態がポリシーに違反していないか確認する必要がありそうです。 #有効化されている間は60分ごとにポリシーを適用します。(ConfigService→ConfigAgent) |
ネットワーク到達性
OS Patch Management と OS Configuration Managementは、インスタンスがパッケージのソースとリポジトリにアクセスできる必要があります。
外部IPアドレスを持たない場合は、通常のリポジトリにアクセスできません。
以下のどちらかの対応が必要になりそうです。
1. NATゲートウェイを使用して通常のリポジトリにアクセスする
2. 限定公開のGoogleアクセス有効化&Artifact Registry Yum Repositoryを構成する
#お客様の本番環境になると基本的にインターネットにでられることは少ないと思うので、特にArtifact Registryも検証したいですね。
監視
OS ConfigエージェントがVM上で動作していないと、パッチ適用だったりポリシー違反して否かチェックしたりなど何もできなくなってしまいます。
そのため、OS Configエージェントが動作しているか監視(死活監視)する必要があります。
Cloud Monitoringを使用して通知を行うことを前提に、下記の2つの監視方法を考えました。
1. パッチジョブの状態が判定できる「VM instance patch state」メトリクスを使用してFAILEDになったら通知する。
2. Opsエージェントから転送されたメトリクスを使用してプロセスが動作しなくなったら通知する。
それぞれのサービスでどちらを使用した方がよいかを表で示します。使用したいサービスに合わせて、方法を検討するのがよさそうですね。
# |
サービス |
監視方法 |
備考 |
1 |
OS Patch Management |
1. |
公式ドキュメントにも書いてあります。 |
2 |
OS Inventory Management |
2. |
Opsエージェントの導入/設定の必要がある。 |
3 |
OS Configuration Management |
2. |
Opsエージェントの導入/設定の必要がある。 |
Windowsの場合は、、、
Windows の自動更新と OS Patch Management サービス間の競合をさせないように、Windows OSの自動更新を無効化することが推奨されています。
おわりに
構築の自動化ではなく管理の自動化をするVM Managerを触ってみました。
個人的には非常に魅力的なサービスに思えました。
OS設定の自動化にはAnsibleを使用することが多いと思いますが、OS Configuration Managementを使用することで構築に加え、状態を維持(管理)してくれるのが魅力だと感じます。
また、OS Patch Managementを使用することでパッチ適用を自動化できるため、作業ミスの撲滅、アップデート不要なパッケージのアップデートをしてしまうことによる手戻りやパッチを定期的に実施するエンジニアを用意しなくてもよいことがコスト削減につながります。
ただ1点残念に思える点は、OS Configuration ManagementのOSポリシー適用が60分ごとであるため、最大60分間は期待していない状態になってしまうことです。
もちろん対応策として、Cloud Monitoringのカスタムメトリクスなどの指標をもとにアラートポリシーで通知が可能なので、OS Configuration Managementとあわせて監視設計も必要になりそうです。
IaaS領域の自動化に興味がある方は是非VM Managerをお試しください。
【GCP】VM Managerがすごい。