AWS Cloud9 に PHP 開発環境構築 (moodle)

moodle のお勉強とプラグイン開発のための環境として
AWS Cloud9 に開発環境を構築しましたので手順を残しておきます。

:::note 
moodle を例に環境構築していますが、PHPの汎用的な開発・デバッグ環境として利用できると思います。
:::

#　利用環境
- [AWS Cloud9](https://aws.amazon.com/jp/cloud9/) (t3.small + Amazon Linux2)
- [PHP 8.0](https://www.php.net/)
- [MariaDB 10.5](https://mariadb.org/)
- [Moodle v3.11.5](https://docs.moodle.org/3x/ja/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)

# 環境構築

AWS CloudShell で下記コマンドを実行し、Cloud9 環境を作成する。

```
aws cloud9 create-environment-ec2 \
--name MoodleDev \
--instance-type t3.small \
--image-id amazonlinux-2-x86_64
```

コマンドが成功すると `environmentoId` が表示される

```text:Result
{
    "environmentId": "xxxxxxxxxxxxxxxxx"
}
```

:::note warn
default VPC を削除してしまっている場合は、次セクションの操作で EC2 を作成するサブネットを指定して環境構築します。
:::
## (オプション)Default VPC 以外に環境作成

まず、現リージョンのサブネットを確認する

```
aws ec2 describe-subnets --query "Subnets[*].[{ID:SubnetId,CIDR:CidrBlock},Tags[?Key=='Name'].Value][]"
```

```text:Result
    {
        "ID": "subnet-0697cc495da4d4c45",
        "CIDR": "172.21.20.0/24"
    },
    [
        "PublicSub"
    ],
    {
        "ID": "subnet-03d83b3c53b2e1155",
        "CIDR": "10.0.100.0/24"
    },
    [
        "Pri-DebSubNet"
    ],
```


作成するサブネットを指定して Cloud9 環境を作成する。

```
aws cloud9 create-environment-ec2 \
--name MoodleDev \
--instance-type t3.small \
--image-id amazonlinux-2-x86_64 \
--subnet-id subnet-xxxxxxxxxxxxx
```

# 環境設定
以下の作業は`Cloud9`の`Terminal` で行う

## タイムゾーン設定
タイムゾーンを`日本`に変更します

```
sudo timedatectl set-timezone Asia/Tokyo
```

設定を確認します

```
date
```

> Sun Feb 13 14:07:38 JST 2022

## PHP 環境設定
インストールされているPHPは　**7.2**なので、**8.0**をインストールします。


PHP 7.2 系を削除

```
sudo amazon-linux-extras disable lamp-mariadb10.2-php7.2
sudo amazon-linux-extras disable php7.2
sudo yum -y remove php-* 
```

PHP 8.0 系をインストール

```
sudo amazon-linux-extras enable php8.0
sudo amazon-linux-extras install -y php8.0
sudo yum -y install php-devel
sudo yum -y install php-pear
```

デバッガインストール

```
sudo pecl install xdebug
```

:::note warn
下記警告が出力されるが、別途設定してあるので問題ない
:::

> configuration option "php_ini" is not set to php.ini location
> You should add "zend_extension=/usr/lib64/php/modules/xdebug.so" to php.ini

### 拡張パッケージインストール(moodle用オプション)
#### zip パッケージ

[php-zip](https://www.php.net/manual/ja/book.zip.php)

```
sudo yum -y install libzip-devel 
sudo pecl install zip
```

:::note warn
下記 Segmentation fault が出力されるが、別途設定してあるので問題ない
:::

> configuration option "php_ini" is not set to php.ini location
> You should add "extension=zip.so" to php.ini
> Segmentation fault

#### 日本語パッケージ

[php-mbstring](https://www.php.net/manual/ja/book.mbstring.php)

```
sudo yum -y install php-mbstring
```
インストールが成功したら設定ファイルを作成する。

```/etc/php.d/20-mbstring.ini
; Enable mbstring extension module
extension=mbstring

; ↓ こちらを追記。 　↑ こちらは元々記載されている。
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
```

#### グラフィックライブラリ
[php-gd](https://www.php.net/manual/ja/book.image.php)

```
sudo yum -y install php-gd
```

#### 国際化関数
[php-intl](https://www.php.net/manual/ja/book.intl.php)

```
sudo yum -y install php-intl
```

### PHP 設定変更(moodle用オプション)
#### POST できる上限数変更
`max_input_vars` パラメータを変更する 

```/etc/php.ini
; ↓ 元々コメントアウトされているので、非コメント化して値を変更
max_input_vars = 5000
```

## xdebug 設定
Cloud9 IDE がデバッグできるように xdebug を設定します。
### 設定ファイル変更
`xdeubg 3`の設定を追加する。

```/etc/php.d/30-xdebug.ini
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.mode=debug
;; ↓ こちらを追記。 　↑ こちらは元々記載されている。
xdebug.start_with_request=Yes
xdebug.log=/var/log/xdebug.log 
```

### xdebug ログファイル準備

```
sudo touch /var/log/xdebug.log
sudo chmod 666 /var/log/xdebug.log
```

### Cloud 9 IDE の xdebug 追加
Cloud9 IDE のランナーを追加する
[AWS Cloud9 統合開発環境 (IDE) でビルダー、ランナー、デバッガーの操作 ドキュメント](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/build-run-debug.html)

```
mkdir /home/ec2-user/environment/.c9/runners/
```

```/home/ec2-user/environment/.c9/runners/xdebug.run
// This file overrides the built-in PHP (built-in web server) runner
// For more information see http://docs.aws.amazon.com/console/cloud9/change-runner
{
  "script": [
   "cat "
  ],
  "selector": "^.*\\.(php)$",
  "working_dir": "$project_path",
  "debugger": "xdebug",
  "debugport": 9003,
  "info": "Starting PHP xdebug Server",
  "trackId": "PHPServer"
}
```
## httpd 設定
### DocumentRoot 変更

```/etc/httpd/conf/httpd.conf 
# 元々ある DocumentRoot をコメントアウト
# DocumentRoot "/var/www/html"

# 下記パラメータを追記
DocumentRoot "/home/ec2-user/environment"
<Directory "/home/ec2-user/environment">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

```

### パーミッション変更
Apache プロセスが、プロジェクトツリーにアクセスできるようにパーミンション変更

```
cd /home
chmod 777 ec2-user
```

## サーバ再起動
各サーバプロセスを再起動しておく

```
sudo systemctl restart httpd
sudo systemctl restart php-fpm
```

## EC2 セキュリティグループ設定
ブラウザからどこからでもアクセスできるようにセキュリティグループのインバウンドルールを設定する。

### セキュリティグループ一覧取得
設定変更するセキュリティグループを特定する。

```
aws ec2 describe-security-groups --query "SecurityGroups[].[GroupName,GroupId]" --output table     
```

```text:Result
--------------------------------------------------------------+---------------+
|                          DescribeSecurityGroups             |               |
+-------------------------------------------------------------+---------------+
|  aws-cloud9-MoodleDev-xxxxxxx-InstanceSecurityGroup-yyyyyy  |  sg-hogehoge  |
|  default                                                    |  sg-fugafuga1 |
|  default                                                    |  sg-fugafuga2 |
+-------------------------------------------------------------+---------------+
```

`aws-cloud9` から始まるグループの `ID` をメモする。

### セキュリティグループ変更
Cloud9 で使用している**EC2**セキュリティグループのインバウンドルールを追加する。

[AWS-ドキュメント](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-ec2-sg.html#configuring-a-security-group)

```
aws ec2 authorize-security-group-ingress --protocol tcp --port 80 --cidr 0.0.0.0/0 --group-id {セキュリティグループID} 
```

結果は以下の通りになる

```text:Result
{
    "Return": true,  // ←　成功を表す
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-mohemohe", 
            "FromPort": 80,  // ← 80 番
            "GroupOwnerId": "1234567890", 
            "ToPort": 80, 　　　　　　// ← 80 番
            "IpProtocol": "tcp", 
            "CidrIpv4": "0.0.0.0/0", 
            "GroupId": "sg-hogehoge", 
            "IsEgress": false
        }
    ]
}
```

## 動作確認
### EC２ IPアドレス確認
EC2 インスタンスのパブリックIPアドレスを確認しておく

[aws ec2 describe-instances コマンドドキュメント](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)

```
aws ec2 describe-instances --query "Reservations[*].Instances[*].PublicIpAddress"
```

```text:Result
[
    [
        "52.194.219.49"
    ]
]
```

### PHP 動作確認
`phpinfo()`を出力する準備をするためのファイルを作成する。

```/home/ec2-user/environment/info.php
<?php phpinfo(); ?>
```

正しく出力されるか確認する
(IPAddressはサンプルです。[ここ](#EC２_IPアドレス確認)で取得したIPアドレスを入力します。）

```
curl http://52.194.219.49/info.php 
```

> ＜html＞〜＜/html＞

#### ブラウザでアクセスする
上記URLにブラウザでアクセスして、PHP の情報が表示されることを確認する。

<!---------------------------------------------------->

# ここから下は moodle を例にセットアップします。
moodle以外でも、ご自身のプロジェクトを展開することによってさまざまな
PHPプロジェクトの開発環境に対応できると思います。

## MariaDB インストール
### リポジトリ追加
デフォルトのままだと `5.x`系のリポジトリを参照してしまうので、`10.5系`のリポジトリを追加する

```/etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

### インストール
もともとインストールされている `MariaDb`のコンポーネントが `php7.2系`なので削除する。

インストールされているパッケージを確認する

```
yum list installed | grep mariadb
```

```Text:Result
mariadb.x86_64                 3:10.2.38-1.amzn2.0.1          @amzn2extra-lamp-mariadb10.2-php7.2
mariadb-common.x86_64          3:10.2.38-1.amzn2.0.1          @amzn2extra-lamp-mariadb10.2-php7.2
mariadb-config.x86_64          3:10.2.38-1.amzn2.0.1          @amzn2extra-lamp-mariadb10.2-php7.2
mariadb-libs.x86_64            3:10.2.38-1.amzn2.0.1          @amzn2extra-lamp-mariadb10.2-php7.2
```

パッケージを削除する

```
sudo yum -y remove maria*
```

新しい`MariaDB`をインストールする

```
sudo yum -y install mariadb
sudo yum -y install mariadb-server 
```

`MariaDB`を起動する

```
sudo systemctl start mariadb 
```

### MariaDB ユーザ作成
データベースに接続して、DBのユーザを作成する

MariaDB に接続する

```
sudo mysql -h localhost -P 3306 -u root
```

:::note
DBでのコマンドが成功した場合は、以下の結果が表示される
Query OK, 0 rows affected (0.001 sec)
:::

新しいユーザを作成し、権限を付与する

```
CREATE USER moodleuser@localhost IDENTIFIED BY 'moodle';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,CREATE TEMPORARY TABLES,DROP,INDEX,ALTER ON moodle.* TO moodleuser@localhost;
```

作成されたユーザを確認する

```
SELECT User, Host FROM mysql.user;
```

```text:Result
+-------------+----------------------------------------------+
| User        | Host                                         |
+-------------+----------------------------------------------+
|             | ip-10-0-1-88.ap-northeast-1.compute.internal |
|             | localhost                                    |
| mariadb.sys | localhost                                    |
| moodleuser  | localhost                                    |
| mysql       | localhost                                    |
| root        | localhost                                    |
+-------------+----------------------------------------------+
6 rows in set (0.001 sec)
```

### ユーザパスワード設定

```
set PASSWORD for moodleuser@localhost=PASSWORD('moodle');
```

一度、データベースから切断する

```
exit
```

### データベース作成
作成した`moodleuser`でログインし直してデータベースを作成する

```
mysql -h localhost -P 3306 -u moodleuser  -p
```
パスワード入力を促されるので [ここで設定したパスワード](#ユーザパスワード設定)を入力する。
> Enter password: moodle  (←入力したパスワードは表示されない)

データベースを作成する

```
CREATE DATABASE moodle ;
```

データベースが作成できたらデータベースから切断する

```
exit
```

## Moodle インストール
git リポジトリからクローンする

```
cd ~/environment
git clone https://github.com/moodle/moodle.git
cd moodle
```

利用したいバージョンに切り替える

```
git checkout v3.11.5
```

### データフォルダ作成
moodle のテンポラリデータフォルダを作成する

```
cd ~/environment
mkdir moodledata
```

moodleサーバセットアップ時にコンフィグファイルを書き込むので、書き込みパーミッション設定する

```
chmod 777 moodledata
chmod 777 moodle
```

## moodle セットアップ
ブラウザでURLアクセスする。

```
http://52.193.176.188/moodle/
```
### 言語を選択してください
日本語 (ja)

### パスを確認する
データディレクトリはそのまま

### データベースドライバを選択する
`MariaDB (native/mariadb)` を選択する

### データベース設定

| 項目 | 設定値 |
| --- | --- |
|データベースホスト|localhost (デフォルト)|
|データベース名|moodle (デフォルト)|
|データベースユーザ|moodleuser|
|データベースパスワード|moodle|
|テーブル接頭辞|mdl_ (デフォルト)| 
|データベースポート|3306|

### 著作権表示
内容を確認し`続けるボタン`をクリック

### インストレーション - Moodle 3.11.5 (Build: 20220117)
内容を確認し`続けるボタン`をクリック
（この後しばらく待ち時間が発生）

### プラグインインストール結果画面）
内容を確認し`続けるボタン` をクリック

### 一般設定
- パスワード
- 姓
- 名
- メールアドレス
- タイムゾーン

入力し`プロファイルを更新する`をクリック

### フロントページ設定
- 長いサイト名
- サイト省略名
- [新しい設定]-[送信メール設定] を`空っぽ`に

入力し`変更を保存する`をクリック