【AWS】Amazon Linux 2023でパッケージを更新する時の注意点

Amazon Linux 2023でパッケージを最新バージョンに更新したい時、少し注意が必要です。
Amazon Linux 2と同じように「yum update」を実行してもパッケージは更新されません。

## パッケージ更新をしてみる
まずは素直にパッケージを更新してみます。
ちなみに、Amazon Linux 2023からベースOSがRHEL/CentOSからFedoraに変わったため、デフォルトのパッケージ管理ツールも「yum」から「dnf」へと変更されました。
ということで、「**sudo dnf update**」を実行してパッケージを更新してみます。

```shell
# パッケージの更新
$ sudo dnf update
Last metadata expiration check: 17:12:26 ago on Sun Oct  8 16:31:53 2023.
================================================================================================================
WARNING:
  A newer release of "Amazon Linux" is available.

  Available Versions:

  Version 2023.2.20231002:
    Run the following command to upgrade to 2023.2.20231002:

      dnf upgrade --releasever=2023.2.20231002

    Release notes:
     https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes-2023.2.20231002.html

================================================================================================================
Dependencies resolved.
Nothing to do.
Complete!
```
コマンドの実行結果をみる限りパッケージの更新はなかったようですが、WARNINGで何か表示されました。
どうやら「最新のリポジトリバージョンがあるから指定すれば更新できるよ」とのこと。


