概要
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