Open3

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

shuichishuichi

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

方針

EC2 Image Builderのコンポーネントで、「ホスト名を設定するコンポーネント」を作成したい

shuichishuichi

結論

コンポーネント単体で「ホスト名を設定する」をやるのは無理そう。

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

shuichishuichi

詳細

❌コンポーネント単体で「ホスト名を設定する」はできない

普通のEC2インスタンスでの設定方法(おさらい)

ホスト名を変更するのは、hostnamectl set-hostname foo-barすればよい:

sudo hostnamectl set-hostname foo-bar

これにより、/etc/hostnameの変更などが行われる。

EC2インスタンスの文脈では、これに更にcloud-initの設定変更も必要。
具体的には、/etc/cloud/cloud.cfgファイルにて、preserve_hostnametrueにする必要がある:

# /etc/cloud/cloud.cfgファイル
preserve_hostname: true

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html#set-hostname-system

EC2 Image Builderでは、問題がある

前述の操作を行うコンポーネントを作成すればよさそうだが、そうはいかない。

EC2 Image Builderでは、コンポーネント等で指定したビルド作業を終わらせたあと、不要なファイルのお掃除が実行される。

https://docs.aws.amazon.com/imagebuilder/latest/userguide/security-best-practices.html#post-build-cleanup

このお掃除で、hostnamectl set-hostnameでホスト名を指定した際に作成された/etc/hostnameファイルも一緒に消されてしまう。

ここのお掃除部分を制御するためには、イメージレシピの設定のユーザデータの部分に設定を入れる。今回の場合、以下のような動作をするスクリプトを指定すればよい:

  • クリーンアップスクリプトの、「/etc/hostnameファイルだけは消さないでおく」バージョンの動作
  • {{workingDirectory}}/perform_cleanupファイルの作成
    • これにより、以降に、デフォルトで動作するクリーンアップスクリプトが実行されなくなる

まとめると、EC2 Image Builderで「ホスト名を指定した状態のAMI」を生成するためには、「ホスト名を設定するコンポーネント」と、「/etc/hostnameファイルを削除しないイメージレシピ」を、忘れずにセットにして使うようにしなければならない。

これは運用でカバーする系の話になってくる。つまり、運用コストが非常に高くなってしまう。

あるいは、起動時にホスト名を変更するスクリプトが走るように、systemdユーザサービス等を設定しても良いが、当初の「SSHログイン時のプロンプトで、ログイン中のホストが何なのかを、わかるようにしたい」のためにはやり過ぎ。