【AWS初学者向け】テスト用EC2作成時の面倒くさいことを代わりにシェルスクリプトにやってもらおう!


1.はじめに

AWSというのはとても便利で、重いサーバー,ラックを用意しなくても誰でも簡単にサーバー構築が出来る。
そしてそれと同じように簡単にサーバーを削除することが出来る。
作っては消して作っては消してを世のハンズオンドキュメント,動画の数だけ行うのだ。
しかし何度も何度も構築するにあたってやりたいことは違えど毎回同じ作業が発生するのだ。
駆け出しであろうとIT従事者であるからには、そういう同じ無駄な作業を無くしていかなければならない。
今回はシェルでの無駄作業を自分は一切コマンドを打つことなく、代わりにシェルスクリプトに自動でやってもらおうというハンズオン記事である。
(ハンズオンと言ってもシェルスクリプトを書くだけだが..)
同時にシェルスクリプト、viの訓練にもなるので初学者の方は是非見ていって欲しい。

2.概要

今回の流れは、
"EC2(Amazon Linux2)を構築する際、作成時の「ステップ3:インスタンスの詳細の設定」「ユーザーデータ(テキストで)」にあらかじめ作成しておいたシェルスクリプトを挿入、構築後の面倒なコマンド操作を自動でシェルスクリプトに行ってもらう"
となっている。
注意事項として既にネットワーク周りの設定(VPC,Subnet等)は構築済でEC2を構築した段階で外と通信が行われる前提で話を進めていく。

※使用イメージはAmazon Linux2です。

3.シェルスクリプトの作成

早速だが本題のシェルスクリプトを作成する。
下記コードが今回の"面倒くさいから自動化しちゃおうスクリプト"になる。

面倒くさいから自動化しちゃおうスクリプト
#!/bin/bash

# パッケージアップデート
sudo yum update -y

# カレントディレクトリ
cd /

# 言語設定
sudo localectl set-locale LANG=ja_JP.utf8
source /etc/locale.conf

# 時刻同期
sudo sed -ie 's/ZONE=\"UTC\"/ZONE=\"Asia\/Tokyo\"/g' /etc/sysconfig/clock
sudo sed -ie 's/UTC=true/UTC=false/g' /etc/sysconfig/clock
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# ホスト名の変更
HOST_F=ホスト名.ドメイン名
HOST_S=ホスト名
sudo sed -ie "s/localhost\.localdomain/${HOST_F}/g" /etc/sysconfig/network
#/etc/hostsにホスト名を追加
ip addr show | grep "inet.*eth0" | awk {'print $2'} | sed -e 's/\(.*\)\/.*$/\1/g' | xargs -I{} echo "{} ${HOST_F} ${HOST_S}" >> /etc/hosts

# ユーザの作成 & passwd設定 ※『ユーザー名』を貴方の好きなユーザー名に、『パスワード』を好きなパスワードに変換して下さい
sudo useradd ユーザー名
sudo echo "パスワード" | sudo passwd --stdin ユーザー名
# ec2-userと同じグループに所属させる
sudo usermod -G ec2-user,adm,wheel,systemd-journal chibiharu
# su権限を与える
sudo sed -i -e '$ a ユーザー名 ALL=(ALL)    NOPASSWD:ALL' /etc/sudoers
# パスワード認証でのSSH接続の許可
sudo sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
# sshdを再起動し、設定を反映 ※これで作成したユーザーによるSSH接続(passwd認証)が可能になります。
sudo systemctl restart sshd
# ec2-userの削除
sudo userdel ec2-user

# 王道のApacheをセットアップ ※nginxを使用する際はhttpdをnginxに変える
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
sudo yum install -y httpd mariadb-server
sudo systemctl start httpd
sudo systemctl enable httpd
sudo usermod -a -G apache ユーザー名
sudo chown -R ユーザー名:apache /var/www
sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
sudo find /var/www -type f -exec sudo chmod 0664 {} \;
sudo yum install -y php php-mbstring
sudo yum install -y php-xml

テスト用インスタンスに必要な初期設定はこれくらいになるはず。
こんなんも自動化したら楽になるといったものがあれば是非コメントでいただきたい。

4.EC2インスタンスの構築

では実際にシェルスクリプトをユーザーデータに貼り付けてEC2を構築してみよう。
EC2の構築講座ではないので構築手順等については他の記事がいくらでもあるので参照していただきたい。

手順1:上記スクリプトの必要箇所を修正してコピー
手順2:EC2を作成、【ステップ3:インスタスの詳細の設定】下部にある『ユーザーデータ』にスクリプトを貼り付ける ※下記画像参照


手順3:最低限インターネットと通信ができるようにEC2インスタンスを作成する

5.動作確認

では作成したEC2インスタンスにて、スクリプトが実行されており、設定が反映されているか確認してみよう。

手順1:作成したEC2インスタンスにSSH接続 ※作成したユーザー名とパスワードを入力して下さい
手順2:以下コマンドにて各設定が反映されているか確認 ※下記コマンド参照

【コマンド確認】


# ホスト名が変わっているか
cat /etc/hosts

#時刻同期が出来ているか
date

#ユーザー名が変わっているか
cat /etc/passwd | grep 設定したユーザー名

#ec2-userが削除できているか
cat /etc/passwd | grep ec2-user

【Apache確認】
EC2インスタンスのPublicIPAddressをコピーしてブラウザのURLに貼り付けて検索実行。
Apacheのページが表示されたら確認OK。

5.まとめ

といった感じでうまい具合に面倒くさい作業が自動化されたわけだ。
もちろん人によって面倒くさいは変わってくると思うので、各々が好きにスクリプトをカスタムするのをおすすめする。
実はシェルスクリプト以外にもユーザーデータを使用しての自動化は行えるが、今回は一番ポピュラーなシェルスクリプトを使用させていただいた。
上記でも書いたがこういうことを構築時に自動化したい等あれば是非コメント等いただきたい。
では以上で失礼します。