EC2インスタンスのルートボリューム置き換えによるパッチ適用

# この記事について

この記事は [AWS for Games Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aws-for-games "AWS for Games Advent Calendar 2022") 8日目の記事になります。
AWSのEC2は初回リリースの2006年から現在まで様々な機能アップデートが実施されてきています。
今回はその中でもルートボリュームの置き換え機能を利用したパッチ適用についてご紹介したいと思います。
公式のリリースノートは以下です。

https://aws.amazon.com/jp/about-aws/whats-new/2022/10/amazon-ec2-enables-patching-guest-operating-system-application-replace-root-volume/

# ルートボリュームの置き換えとは

実はこの機能自体は2021/04/21に既に以下の通りリリースされていたものです。

https://aws.amazon.com/jp/about-aws/whats-new/2021/04/ec2-enables-replacing-root-volumes-for-quick-restoration-and-troubleshooting/

EC2インスタンスを停止することなく、実行中の状態で作業が可能で

- 開始状態(EC2作成時に選択したAMIを元とする)に復元する
- 置き換え対象のルートボリュームから取得された特定時点でのスナップショットから復元する

といった形で、EC2インスタンスの設定を特定地点に巻き戻すことができる機能となります。
そのため、機能のユースケースとしては

- オペレーションミスにより重要なファイルを削除してしまった
- 設定変更作業によりインスタンスが起動しなくなってしまった

等々のトラブルシューティングが主となっていました。

# 本記事で紹介する機能について

前述の置き換え機能に対してさらにアップデートが加えられたものとなります。
以前までは置き換え元として、作成時に選択したAMIか
置き換え対象のルートボリュームから取得したスナップショットしか選択できませんでしたが
今回の機能アップデートで、置き換え対象のインスタンスとは関連のないAMIも選択できるようになりました。

そのため、公式のユースケース通りにパッチ適用することを考えると

- 稼働中のインスタンスから取得したAMIからテンポラリのインスタンスを起動する
- テンポラリのインスタンスに対してパッチ適用作業を実施する
- パッチ適用済みの状態でAMIを取得する
- 取得したAMIで稼働中のインスタンスのルートボリュームを置き換える

といった流れで比較的容易に行えるようになりました。
インスタンス自体がステートレスであればパッチ適用済みのAMIを用いてインスタンス自体を入れ替えることができますが
ステートフルなインスタンスに対する作業において
今回の機能を上手く活用していけばパッチ適用の敷居は下がるのではと思います。

OS/ミドルウェア/アプリケーションにおいて
バグの修正や脆弱性に対する対応などを通してパッチ適用を行うタイミングは多々ありますし
大抵このような要修正なバグや脆弱性などは五月雨式に発見されていくものなので
より容易にかつ頻繁にパッチ適用できるようにしておくのが重要だと思います。

# 利用方法

まずはEC2インスタンスを1台起動します。

![スクリーンショット 2022-12-06 10.45.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895851/be459cbf-dd2a-1a23-1356-15f0399a7894.png)

このインスタンスにはApache(httpd)がインストールされており、現在のバージョンは2.4.6になっています。

```
# httpd -V
Server version: Apache/2.4.6 (Amazon Linux 2)
Server built:   Dec 12 2017 18:43:44
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.7.0, APR-UTIL 1.6.1
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"
```

Available Packages として2.4.54が認識されています。
```
# yum info httpd
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Installed Packages
Name        : httpd
Arch        : x86_64
Version     : 2.4.6
Release     : 67.amzn2.6.1
Size        : 3.6 M
Repo        : installed
From repo   : amzn2-core
Summary     : Apache HTTP Server
URL         : http://httpd.apache.org/
License     : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
            : web server.

Available Packages
Name        : httpd
Arch        : x86_64
Version     : 2.4.54
Release     : 1.amzn2
Size        : 1.4 M
Repo        : amzn2-core/2/x86_64
Summary     : Apache HTTP Server
URL         : https://httpd.apache.org/
License     : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
            : web server.
```

この状態でルートボリュームの置き換え機能を利用することで
Apache(httpd)のバージョンを2.4.54へあげてみたいと思います。
まずは起動中のEC2インスタンスからAMIを取得します。

![スクリーンショット 2022-12-06 10.54.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895851/b16d62ea-6b87-1d28-a601-441c0e280f31.png)

AMIの一覧から利用可能になっているか確認しておきます。

![スクリーンショット 2022-12-06 10.54.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895851/742b2fde-853e-a8ba-43f0-07f342eb0c26.png)

このAMIからパッチ適用作業を行うテンポラリのインスタンスを起動します。

![スクリーンショット 2022-12-06 10.58.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895851/1dedbaa6-4fe6-7f68-576d-827184d1a51c.png)

起動できました、EC2インスタンスが2台になっていると思います。

![スクリーンショット 2022-12-06 11.00.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895851/3af05e55-2f8d-9b5c-98a2-da7e5c63be5f.png)

この状態でテンポラリのインスタンスに対してパッチ適用作業を行なっていきます。

