EC2にはユーザーデータというインスタンス作成中にLinuxコマンドを実行できる機能があります。
Linuxサーバ構築時は、自身の環境に合わせ言語やタイムゾーン等決まって設定する内容があると思います。
毎回サーバを構築した後にコマンドを流すのは面倒なので、ユーザーデータにコマンドを組み込むことで、初期セットアップを自動化することができます。
IaC(CFnやTerraForm)に組み込めばパラメータシート代わりにもなります。
本記事では、汎用的に使用できる初期セットアップ用スクリプトを記載します。
概要
前提
- 対象OSはRedhat系
- 以下のOSで動作確認済
- Amazon Linux
- Amazon Linux 2
- RedHat 6.x
- RedHat 7.x
- RedHat 8.x
- Rocky Linux
- 以下のOSで動作確認済
- ユーザーデータに組み込む前提
シェルスクリプトの説明
- yumパッケージのアップデート
- 言語設定
- ロケールを ja_JP.utf8 に指定
- 時刻同期
- タイムゾーンを Asia/Tokyo に指定
- ホスト情報の設定
- ユーザー作成
- パスワードを設定する
- ec2-userと同じグループに所属させる
- Root(sudo)権限を付与
- ログイン設定
- パスワード認証によるSSH接続を可能にします
- Amazon Session Manager(SSM)設定
シェルスクリプト
- ユーザーデータはRoot権限で実行されるので、sudo指定は不要です。
起動時に Linux インスタンスでコマンドを実行する
#!/bin/bash
## パッケージのアップデート
yum update -y
## 言語設定
localectl set-locale LANG=ja_JP.utf8
source /etc/locale.conf
## 時刻同期
sed -ie 's/ZONE=\"UTC\"/ZONE=\"Asia\/Tokyo\"/g' /etc/sysconfig/clock
sed -ie 's/UTC=true/UTC=false/g' /etc/sysconfig/clock
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
## ホスト情報の設定
hostnamectl set-hostname <ホスト名>
## ユーザ作成
USERNAME=<ユーザー名>
PASSWORD=<パスワード>
useradd ${USERNAME}
echo "${PASSWORD}" | passwd --stdin ${USERNAME}
usermod -G ec2-user,adm,wheel,systemd-journal ${USERNAME}
sed -i -e '$ a ${USERNAME} ALL=(ALL) NOPASSWD:ALL' /etc/sudoers
## ログイン設定
sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd
## Amazon Session Manager(SSM)設定
REGION_NAME=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//')
yum install -y "https://s3.${REGION_NAME}.amazonaws.com/amazon-ssm-${REGION_NAME}/latest/linux_amd64/amazon-ssm-agent.rpm"
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent
まとめ
このシェルスクリプトも時代や環境に合わせて徐々に更新していく必要があります。
みなさんの考えた最強のセットアップ用シェルスクリプトも是非教えて下さいね。
コメント