## dnf updateコマンドでは更新できない
上記WARNINGがなぜ発生したのかが気になったので、[AWS公式のマニュアル](https://aws.amazon.com/jp/blogs/news/amazon-linux-2023-a-cloud-optimized-linux-distribution-with-long-term-support/)を調べてみると、以下のような記述が見つかりました。
> ディストリビューションは Amazon Linux パッケージリポジトリの特定のバージョンにロックされるため、更新を適用する方法とタイミングを制御できます。デフォルトでは、Amazon Linux 2 とは異なり、dnf update コマンドはインストール済みのパッケージを更新しません (dnf は yum の後継です)。これは、フリート全体で同じパッケージバージョンが使用されるようにするのに役立ちます。

ここに書かれている通り、Amazon Linux 2023ではデフォルトでリポジトリバージョンが特定のバージョンにロックされているみたいです。更に、インストール済みのパッケージも「**dnf update」を実行しても更新されない**と書かれています。
これによってパッケージバージョンが統一されるので、システムが確実に動作することを保証できるみたいです。
例えば、大規模開発になってくるとインスタンスを複数起動してシステムを構築することがあると思います。この時、インスタンス毎にパッケージを定期的に自動更新するように設定していたとします。その際に、自動更新のタイミングがズレているとインスタンス間のパッケージバージョンに差異が発生してしまいます。これによって、システムの挙動が変になって、最悪の場合原因を解明するのにも時間がかかってしまう可能性があります。そのような時に、予めパッケージバージョンがインスタンス間で統一されており、更新のタイミングを自分で管理できるような仕組みになっていれば、パッケージバージョンの差異起因のおかしな挙動やバグを事前に防ぐことができます。

## リポジトリバージョンを指定すれば更新できる
では、パッケージを更新したいときはどうすれば良いのでしょうか。
一生特定のバージョンをロックしたままになるのでしょうか。それだと困ってしまいますね。
でも大丈夫です。WARNINGの中に書かれていたように、以下のようにリポジトリバージョンを指定すれば更新できます。
「dnf upgrade --releasever=2023.2.20231002」
念のため問題ないか調べてみると、[AWS公式 よくある質問](https://aws.amazon.com/jp/linux/amazon-linux-2023/faqs/)に以下のように書かれていました。
> パッケージの更新をコントロールする必要がある場合は、「dnf check-release-update」を実行して更新可能なリポジトリバージョンを検出し、リストにあるコマンド「dnf -releasever=version update」を実行してバージョンを選択できます。

ここに書かれているようにバージョンを指定して実行すれば更新できそうです。
その前に、更新可能なリポジトリバージョンがあるかどうか確認しておくのも大事ですね。

### 更新可能なリポジトリバージョンの確認
「**sudo dnf check-release-update**」を実行して更新可能なリポジトリバージョンがあるかどうか確認します。

```shell
# 更新可能なリポジトリバージョンを検出
$ sudo dnf check-release-update
WARNING:
  A newer release of "Amazon Linux" is available.

  Available Versions:

  Version 2023.2.20231002:
    Run the following command to upgrade to 2023.2.20231002:

      dnf upgrade --releasever=2023.2.20231002

    Release notes:
     https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes-2023.2.20231002.html
```
「dnf update」を実行した時と同様に、更新可能なリポジトリバージョン「2023.2.20231002」があることを確認できました。

また、「**dnf check-update --releasever=リポジトリバージョン**」を実行すると、指定したリポジトリバージョンで更新可能なパッケージ一覧も確認することができます。

```shell
# 更新可能なパッケージ一覧を検出
$ sudo dnf check-update --releasever=2023.2.20231002

amazon-ec2-net-utils.noarch                          2.4.0-1.amzn2023.0.1                            amazonlinux
amazon-linux-repo-s3.noarch                          2023.2.20231002-0.amzn2023                      amazonlinux
amazon-ssm-agent.x86_64                              3.2.1630.0-1.amzn2023                           amazonlinux
# 省略               
```
更新可能なパッケージもあることを確認できました。

### 最新リポジトリバージョンのパッケージに更新
「**sudo dnf upgrade --releasever=2023.2.20231002**」を実行して、指定したリポジトリバージョンに含まれるパッケージを更新します。

```shell
$ sudo dnf upgrade --releasever=2023.2.20231002

================================================================================================================
 Package                          Architecture   Version                              Repository           Size
================================================================================================================
Installing:
 kernel                           x86_64         6.1.55-75.123.amzn2023               amazonlinux          32 M
Upgrading:
 amazon-ec2-net-utils             noarch         2.4.0-1.amzn2023.0.1                 amazonlinux          17 k
 amazon-linux-repo-s3             noarch         2023.2.20231002-0.amzn2023           amazonlinux          19 k
 amazon-ssm-agent                 x86_64         3.2.1630.0-1.amzn2023                amazonlinux          24 M
# 省略

Transaction Summary
================================================================================================================
Install   1 Package
Upgrade  22 Packages

Total download size: 94 M
Is this ok [y/N]: y # 確認メッセージが出るので「y」を入力

# 省略
  xxd-2:9.0.1882-1.amzn2023.0.1.x86_64                                                                          
Installed:
  kernel-6.1.55-75.123.amzn2023.x86_64                                                                          

Complete! # 更新完了！
```
無事、最新パッケージに更新することができました。

### 「latest」で常に最新バージョンを指定できる
ちなみに、リポジトリバージョンに「latest」を入力すれば、常に最新バージョンを指定してくれます。
「latest」は現時点での最新バージョン「2023.2.20231002」と同じになるので、現時点だと以下のコマンドはどちらも同じ実行結果になります。
```
$ sudo dnf upgrade --releasever=2023.2.20231002
$ sudo dnf upgrade --releasever=latest
```
「latest」を利用してcrontabなどを設定しておけば、定期的に自動更新もできるようになると思います。

## まとめ

・Amazon Linux 2023では、「yum update」や「dnf update」を実行してもパッケージを更新できない。
・「dnf upgrade --releasever=リポジトリバージョン」でバージョンを指定すると更新できる。

---
参考サイト
　- [【AWS】Amazon Linux 2023のパッケージを更新する](https://note.com/yuu________/n/na1594bd99ebd)
　- [Amazon Linux 2023はdnf updateではパッケージ更新されない](https://spekiyoblog.com/amazon-linux-2023-dnf-upgrade/#toc4)