```
# yum update httpd
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                                                           | 3.7 kB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-67.amzn2.6.1 will be updated
---> Package httpd.x86_64 0:2.4.54-1.amzn2 will be an update
--> Processing Dependency: httpd-tools = 2.4.54-1.amzn2 for package: httpd-2.4.54-1.amzn2.x86_64
--> Processing Dependency: httpd-filesystem = 2.4.54-1.amzn2 for package: httpd-2.4.54-1.amzn2.x86_64
--> Processing Dependency: mod_http2 for package: httpd-2.4.54-1.amzn2.x86_64
--> Processing Dependency: httpd-filesystem for package: httpd-2.4.54-1.amzn2.x86_64
--> Running transaction check
---> Package httpd-filesystem.noarch 0:2.4.54-1.amzn2 will be installed
---> Package httpd-tools.x86_64 0:2.4.6-67.amzn2.6.1 will be updated
---> Package httpd-tools.x86_64 0:2.4.54-1.amzn2 will be an update
---> Package mod_http2.x86_64 0:1.15.19-1.amzn2.0.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================================================================================================================
 Package                                             Arch                                      Version                                                  Repository                                     Size
============================================================================================================================================================================================================
Updating:
 httpd                                               x86_64                                    2.4.54-1.amzn2                                           amzn2-core                                    1.4 M
Installing for dependencies:
 httpd-filesystem                                    noarch                                    2.4.54-1.amzn2                                           amzn2-core                                     24 k
 mod_http2                                           x86_64                                    1.15.19-1.amzn2.0.1                                      amzn2-core                                    149 k
Updating for dependencies:
 httpd-tools                                         x86_64                                    2.4.54-1.amzn2                                           amzn2-core                                     88 k

Transaction Summary
============================================================================================================================================================================================================
Install             ( 2 Dependent packages)
Upgrade  1 Package  (+1 Dependent package)

Total download size: 1.6 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(1/4): httpd-filesystem-2.4.54-1.amzn2.noarch.rpm                                                                                                                                    |  24 kB  00:00:00
(2/4): httpd-tools-2.4.54-1.amzn2.x86_64.rpm                                                                                                                                         |  88 kB  00:00:00
(3/4): httpd-2.4.54-1.amzn2.x86_64.rpm                                                                                                                                               | 1.4 MB  00:00:00
(4/4): mod_http2-1.15.19-1.amzn2.0.1.x86_64.rpm                                                                                                                                      | 149 kB  00:00:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                        10 MB/s | 1.6 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : httpd-filesystem-2.4.54-1.amzn2.noarch                                                                                                                                                   1/6
  Updating   : httpd-tools-2.4.54-1.amzn2.x86_64                                                                                                                                                        2/6
  Updating   : httpd-2.4.54-1.amzn2.x86_64                                                                                                                                                              3/6
  Installing : mod_http2-1.15.19-1.amzn2.0.1.x86_64                                                                                                                                                     4/6
  Cleanup    : httpd-2.4.6-67.amzn2.6.1.x86_64                                                                                                                                                          5/6
  Cleanup    : httpd-tools-2.4.6-67.amzn2.6.1.x86_64                                                                                                                                                    6/6
  Verifying  : mod_http2-1.15.19-1.amzn2.0.1.x86_64                                                                                                                                                     1/6
  Verifying  : httpd-2.4.54-1.amzn2.x86_64                                                                                                                                                              2/6
  Verifying  : httpd-tools-2.4.54-1.amzn2.x86_64                                                                                                                                                        3/6
  Verifying  : httpd-filesystem-2.4.54-1.amzn2.noarch                                                                                                                                                   4/6
  Verifying  : httpd-tools-2.4.6-67.amzn2.6.1.x86_64                                                                                                                                                    5/6
  Verifying  : httpd-2.4.6-67.amzn2.6.1.x86_64                                                                                                                                                          6/6

Dependency Installed:
  httpd-filesystem.noarch 0:2.4.54-1.amzn2                                                              mod_http2.x86_64 0:1.15.19-1.amzn2.0.1

Updated:
  httpd.x86_64 0:2.4.54-1.amzn2

Dependency Updated:
  httpd-tools.x86_64 0:2.4.54-1.amzn2

Complete!
```

Apache(httpd)のバージョンが2.4.54にあがっていることが確認できました。

```
# httpd -V
Server version: Apache/2.4.54 ()
Server built:   Jun 30 2022 11:02:23
Server's Module Magic Number: 20120211:124
Server loaded:  APR 1.7.0, APR-UTIL 1.6.1, PCRE 8.32 2012-11-30
Compiled using: APR 1.7.0, APR-UTIL 1.6.1, PCRE 8.32 2012-11-30
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_PROC_PTHREAD_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"
```

作業が完了したので、テンポラリのインスタンスのAMIを取得していきます。

![スクリーンショット 2022-12-06 11.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895851/b91d5fbd-b346-b2f3-9995-0695637092d3.png)

取得できました、ここで取得したAMIを利用してルートボリュームを置き換えることになります。
![スクリーンショット 2022-12-06 11.23.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895851/a88f153c-aedf-1a21-6934-8e253a68a175.png)

対象インスタンスを選択 > アクション > モニタリングとトラブルシューティング > ルートボリュームを置き換えるへ移動し
ルートボリュームの詳細のRestoreの項目でImageを選択し、先ほど取得したAMIのIDを入力します。

![スクリーンショット 2022-12-06 11.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895851/df462970-eaa4-b81e-a70f-4d192ac3891d.png)

「置き換えタスクを作成」を押すとインスタンスが再起動されます。
起動後にApache(httpd)のバージョンを確認すると2.4.54にあがっていることが確認できます。

```
# httpd -V
Server version: Apache/2.4.54 ()
Server built:   Jun 30 2022 11:02:23
Server's Module Magic Number: 20120211:124
Server loaded:  APR 1.7.0, APR-UTIL 1.6.1, PCRE 8.32 2012-11-30
Compiled using: APR 1.7.0, APR-UTIL 1.6.1, PCRE 8.32 2012-11-30
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_PROC_PTHREAD_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"
```

# まとめ
今回のアップデートにより、ステートフルなEC2インスタンスへのパッチ適用が容易になりました。
ルートボリュームの置き換え時に再起動が実行される点は少し注意が必要ですが
便利な機能には変わりないので皆さんも是非利用してみくださいー。
以上、本記事はねずみさん家。(@yktr_sre)がお送りしました！