Amazon Linux 2023 の鳥を青くしてみた

僕らは皆 そう 青い鳥症候群 青い鳥は思いのほか 近くにいるよ 例えばそう キミの心の中 そして Amazon Linux 2023 のログインバナー

コンバンハ、千葉(幸)です。

わたしは詳しく知らないのですが、最近とある SNS で青い鳥がいなくなったことが話題であるそうです。わたしは詳しく知らないのですが。

青い鳥と言えば幸せの象徴、それがいなくなったとなれば皆さんの青い鳥ロスは避けられません。代わりとなる青い鳥が必要です。なんなら鳥さえ確保できれば、それを青くするのはこちらでやります。

そんな折、どうやらアマゾンにはいい感じの鳥が住んでいるようだという噂を聞きつけました。ということで、藁にもすがる思いで我々は、未来の青い鳥の影を求め、アマゾンの奥地に出かけていくのであった。

こちらが今回赴くアマゾンです

アマゾン(Amazon Linux 2023)に到着しました。今回はこちらにお邪魔してみます。ワクワクしますね。

  • AMI:ami-04beabd6a4fb6ab6f(al2023-ami-2023.1.20230809.0-kernel-6.1-x86_64)
  • 配置サブネット:パブリックサブネット
  • パブリックIP アドレス割り当て:有効化
  • SecuriryGroup:
    • インバウンド:3.112.23.0/29からの SSH を許可 *1
    • アウトバウンド:すべて許可

EC2_Instance_bluebird

アマゾンには、コンソールから EC2 Instance Connect で接続していきます。「接続」→「EC2 Instance Connect」→「接続タイプ:EC2 Instance Connect を使用して接続する」→「接続」と押下していきます。

接続が完了し、幸先よく鳥がお出迎えしてくれました。

EC2_Instance_Connect_bird_1

ほう……。

EC2_Instance_Connect_bird

これはなかなかいい面構えをしていますね。青くし甲斐がありそうだ……。

Amazon Linux 2023 の鳥はどこに住んでいるのか

今回お出迎えしてくれた鳥は、/usr/lib/motd.d/30-bannerに住んでいます。

$ cat /usr/lib/motd.d/30-banner 
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'

ログイン時のメッセージ表示は motd という機能により成り立っています。motd が参照するファイルのひとつである/usr/lib/motd.d/30-bannerに鳥(を含むメッセージ)が定義されているというわけです。

Amazon Linux 2023 の motd 関連のファイル/ディレクトリを確認してみる

せっかくなので motd 関連の各種ファイル/ディレクトリの内訳を確認してみます。

/usr/lib/ 配下

/usr/lib/motdは空のファイルです。/usr/lib/motd.d/配下には先ほど見た30-bannerが存在します。

# ls -l /usr/lib/motd
-rw-r--r--. 1 root root 0 Jan 30  2023 /usr/lib/motd

# ls -l /usr/lib/motd.d/
total 4
-rw-r--r--. 1 root root 271 Aug 14 14:53 30-banner

/etc/ 配下

/etc/motd/var/lib/update-motd/motdへのリンクになっています。リンク先は空ファイルです。/etc/motd.d/配下には何も存在しません。

# ls -l /etc/motd
lrwxrwxrwx. 1 root root 25 Aug  7 22:39 /etc/motd -> /var/lib/update-motd/motd

# ls -l /var/lib/update-motd/
total 0
-rw-r--r--. 1 root root 0 Aug 14 14:20 motd

# ls -l /etc/motd.d/
total 0

/run/ 配下

/run/motdは空ファイルで、/run/motd.d/配下には何も存在しません。

# ls -l /run/motd
-rw-r--r--. 1 root root 0 Aug 14 14:20 /run/motd

# ls -l /run/motd.d/
total 0

/etc/update-motd.d/配下

/etc/update-motd.d/配下には70-available-updatesのみが存在します。(ちなみに Amazon Linux 2 では30-bannerがこのディレクトリに存在します。)

