AMIからインスタンスを起動した時に設定を継承したいときの対処法(cloud-init)

お客様からcloud-initでの検証を依頼されて、それなんすかってなったのでメモしておく

◆cloud-initとは

>cloud-init は、システムの起動時にクラウドインスタンスの初期化を自動化するソフトウェアパッケージです。cloud-init は、さまざまなタスクを実行するように設定できます。

◆AWSやAzureで使用する場合
→AMIなどにはインストール済み

>クラウドプロバイダー (AWS または Azure など) でイメージを使用する予定の場合は、Red Hat Image Builder を使用してイメージを作成します。Image Builder のイメージは、特定のクラウドプロバイダーで使用するようにカスタマイズされます。イメージタイプ AMI、VHD、および qcow2 には、cloud-init がすでにインストールされています。Image Builder の詳細は、RHEL システムイメージのカスタマイズ を参照してください。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_and_managing_cloud-init_for_rhel_8/introduction-to-cloud-init_cloud-content

◆設定方法について
・YAMLで記載する
・設定ファイルは "/etc/cloud/cloud.cfg"
・ファイル内のモジュールは下記の順番で実行される
　　①cloud_init_modules（初期フェーズ）
　　②cloud_config_modules（設定フェーズ）
　　③cloud_final_modules（最終フェーズ）

>cloud-init は YAML 形式のファイル命令を使用してタスクを実行します。YAML ファイル内で命令を指定して、cloud-init が実行する初期設定を決定します。インスタンスが起動すると、cloud-init サービスが起動して、命令を検索して実行します。タスクは、cloud-init 設定に基づいて、仮想マシンの初回起動時または後続の起動時に完了します。

>/etc/cloud/cloud.cfg ファイルを設定し、/etc/cloud/cloud.cfg.d/ ディレクトリーの下にディレクティブを追加して、タスクを定義します。
>・cloud.cfg ファイルには、ユーザーアクセス、認証、システム情報用などのディレクティブが含まれます。
>・ファイルには、cloud-init のデフォルトおよびオプションのモジュールも含まれています。モジュールは、cloud-init 初期化フェーズ、設定フェーズ、最終フェーズを含む 3 つのフェーズ内で順番に実行されます。cloud.cfg ファイル内では、3 つのフェーズのモジュールが、cloud_init_modules、cloud_config_modules、および cloud_final_modules の下にそれぞれリスト表示されます。
>・cloud.cfg.d ディレクトリーでは、cloud-init の追加ディレクティブを追加できます。cloud.cfg.d ディレクトリーにディレクティブを追加する場合、通常は *.cfg という名前のファイルに追加し、ファイルの上部に #cloud-config を常に含めます。

◆検証方法

1：RHELのインスタンスを用意する
2：ホスト名「hogehoge」を設定する。
  SSHの認証で「パスワード認証を許可」にする。
3：AMIでバックアップを取る
4：3のAMIをリストアして、ホスト名とSSHのパスワード認証の設定を確認する（おそらくデフォルトに戻るはず）
5：/etc/cloud/cloud.cfg に下記記述

```
ssh_pwauth:  1
preserve_hostname: true
```

6：AMIでバックアップを取る
7：6のAMIをリストアして、ホスト名とSSHのパスワード認証が許可されていることを確認する。



◆実際にやってみる

```
[root@ip-10-0-0-53 ~]# uname -n
ip-10-0-0-53.ap-northeast-1.compute.internal
[root@ip-10-0-0-53 ~]#
[root@ip-10-0-0-53 ~]# hostnamectl set-hostname hogehoge
[root@ip-10-0-0-53 ~]#
[root@ip-10-0-0-53 ~]# uname -n
hogehoge
[root@ip-10-0-0-53 ~]#


[root@ip-10-0-0-53 ~]# ll /etc/ssh/sshd_config{,.bkup}
ls: cannot access '/etc/ssh/sshd_config.bkup': No such file or directory
-rw-------. 1 root root 3693 May  3 09:01 /etc/ssh/sshd_config
[root@ip-10-0-0-53 ~]#
[root@ip-10-0-0-53 ~]# cp -ip /etc/ssh/sshd_config{,.bkup}
[root@ip-10-0-0-53 ~]#
[root@ip-10-0-0-53 ~]# ll /etc/ssh/sshd_config{,.bkup}
-rw-------. 1 root root 3693 May  3 09:01 /etc/ssh/sshd_config
-rw-------. 1 root root 3693 May  3 09:01 /etc/ssh/sshd_config.bkup
[root@ip-10-0-0-53 ~]#
[root@ip-10-0-0-53 ~]# vi /etc/ssh/sshd_config
[root@ip-10-0-0-53 ~]#
[root@ip-10-0-0-53 ~]# diff /etc/ssh/sshd_config{,.bkup}
131c131
< PasswordAuthentication yes
---
> PasswordAuthentication no
[root@ip-10-0-0-53 ~]#
[root@ip-10-0-0-53 ~]# systemctl restart sshd
[root@ip-10-0-0-53 ~]#
```



