EC2 Image Builderで、ホスト名を設定したLinuxのAMIを作成したい

ホスト名を設定して、SSHログイン時のプロンプトで、ログイン中のホストが何なのかを、わかるようにしたい。
そういうLinuxのAMIを、EC2 Image Builderで作成したい。
今回は、Amazon Linux 2のAMIをベースにする(が、Ubuntuとかでも同じはず)。
方針
EC2 Image Builderのコンポーネントで、「ホスト名を設定するコンポーネント」を作成したい

結論
コンポーネント単体で「ホスト名を設定する」をやるのは無理そう。
ホスト名は変更せずに、「プロンプトの表示の文字列をいじるコンポーネント」を作成する方向に舵を切ったほうが良さそう。

詳細
❌コンポーネント単体で「ホスト名を設定する」はできない
普通のEC2インスタンスでの設定方法(おさらい)
ホスト名を変更するのは、hostnamectl set-hostname foo-bar
すればよい:
sudo hostnamectl set-hostname foo-bar
これにより、/etc/hostnameの変更などが行われる。
EC2インスタンスの文脈では、これに更にcloud-initの設定変更も必要。
具体的には、/etc/cloud/cloud.cfgファイルにて、preserve_hostname
をtrue
にする必要がある:
# /etc/cloud/cloud.cfgファイル
preserve_hostname: true
EC2 Image Builderでは、問題がある
前述の操作を行うコンポーネントを作成すればよさそうだが、そうはいかない。
EC2 Image Builderでは、コンポーネント等で指定したビルド作業を終わらせたあと、不要なファイルのお掃除が実行される。
このお掃除で、hostnamectl set-hostname
でホスト名を指定した際に作成された/etc/hostnameファイルも一緒に消されてしまう。
ここのお掃除部分を制御するためには、イメージレシピの設定のユーザデータの部分に設定を入れる。今回の場合、以下のような動作をするスクリプトを指定すればよい:
- クリーンアップスクリプトの、「/etc/hostnameファイルだけは消さないでおく」バージョンの動作
- {{workingDirectory}}/perform_cleanupファイルの作成
- これにより、以降に、デフォルトで動作するクリーンアップスクリプトが実行されなくなる
まとめると、EC2 Image Builderで「ホスト名を指定した状態のAMI」を生成するためには、「ホスト名を設定するコンポーネント」と、「/etc/hostnameファイルを削除しないイメージレシピ」を、忘れずにセットにして使うようにしなければならない。
これは運用でカバーする系の話になってくる。つまり、運用コストが非常に高くなってしまう。
あるいは、起動時にホスト名を変更するスクリプトが走るように、systemdユーザサービス等を設定しても良いが、当初の「SSHログイン時のプロンプトで、ログイン中のホストが何なのかを、わかるようにしたい」のためにはやり過ぎ。