Edited at

EC2起動時に自動でユーザーを追加し、諸々の設定をする方法メモ


概要

user-dataを用いることで、EC2の起動時に任意のシェルを実行することができます。

それを用いて、①EC2起動時にユーザを作成し②そのパスワードを設定し③パスワード認証でのsshを許可させる、という処理を行います。


シェルの中身

CentOS7で動くことを確認しています。

#! /bin/bash

# ユーザの追加
useradd testuser
# パスワードの設定
echo "testpasswd" | sudo passwd --stdin testuser
# sudoの許可
sed -i -e '$ a testuser ALL=(ALL) NOPASSWD:ALL' /etc/sudoers
# sshの際、パスワードでの認証の許可
sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
# sshdを再起動し、設定を反映
systemctl restart sshd


おまけ

AMIからEC2インスタンスを立ち上げると、Volumeが作成されます。私の会社では、この作成されたVolumeにタグをつけなければならないことになっているのですが、このタグ付の作業も、user-dataの中で行えます。

以下のスクリプトは、aws-cliがインストールされている環境であれば動くと思います。

# このシェルが動いているEC2のインスタンスidを取得

instance_id=$(curl -s 169.254.169.254/latest/meta-data/instance-id)
# このシェルが動いてるEC2のregionを取得
az=$(curl -s 169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az%[a-z]}
# インスタンスidから、インスタンス名を取得
instance_name=$(aws ec2 describe-instances --output text --region $region --instance-ids $instance_id \
--query 'Reservations[].Instances[].Tags[?Key==`Name`].Value')
# このインスタンスに紐づくVolumeのidを取得
volume_id=$(aws ec2 describe-instances --output text --region $region --instance-ids $instance_id \
--query 'Reservations[].Instances[].BlockDeviceMappings[?DeviceName==`/dev/sda1`].Ebs[].VolumeId')
# タグをつける
aws ec2 create-tags --region $region --resources $volume_id --tags Key=SomeKey,Value=SomeValue
aws ec2 create-tags --region $region --resources $volume_id --tags Key=OtherKey,Value=OtherValue