# ls -l /etc/update-motd.d/
total 4
-rwxr-xr-x. 1 root root 1285 Aug  1 22:22 70-available-updates

70-available-updatesの内訳はこのようになっています。

# cat /etc/update-motd.d/70-available-updates 
#!/usr/bin/sh

# Updates to current release
# Possible summaries include:
# No packages needed for security; %d packages available
# %d package(s) needed[ (+%d related)] for security, out of %d available
# There are [[%d security update(s)[ out of ]%d total update(s)]] available
LANG=C timeout 30s /usr/bin/dnf \
    --debuglevel 2 \
    updateinfo 2>/dev/null \
        | grep -Pzo '.*Updates(.*\n)*' \
    && echo 'Run "sudo dnf update" to apply all updates.'

# New OS releases and versions
#
# Example summary:
#
# A newer release of "Amazon Linux" is available.
#   Version 2023.0.20230824:
#   Version 2023.0.20230831:
# A new version of "Amazon Linux" is available!
#   Version 2024.0.20240915:

# don't be noisy if plugin is missing
if rpm -q --quiet dnf-plugin-release-notification; then
    LANG=C timeout 30s /usr/bin/dnf \
        check-release-update 2>&1 |
    awk 'function pline() { printf any?"%s\n":"\n%s\n", $0; any=1; }
         /newer release.*is available/  { sub("^ *", ""); pline(); }
         /new version.*is available/    { sub("^ *", ""); pline(); }
         /Version .*:/                  { print; }
         END { if (any) {
                print "Run \"/usr/bin/dnf check-release-update\" for full release and version update info";
             } }'
fi

setterm で背景とか青くしてみたらどうだろう

話は戻って、Amazon Linux 2023 の鳥を青くしたいです。手始めに背景を青くしてみましょう。

settermコマンドで、コンソールの文字色や背景色を変更できます。(有効なのはそのセッションのみです。)

以下のコマンドを実行することで、「端末の文字のクリア(clearコマンド相当)」「文字色を白に変更」「背景色を青に変更」が実行されます。

$ setterm -clear all -foreground white -background blue

その状態で再度先ほどの鳥を表示してみます。

EC2_Instance_Connect_blue_bird

まぁ……悪くないですが「青い鳥」という感じはあまりしないですね。青く見えるサングラス越しに景色を見ているようなものですからね。鳥だけを青くしたいですね。

echo の出力で文字を青くしてみたらどうだろう

echo コマンドでは色属性のエスケープシーケンスを記述することにより、文字や背景色に色をつけられます。

色属性のエスケープシーケンス構文