AMIを作成して、接続する
![スクリーンショット 2023-10-08 8.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/012a0f50-6bb7-7a21-2e78-4a054b0d1700.png)

![スクリーンショット 2023-10-08 8.58.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/872ff663-b6be-a05f-19e2-e23cc0581ea0.png)

設定確認
→ホスト名がリセットされていること、パスワード認証がOFFになっていることを確認

```
[root@ip-10-0-0-51 ~]# uname -n
ip-10-0-0-51.ap-northeast-1.compute.internal
[root@ip-10-0-0-51 ~]#
[root@ip-10-0-0-51 ~]# egrep -v "^#|^$" /etc/ssh/sshd_config
Include /etc/ssh/sshd_config.d/*.conf
AuthorizedKeysFile .ssh/authorized_keys
Subsystem sftp	/usr/libexec/openssh/sftp-server
PasswordAuthentication no
[root@ip-10-0-0-51 ~]#
```

再度、最初に作成したインスタンスに戻ってcloud-init.cfgを編集し、AMIを作成する

```
[root@hogehoge ~]# ll /etc/cloud/cloud.cfg{,.bkup}
ls: cannot access '/etc/cloud/cloud.cfg.bkup': No such file or directory
-rw-r--r--. 1 root root 2686 Feb  8  2023 /etc/cloud/cloud.cfg
[root@hogehoge ~]#
[root@hogehoge ~]# cp -ip /etc/cloud/cloud.cfg{,.bkup}
[root@hogehoge ~]#
[root@hogehoge ~]# ll /etc/cloud/cloud.cfg{,.bkup}
-rw-r--r--. 1 root root 2686 Feb  8  2023 /etc/cloud/cloud.cfg
-rw-r--r--. 1 root root 2686 Feb  8  2023 /etc/cloud/cloud.cfg.bkup
[root@hogehoge ~]#
[root@hogehoge ~]# vi /etc/cloud/cloud.cfg
[root@hogehoge ~]#
[root@hogehoge ~]# diff /etc/cloud/cloud.cfg{,.bkup}
16c16
< ssh_pwauth:   1
---
> ssh_pwauth:   0
110,111d109
<
< preserve_hostname: true
[root@hogehoge ~]#
```

![スクリーンショット 2023-10-08 9.27.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/fe426437-8fe5-3adb-bd2c-9ca270b643f8.png)

cloud-initを設定した、AMIからインスタンスを作成して、問題ないかを確認する

![スクリーンショット 2023-10-08 9.29.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/a501ce1e-aa98-4786-973e-ada2cbe42131.png)

```
[root@hogehoge ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
    link/ether 06:9b:a8:33:fa:3d brd ff:ff:ff:ff:ff:ff
    altname enX0
    inet 10.0.0.171/24 brd 10.0.0.255 scope global dynamic noprefixroute eth0
       valid_lft 3392sec preferred_lft 3392sec
    inet6 fe80::49b:a8ff:fe33:fa3d/64 scope link
       valid_lft forever preferred_lft forever
[root@hogehoge ~]#
[root@hogehoge ~]# uname -n
hogehoge
[root@hogehoge ~]#
[root@hogehoge ~]# egrep -v "^#|^$" /etc/ssh/sshd_config
Include /etc/ssh/sshd_config.d/*.conf
AuthorizedKeysFile	.ssh/authorized_keys
Subsystem	sftp	/usr/libexec/openssh/sftp-server
PasswordAuthentication yes
[root@hogehoge ~]#
```

ホスト名とSSHのパスワード認証が許可されていることを確認

参考
[Amazon Linux 2でカスタムAMIからの起動時にホスト名を固定する方法](https://dev.classmethod.jp/articles/amazon-linux-2-change-and-fix-hostname-when-launch-from-custom-ami/)