これまでGoogle Cloud Platform(GCP)を利用しているのですが、Googleから「あなたがGoogle Compute Engine (GCE)のVMで使っているUbuntu 18.04 LTSが2023年5月31日にEOLになるので、Ubuntu 20.04 LTSまたはUbuntu Pro 18.04 LTSに移行してください。」とリマインドがありました。もうそんな時期なのかと早めに移行を実施しました。
移行手順を考える
考えてみた移行手順は以下の通りです。
- バックアップとして現在のGCEのVMインスタンスのブートディスクのスナップショットをとる。
- 新しいVMインスタンスをUbuntu 20.04 LTSでセットアップする。
- スナップショットから新規のディスクを作成し、新しいVMインスタンスにマウント
- アプリケーションやデータをマウントしたディスクから移行
- 新しいOpsエージェントに切り替えていなかったので切り替え
- 動作確認
- 旧VMインスタンスの削除
- スナップショットとそれから作成したディスクはしばらく残しておいて問題なければ削除
ほぼGCPのGUIでできるのですが、初めて行なったところだけメモしておきます。
VMに新規のディスクをマウント
スナップショットから作成した新規のディスクをVMに接続したあと、mountするためのデバイス名はどこだろうと探したところ以下のコマンドでした。
$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 55.6M 1 loop /snap/core18/2697
loop1 7:1 0 63.3M 1 loop /snap/core20/1822
loop2 7:2 0 337.9M 1 loop /snap/google-cloud-cli/111
loop3 7:3 0 91.9M 1 loop /snap/lxd/24061
loop4 7:4 0 49.9M 1 loop /snap/snapd/18357
loop5 7:5 0 49.9M 1 loop /snap/snapd/18596
loop6 7:6 0 55.6M 1 loop /snap/core18/2721
loop7 7:7 0 63.3M 1 loop /snap/core20/1852
loop8 7:8 0 333.4M 1 loop /snap/google-cloud-cli/119
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 19.9G 0 part /
├─sda14 8:14 0 4M 0 part
└─sda15 8:15 0 106M 0 part /boot/efi
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 19.9G 0 part
├─sdb14 8:30 0 4M 0 part
└─sdb15 8:31 0 106M 0 part
デバイス名がわかればあとはマウントするだけです。
$ sudo mount -o discard,defaults /dev/sdb1 /mnt/disks/old-boot
$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 55.6M 1 loop /snap/core18/2697
loop1 7:1 0 63.3M 1 loop /snap/core20/1822
loop2 7:2 0 337.9M 1 loop /snap/google-cloud-cli/111
loop3 7:3 0 91.9M 1 loop /snap/lxd/24061
loop4 7:4 0 49.9M 1 loop /snap/snapd/18357
loop5 7:5 0 49.9M 1 loop /snap/snapd/18596
loop6 7:6 0 55.6M 1 loop /snap/core18/2721
loop7 7:7 0 63.3M 1 loop /snap/core20/1852
loop8 7:8 0 333.4M 1 loop /snap/google-cloud-cli/119
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 19.9G 0 part /
├─sda14 8:14 0 4M 0 part
└─sda15 8:15 0 106M 0 part /boot/efi
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 19.9G 0 part /mnt/disks/old-boot
├─sdb14 8:30 0 4M 0 part
└─sdb15 8:31 0 106M 0 part
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 20134592 3388824 16729384 17% /
devtmpfs 490268 0 490268 0% /dev
tmpfs 494588 0 494588 0% /dev/shm
tmpfs 98920 1056 97864 2% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 494588 0 494588 0% /sys/fs/cgroup
/dev/loop0 56960 56960 0 100% /snap/core18/2697
/dev/loop1 64896 64896 0 100% /snap/core20/1822
/dev/loop2 345984 345984 0 100% /snap/google-cloud-cli/111
/dev/loop3 94080 94080 0 100% /snap/lxd/24061
/dev/loop4 51072 51072 0 100% /snap/snapd/18357
/dev/sda15 106858 6161 100697 6% /boot/efi
/dev/loop5 51072 51072 0 100% /snap/snapd/18596
/dev/loop6 56960 56960 0 100% /snap/core18/2721
/dev/loop7 64896 64896 0 100% /snap/core20/1852
/dev/loop8 341376 341376 0 100% /snap/google-cloud-cli/119
tmpfs 98916 0 98916 0% /run/user/1003
tmpfs 98916 0 98916 0% /run/user/1001
/dev/sdb1 20134592 10285880 9832328 52% /mnt/disks/old-boot
$
LoggingエージェントからOpsエージェントへの移行
旧システムではアプリケーションのログをLoggingエージェントでStackDriver Loggingに読み込んで、BigQueryにシンクしていたのですが、Loggingエージェントの後継がCloud LoggingのOpsエージェントになったようです。今後のこともあるので、新しいOpsエージェントに置き換えてみました。
旧システムのLoggingエージェントで追加設定していたファイルは以下の内容でした。
$ cat /etc/google-fluentd/config.d/wowhoneypot.conf
<source>
@type tail
format /^\[(?<time>[^\]]*)\] (?<clientip>[^ ]*) (?<hostname>[^ ]*) "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<mrrid>[^ ]*) (?<requestbody>[^ ]*)$/
time_format %Y-%m-%d %H:%M:%S%z
path /opt/wowhoneypot/log/access_log
pos_file /var/lib/google-fluentd/pos/wowhoneypot.pos
read_from_head true
tag wowhoneypot-access
</source>
Opsエージェントは全く内容が異なるので、いろいろ試して以下の設定ファイルに落ち着きました。
$ cat /etc/google-cloud-ops-agent/config.yaml
logging:
receivers:
wowhoneypot-access:
type: files
include_paths:
- /opt/wowhoneypot/log/access_log
record_log_file_path: true
service:
pipelines:
default_pipeline:
receivers: []
wow_pipeline:
receivers: [wowhoneypot-access]
processors: [wow_parse]
processors:
wow_parse:
type: parse_regex
regex: "^\[(?<time>[^\]]*)\] (?<clientip>[^ ]*) (?<hostname>[^ ]*) \"(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?\" (?<status>[^ ]*) (?<mrrid>[^ ]*) (?<requestbody>[^ ]*)$"
time_key: time
time_format: "%Y-%m-%d %H:%M:%S%z"
これでデータがCloud Loggingに取り込まれ、BigQueryにもシンクしていることが確認できたので、Opsエージェントへの移行も完了です。
まとめ
GCPなどのクラウドは変化が激しく、いつの間にか周りの仕組みが新しくなっているので久しぶりのシステム移行でやや戸惑いましたが、簡単な操作でさまざまな設定や操作もでき、マニュアルもある程度は揃っているのでやはりGCPは便利かなと思います。