\e[色属性mテキスト\e[m

例えば以下のような形です。

echo -e "\e[31mこんにちは\e[m" 
echo -e "\e[42mこんばんは\e[m"

echo_color

色属性の一桁目は3が文字色、4が背景色を表します。二桁目で色を指定しています。

ということでログインメッセージの鳥だけを青く表示する場合の一例はこのようになります。(4行目の末尾に\を追加していることに注意してください。これが無いと改行が無視されてしまいました。)

$ echo -e "\e[34m
   ,     #_
   ~\_  ####_        \e[0mAmazon Linux 2023\e[34m
  ~~  \_#####\\
  ~~     \###|
  ~~       \#/ ___   \e[0mhttps://aws.amazon.com/linux/amazon-linux-2023\e[34m
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
\e[0m"

EC2_Instance_Connect_echo_blue_bird

いい感じですね。

ちょっと線が細い感じもするので、「太字」を表す\e[1mも加えてみます。

$ echo -e "\e[1m\e[34m
   ,     #_
   ~\_  ####_        \e[0mAmazon Linux 2023\e[1m\e[34m
  ~~  \_#####\\
  ~~     \###|
  ~~       \#/ ___   \e[0mhttps://aws.amazon.com/linux/amazon-linux-2023\e[1m\e[34m
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
\e[0m"

EC2_Instance_Connect_echo_blue_bird-2072853

いい感じの青い鳥だ!いい感じだ!

/usr/lib/motd.d/配下だと動的な処理ができない

echo を用いて鳥を青くすることに成功しました。あとはこれをログインメッセージにも反映させたいです。

/usr/lib/motd.d/30-bannerを以下の内容にしてあげれば良さそうでしょうか。 *2

/usr/lib/motd.d/30-banner

#!/bin/bash

echo -e "\e[1m\e[34m
   ,     #_
   ~\_  ####_        \e[0mAmazon Linux 2023\e[1m\e[34m
  ~~  \_#####\\
  ~~     \###|
  ~~       \#/ ___   \e[0mhttps://aws.amazon.com/linux/amazon-linux-2023\e[1m\e[34m
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
\e[0m"

以下のコマンドで/usr/lib/motd.d/30-bannerを書き換えてみます。

$ sudo sed -i -e '1s/^/#!\/bin\/bash\n\necho -e "\\e[1m\\e[34m\n/' -e '$s/$/\n\\e[0m"/' -e 's/Amazon Linux 2023/\\e[0m&\\e[1m\\e[34m/g' -e 's|https://aws.amazon.com/linux/amazon-linux-2023|\\e[0m&\\e[1m\\e[34m|g' -e '3s/$/\\/' /usr/lib/motd.d/30-banner

この状態で再度ログインしてみると、ファイルの内容がそのまま表示されてしまいました。

EC2_Instance_Connect_blue_bird_static

/usr/lib/motd.d/配下では動的な内容は定義できないようです。

/etc/update-motd.d/配下に移してサービス起動してみる

修正済みの30-banner/etc/update-motd.d/配下に移動させてみます。

$ sudo mv /usr/lib/motd.d/30-banner /etc/update-motd.d/

/etc/update-motd.d/配下に置いたファイルから動的なメッセージを作成するにはupdate-motdサービスを起動して読み込ませてあげる必要があります。

$ sudo systemctl start update-motd

ちなみにupdate-motdサービスは起動直後に自動的に停止(inactive)されていました。

$ systemctl status update-motd
○ update-motd.service - Dynamically Generate Message Of The Day
     Loaded: loaded (/usr/lib/systemd/system/update-motd.service; enabled; preset: enabled)
     Active: inactive (dead) since Tue 2023-08-15 04:33:21 UTC; 1min 6s ago
TriggeredBy: ● update-motd.timer
    Process: 4943 ExecStart=/usr/sbin/update-motd (code=exited, status=0/SUCCESS)
   Main PID: 4943 (code=exited, status=0/SUCCESS)
        CPU: 694ms

Aug 15 04:33:20 ip-172-31-42-93.ap-northeast-1.compute.internal systemd[1]: Starting update-motd.service - Dynamically Generate Message Of The Day...
Aug 15 04:33:21 ip-172-31-42-93.ap-northeast-1.compute.internal systemd[1]: update-motd.service: Deactivated successfully.
Aug 15 04:33:21 ip-172-31-42-93.ap-northeast-1.compute.internal systemd[1]: Finished update-motd.service - Dynamically Generate Message Of The Day.

この状態で再度ログインすると……

EC2_Instance_Connect_ifound_bluebird

ついに青い鳥がお出迎えしてくれました!!!

EC2_Instance_Connect_blue_bird_aetane

青い鳥…どこに行ってたんだよ……なぁ……!

あなたもすぐ青い鳥に会えるユーザーデータスクリプト

Amazon Linux 2023 の AMI からインスタンスを起動する際に、以下のユーザーデータを設定することで今回の取り上げた一連の処理が実行できます。

#!/bin/bash

sed -i -e '1s/^/#!\/bin\/bash\n\necho -e "\\e[1m\\e[34m\n/' -e '$s/$/\n\\e[0m"/' -e 's/Amazon Linux 2023/\\e[0m&\\e[1m\\e[34m/g' -e 's|https://aws.amazon.com/linux/amazon-linux-2023|\\e[0m&\\e[1m\\e[34m|g' -e '3s/$/\\/' /usr/lib/motd.d/30-banner
mv /usr/lib/motd.d/30-banner /etc/update-motd.d/
systemctl start update-motd.service

起動直後にsystemctl start update-motd.serviceを実行するとサービスが立ち上がるまで時間がかかることがあったので、その場合は以下に置き換えてみるのもいいかもしれません。

#!/bin/bash

sed -i -e '1s/^/#!\/bin\/bash\n\necho -e "\\e[1m\\e[34m\n/' -e '$s/$/\n\\e[0m"/' -e 's/Amazon Linux 2023/\\e[0m&\\e[1m\\e[34m/g' -e 's|https://aws.amazon.com/linux/amazon-linux-2023|\\e[0m&\\e[1m\\e[34m|g' -e '3s/$/\\/' /usr/lib/motd.d/30-banner
mv /usr/lib/motd.d/30-banner /etc/update-motd.d/
systemctl enable update-motd.service
shutdown -r now

「いいかもしれません」と言うか、まぁ、こんな酔狂なことを試さないのが一番だと思います。

まとめ

  • Amazon Linux 2023 のデフォルトのログインメッセージは/usr/lib/motd.d/30-bannerで管理されている
  • /usr/lib/motd.d/配下では動的な内容を定義できない
  • /etc/update-motd.d/配下にファイルを格納し、update-motdサービスを起動することで動的な内容をバナー表示できる

終わりに

Amazon Linux 2023 の鳥を青く染めてみた、という話でした。

ふとした思いつきから始めてみた行為でしたが、setterm コマンドや echo による文字列の変更、motd 周りの理解に繋がりそれなりに楽しめました。

元々生息している鳥を捕まえて青く染めた上で「青い鳥だ」と言い張るという、童話に出てくる悪役の気分も味わえました。

▲ 人類のエゴの犠牲になった鳥。

青い鳥うんぬんは別として、Amazon Linux 2023 におけるログインメッセージの変更自体は役に立つことがあるかも知れません。何らか参考になれば幸いです。

以上、 チバユキ (@batchicchi) がお送りしました。

おまけ:ログイン時のメッセージにエックスと表示したい

せっかくなのでログイン時のメッセージを別パターンにも変更してみたくなりました。

静的な内容であれば、/usr/lib/motd.d/30-bannerを直接編集するだけで済みます。特に理由はないのですが、「エックス」という単語を表示させたくなりました。

こちらのサイトで AA を生成してみます。

root で/usr/lib/motd.d/30-bannerを変更してみます。

# cat <<EOF > /usr/lib/motd.d/30-banner
                                                 
                                                 
                                                 
                            ■■■■■■■    ■■■■■■■■■ 
 ■■■■■■■■■                 ■■    ■■          ■■  
     ■               ■    ■■     ■          ■■   
     ■        ■  ■   ■    ■      ■          ■    
     ■        ■  ■  ■■          ■■         ■■    
     ■        ■  ■  ■           ■         ■■■    
     ■              ■          ■■        ■■ ■■   
 ■■■■■■■■■■        ■          ■■        ■■   ■■  
                  ■■        ■■■         ■     ■■ 
                 ■■         ■                    
                                                 
                                                 
EOF

ログインしてみます。あっ文字化けしてる。

EC2_Instance_Connect_ekkusu

皆さんもお好きなメッセージを表示させてみてくださいね!

参考

脚注

  1. 東京リージョンの EC2 Instance Connect が用いるグローバル IP アドレスです。以下で確認できます。
    「curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq -r '.prefixes[] | select(.service == "EC2_INSTANCE_CONNECT" and .region == "ap-northeast-1")'」
  2. この内容だと末尾に改行が入ってしまっているので、動的に生成されたログインメッセージにも改行が反映されてしまいます。(ここではそもそも動的に生成されないのですが。)後から気づきました。まぁ細かいことを気にするのはやめましょう。改行が入ったほうが鳥が飛び立っている感じがより強く出ていいじゃないですか。