環境
Amazon Linux2
はじめに
「AWS Hands-on for Beginners 〜 スケーラブルウェブサイト構築編 〜」 は凄く分かり易く、なかなかいい教材で勉強になりました。これからAWSを始める人にとってはお薦めの教材です。
この教材の第3章(Amazon EC2の作成)で、ユーザーデータのスクリプトを設定する箇所があります。ユーザーデータとは、EC2が起動されたときに自動で流れるスクリプトを設定する箇所です。教材では「予め用意されているスクリプトをコピペで張り付けてください」と言って終わっています。この際なので、コマンドの中身について詳しく解説する記事を書いてみました。
スクリプトの概要
ハンズオンでやりたいことは、EC2にWordPressをインストールして、インターネット経由でインバウンドからHTTPを利用して、WordPressにアクセスできるようにすることです。
スクリプトでは、PHP、MySQL、WordPressをそれぞれインストールしています。また、Amazon Linux2ではデフォルトでhttpdがプレインストールされていないため、httpdをインストールしてサービスを起動しています。
#!/bin/bash
yum -y update
yum -y install php httpd mysql
PHP_VERSION=`php -v | head -n 1 | awk '{print $2}' | awk -F "." '{print $1}'`
while [ ${PHP_VERSION} -ne 7 ]
do
amazon-linux-extras install php7.4 -y
PHP_VERSION=`php -v | head -n 1 | awk '{print $2}' | awk -F "." '{print $1}'`
done
yum -y install php-mbstring php-xml
wget http://ja.wordpress.org/latest-ja.tar.gz -P /tmp/
tar zxvf /tmp/latest-ja.tar.gz -C /tmp
cp -r /tmp/wordpress/* /var/www/html/
chown apache:apache -R /var/www/html
systemctl enable httpd.service
systemctl start httpd.service
スクリプトの解説
$yum -y update
$yum -y install php httpd mysql
Amazon Linux2はRedHat系のOSをベースにして作られているため、パッケージ管理システムにはDebian系のOSで使われるaptではなくyumが使われます。RedHat系のパッケージ管理システムには、yumの他にrpmもあります。rpmとyumの違いは、rpmは依存関係を解決してくれないのに対し、yumは依存関係を解決してくれます。Debian系OSにあるdpkgコマンドに該当する、RedHat系OSのコマンドがrpmということになります。また、Debian系OSにあるaptコマンドに該当する、RedHat系OSのコマンドがyumということになります。
上記コマンドでは、yum updateでインストール済のパッケージを最新の状態にした後、yum installでPHP、httpd、MySQLの3つのパッケージをインストールしています。
PHP_VERSION=`php -v | head -n 1 | awk '{print $2}' | awk -F "." '{print $1}'`
このコマンドでは、PHPのメジャーバージョンを取得して、環境変数であるPHP_VERSIONに値をセットしています。
$echo PHP_VERSION
7
PHP_VERSIONの値を表示すると7が表示されます。yumでインストールしたPHPのメジャーバージョンが7であるということになります。
ワンライナーで記述されたコマンドを、いちステップづつ分解して解説してみます。
$php -v | head -n 1
PHP 7.4.33 (cli) (built: Nov 19 2022 00:22:13) ( NTS )
PHPのバージョン情報を表示すると複数行が表示されるため、先頭の1行だけに絞り込んで表示しています。
$php -v | head -n 1 | awk '{print $2}'
7.4.33
awkはCSV形式の列から特定のカラムを取得するコマンドです。print $2で先頭から2つ目の列を取得しています。ちなみに、print $0を指定すると全ての列が取得されます。
$php -v | head -n 1 | awk '{print $2}' | awk -F "." '{print $1}'
7
awkコマンドでオプションを指定しなければ、デフォルトでカラムの区切文字はスペースになりますが、Fオプションを付けることで、区切文字を変更することができます。上記コマンドでは「.」文字で区切られた文字列から、1カラム目の文字列を取得しています。
while [ ${PHP_VERSION} -ne 7 ]
do
amazon-linux-extras install php7.4 -y
PHP_VERSION=`php -v | head -n 1 | awk '{print $2}' | awk -F "." '{print $1}'`
done
環境変数 PHP_VERSIONの値が7でなければ、while文の中の処理を実行しています。
amazon-linux-extras install php7.4 -y
amazon-linux-extrasは、Amazon Linux2オリジナルのパッケージ管理システムです。つまり、yumのAmazon Linux2版ということになります。yumを使ってPHPの最新バージョンをインストールして、メジャーバージョンが8以上であった場合は、while文の中のコマンドが実行されます。
while文の中では、yumではなくamazon-linux-extrasが使われています。なぜ、この場合だけamazon-linux-extrasが使われるのかは分かりません。恐らく、yumを使うと何らかの不都合が生じる可能性があるため、それを回避してのことだろうと思われます。
yum -y install php-mbstring php-xml
PHPの拡張モジュールをインストールしています。PHPをインストールしたときに、標準ではインストールされないモジュールを個別にインストールしています。php-mbstringは、PHPでマルチバイト文字が利用できるようになるモジュールです。つまり、日本語をが利用できるようにするためのモジュールです。php-xmlは何かは分かりませんが、名前から察するに、XMLを扱うときに必要なモジュールだと思われます。
$wget http://ja.wordpress.org/latest-ja.tar.gz -P /tmp/
WordPressをインストールしています。WordPressはPHPのように、yumでインストールするようにはなっておらず、wgetでダウンロードすることになります。なぜ、yumでインストールができないのかといえば、そもそも、yumのリポジトリに登録されていないからです。なぜ、yumのリポジトリに登録されていないのかといえば、そこまでは分かりません。ライセンスの問題なのか、政治的な拘りでもあるのでしょうか?
オプションPでダウンロード先のフォルダを指定することができます。latest-ja.tar.gzファイルをローカルの/tmpの中にダウンロードしています。
$tar zxvf /tmp/latest-ja.tar.gz -C /tmp
ダウンロードしたアーカイブファイルをtarコマンドを使って展開しています。オプションに、zxvfを指定しています。各オプションの意味です。
オプションz : アーカイブを展開する
オプションx : アーカイブからファイルを抽出する
オプションv : 処理結果の詳細を表示する
オプションf : アーカイブファイル名を指定する
オプションCを付けると、アーカイブの展開先のディレクトリを指定することができます。
$cp -r /tmp/wordpress/* /var/www/html/
アーカイブファイルを展開すると、/tmp/wordpress ディレクトリが展開されます。このディレクトリの全てのファイルを、/var/www/html/ にコピーしています。
$chown apache:apache -R /var/www/html
chownはユーザー所有権とグループ所有権を変更するコマンドです。ユーザー所有権とグループ所有権をそれぞれ、apacheに変更しています。オプションRで、所有権を変更するディレクトリを指定することができます。
$ls -l /var/www | grep html
drwxr-xr-x 5 apache apache 4096 Aug 2 00:44 html
lsコマンドで、ユーザー所有権とグループ所有権が共に、apacheになっていることが確認できます。
systemctl enable httpd.service
httpdサービスが自動起動されるようにしています。systemctlコマンドが使えるということは、initにはSystemVinitではなくsystemdが採用されているということになります。つまり、Amazon Linux2はRedHat6ベースではなく、RedHat7ベースで作られているということが伺えます。
systemctl start httpd.service
httpdを起動しています。