AWS Hands-on for Beginnersで使ったユーザーデータの解説

## 環境
Amazon Linux2

## はじめに
**「AWS Hands-on for Beginners 〜 スケーラブルウェブサイト構築編 〜」** は凄く分かり易く、なかなかいい教材で勉強になりました。これからAWSを始める人にとってはお薦めの教材です。

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Scalable-2022-confirmation_386.html

この教材の第３章（Amazon EC2の作成）で、ユーザーデータのスクリプトを設定する箇所があります。ユーザーデータとは、EC2が起動されたときに自動で流れるスクリプトを設定する箇所です。教材では「予め用意されているスクリプトをコピペで張り付けてください」と言って終わっています。この際なので、コマンドの中身について詳しく解説する記事を書いてみました。

## スクリプトの概要

ハンズオンでやりたいことは、EC2にWordPressをインストールして、インターネット経由でインバウンドからHTTPを利用して、WordPressにアクセスできるようにすることです。

スクリプトでは、PHP、MySQL、WordPressをそれぞれインストールしています。また、Amazon Linux2ではデフォルトでhttpdがプレインストールされていないため、httpdをインストールしてサービスを起動しています。

```script.sh
#!/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
```

## スクリプトの解説

```cmd.sh
$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の３つのパッケージをインストールしています。

```cmd.sh
PHP_VERSION=`php -v | head -n 1 | awk '{print $2}' | awk -F "." '{print $1}'`
```

このコマンドでは、PHPのメジャーバージョンを取得して、環境変数であるPHP_VERSIONに値をセットしています。

```cmd.sh
$echo PHP_VERSION
7
```

PHP_VERSIONの値を表示すると7が表示されます。yumでインストールしたPHPのメジャーバージョンが7であるということになります。

ワンライナーで記述されたコマンドを、いちステップづつ分解して解説してみます。

```cmd.sh
$php -v | head -n 1
PHP 7.4.33 (cli) (built: Nov 19 2022 00:22:13) ( NTS )
```

PHPのバージョン情報を表示すると複数行が表示されるため、先頭の１行だけに絞り込んで表示しています。

```cmd.sh
$php -v | head -n 1 | awk '{print $2}'
7.4.33
```

awkはCSV形式の列から特定のカラムを取得するコマンドです。**print $2**で先頭から２つ目の列を取得しています。ちなみに、**print $0**を指定すると全ての列が取得されます。

```cmd.sh
$php -v | head -n 1 | awk '{print $2}' | awk -F "." '{print $1}'
7
```

awkコマンドでオプションを指定しなければ、デフォルトでカラムの区切文字はスペースになりますが、Fオプションを付けることで、区切文字を変更することができます。上記コマンドでは「.」文字で区切られた文字列から、１カラム目の文字列を取得しています。

```cmd.sh
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文の中の処理を実行しています。

```cmd.sh
amazon-linux-extras install php7.4 -y
```

**amazon-linux-extras**は、Amazon Linux2オリジナルのパッケージ管理システムです。つまり、yumのAmazon Linux2版ということになります。yumを使ってPHPの最新バージョンをインストールして、メジャーバージョンが８以上であった場合は、while文の中のコマンドが実行されます。

while文の中では、yumではなくamazon-linux-extrasが使われています。なぜ、この場合だけamazon-linux-extrasが使われるのかは分かりません。恐らく、yumを使うと何らかの不都合が生じる可能性があるため、それを回避してのことだろうと思われます。

```cmd.sh
yum -y install php-mbstring php-xml
```

PHPの拡張モジュールをインストールしています。PHPをインストールしたときに、標準ではインストールされないモジュールを個別にインストールしています。php-mbstringは、PHPでマルチバイト文字が利用できるようになるモジュールです。つまり、日本語をが利用できるようにするためのモジュールです。php-xmlは何かは分かりませんが、名前から察するに、XMLを扱うときに必要なモジュールだと思われます。

```cmd.sh
$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の中にダウンロードしています。

```cmd.sh
$tar zxvf /tmp/latest-ja.tar.gz -C /tmp
```

ダウンロードしたアーカイブファイルを**tar**コマンドを使って展開しています。オプションに、zxvfを指定しています。各オプションの意味です。


>オプションz ： アーカイブを展開する
>オプションx ： アーカイブからファイルを抽出する
>オプションv ： 処理結果の詳細を表示する
>オプションf  ： アーカイブファイル名を指定する

オプションCを付けると、アーカイブの展開先のディレクトリを指定することができます。

```cmd.sh
$cp -r /tmp/wordpress/* /var/www/html/
```

アーカイブファイルを展開すると、/tmp/wordpress ディレクトリが展開されます。このディレクトリの全てのファイルを、/var/www/html/ にコピーしています。

```cmd.sh
$chown apache:apache -R /var/www/html
```

**chown**はユーザー所有権とグループ所有権を変更するコマンドです。ユーザー所有権とグループ所有権をそれぞれ、apacheに変更しています。オプションRで、所有権を変更するディレクトリを指定することができます。

```cmd.sh
$ls -l /var/www | grep html
drwxr-xr-x 5 apache apache 4096 Aug  2 00:44 html
```

**ls**コマンドで、ユーザー所有権とグループ所有権が共に、apacheになっていることが確認できます。

```cmd.sh
systemctl enable httpd.service
```

httpdサービスが自動起動されるようにしています。systemctlコマンドが使えるということは、initにはSystemVinitではなくsystemdが採用されているということになります。つまり、Amazon Linux2はRedHat6ベースではなく、RedHat7ベースで作られているということが伺えます。

```cmd.sh
systemctl start httpd.service
```

httpdを起動しています。