目次

AWS EC2 : cloud-init(cloud.cfg)によるOS設定



cloud-init(cloud.cfg)とは

cloud-initは、インスタンスの作成時やOS再起動時に設定してくれる
cloud-initはrootユーザーで実行されるのでsudoコマンドは使用しない

設定内容

設定できる一部になります。

boot時に指定したコマンドを実行
「/etc/hosts」の設定
sshでのrootでのログインを無効
sshのパスワードログインを無効
sshキー(/etc/ssh/ssh_host_*key*)の削除
言語設定
タイムゾーンの設定


AMIからOSを作った時に自動で設定される項目


設定ファイル

ログファイル

$ cat /var/log/cloud-init.log |grep -i finish   # 終わった時間を確認
$ journalctl -u cloud-final


実行タイミング

  1. cloud-init-local
  2. cloud-init
  3. cloud-config
  4. 各種サービスの起動
  5. cloud-final
順番の確認方法
$ ls -alF /etc/rc3.d/ | grep cloud
$ ls -alF /etc/rc3.d/


OS再起動せず再実行する

cloud_init_modules セクションの実行
sudo rm -rf /var/lib/cloud/* && \
  sudo cloud-init --debug init --local && \
  sudo cloud-init --debug init
cloud_config_modules セクションの実行
sudo rm -rf /var/lib/cloud/* && \
  sudo cloud-init init --local && \
  sudo cloud-init init && \
  sudo cloud-init --debug modules --mode config
cloud_final_modules セクションの実行
sudo rm -rf /var/lib/cloud/* && \
  sudo cloud-init init --local && \
  sudo cloud-init init && \
  sudo cloud-init modules --mode config && \
  sudo cloud-init --debug modules --mode final


設定(/etc/cloud/cloud.cfg)

cloud-initを無効にする

cloud-initなどのサービス起動を無効化する以外にも、以下のファイルを作成することでも、cloud-initを無効化できます。

touch /etc/cloud/cloud-init.disabled


cloud-initの初期化をさせない

#- set_hostname
#- update_hostname
#- sers-groups
#- ssh
#- locale

ホスト名を自動で割り当てないのはこの設定だけではうまくいかないので、preserve_hostname: true を追加する必要があります。


cloud-initで設定する

#cloud-config
preserve_hostname: true  #ホスト名を自動で割り当てない
repo_upgrade: none #インスタンスの初回起動時に自動でセキュリティアップデートを実行しない
locale: ja_JP.UTF-8

manage_resolv_conf: false       # /etc/resolv.conf 内容を書き換えない。


EC2で、cloud-init をOS起動のたびに実行させる

参考:https://repost.aws/ja/knowledge-center/execute-user-data-ec2

[ユーザーデータの編集]を選択し、ユーザーデータを下記のように書き換えます。

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
#この部分に実行したいスクリプトを記載する
/bin/echo "Hello World" >> /tmp/testfile.txt
--//--


/etc/cloud/cloud.cfgを理解する

# WARNING: Modifications to this file may be overridden by files in
# /etc/cloud/cloud.cfg.d

users: # defaultで指定したユーザーを作成
 - default

disable_root: true  # sshでのrootでのログインを無効にする
ssh_pwauth:   false  # sshのパスワードログインを無効化

mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
resize_rootfs: noblock
resize_rootfs_tmp: /dev
ssh_deletekeys:   true
ssh_genkeytypes:  ~
syslog_fix_perms: ~

datasource_list: [ Ec2, None ]
repo_upgrade: security
repo_upgrade_exclude:
 - kernel
 - nvidia*
 - cuda*

# Might interfere with ec2-net-utils
network:
  config: disabled

cloud_init_modules:
 - migrator
 - bootcmd # ブートプロセス時にコマンドを実行
 - write-files
 - write-metadata
 - amazonlinux_repo_https
 - growpart
 - resizefs # /のファイルシステムを拡張す
 - set-hostname # ホスト名を設定する(/etc/sysconfig/networkのホスト名を書き換える)
 - update-hostname # ホスト名を設定する(/etc/hostnameのホスト名を書き換える)
 - update-etc-hosts # ホスト名を設定する(テンプレートでの指定やlocalhost等の指定が可能)
 - rsyslog # rsyslogの設定変更を行う(デフォルトでは何もしない)
 - users-groups # ユーザー・グループの作成を行う(デフォルトではdefaultで指定されているec2-userを作成する)
 - ssh       # sshの設定を行う(rootログイン無効、パスワードログインの無効化)
 - resolv-conf

cloud_config_modules:
 - disk_setup
 - mounts    # fstabの設定を行う(エフェメラル等やswapの設定を行うがrhelの場合デフォルトでは何もしない)
 - locale    # localeの設定を行う(デフォルトはen_US.UTF-8に初期化される)
 - set-passwords  # ユーザーのパスワードを設定(デフォルトは何も実施しない)
 - yum-configure
 - yum-add-repo
 - package-update-upgrade-install
 - timezone # タイムゾーンの設定(デフォルトでは何も実施しない)
 - disable-ec2-metadata # メタデータアクセスを拒否ができないように設定する(デフォルトfalseでメタデータにアクセスできる状態)
 - runcmd # 指定したコマンドを実行する(デフォルト何もしない)

cloud_final_modules:
 - scripts-per-once # 一回だけスクリプトを実行(/var/lib/cloud/scripts/per-onceのスクリプト)
 - scripts-per-boot # 起動毎に実行(/var/lib/cloud/scripts/per-bootのスクリプト)
 - scripts-per-instance # AMIからインスタンス作成時の初回起動時だけスクリプトを実行(/var/lib/cloud/scripts/per-instanceのスクリプト)
 - scripts-user # AMIからインスタンス作成時の初回起動時だけスクリプトを実行
 - ssh-authkey-fingerprints # sshフィンガープリントをconsoleに出力する
 - keys-to-console # ssh時のフィンガープリントを出力をする、しないの制御をする(デフォルトでは何もしない)
 - phone-home # boot完了時に指定したURLにリクエストを投げる※デフォルトでは何もしない
 - final-message  #完了ログをconsoleに出力する
 - power-state-change

 system_info:
  # This will affect which distro class gets used
  distro: amazon
  distro_short: amzn
  default_user:
    name: ec2-user
    lock_passwd: true
    gecos: EC2 Default User
    groups: [wheel, adm, systemd-journal]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash
  paths:
    cloud_dir: /var/lib/cloud
    templates_dir: /etc/cloud/templates
  ssh_svcname: sshd   # sshdの再起動を行う

mounts:
 - [ ephemeral0, /media/ephemeral0 ]
 - [ swap, none, swap, sw, "0", "0" ]


起動後の処理確認

/var/lib/cloud/instances/i-インスタンスID

EC2 Linuxを起動するたびに同じコマンドを実行させる | DevelopersIO

$ pwd
/var/lib/cloud/instances/i-xxxxxxxxxxxxxxxxx

$ ls -F1
cloud-config.txt
datasource
handlers/
obj.pkl
scripts/
sem/
user-data.txt
user-data.txt.i
vendor-data.txt
vendor-data.txt.i