Amazon Linux2 のLAMP環境、PHP7.2とMariaDB10.2.10をUserDataで初期設置してみた

はじめに

AWSチームのすずきです。

Amazon Linux2 のAMIを利用して起動したEC2、 UserDataを利用して、PHP7.2、MariaDB10.2、WordPressの推奨バージョンに準じたLAMP環境を構築する機会がありましたので紹介します。

参考

-チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする

構成図

設定

  • AMI ID : amzn2-ami-hvm-2.0.20190508-x86_64-gp2 (ami-00d101850e971728d)

UserData

  • #cloud-config 形式でUserDataを記述します。
  • Amazon Linux 2 のエクストラライブラリ lamp-mariadb10.2-php7.2 を有効化します。

Amazon Linux 2のExtras Library(amazon-linux-extras)を使ってみた

mariadb

  • mariadb-server(mariadb-10.2.10-2.amzn2.0.3.x86_64) をインストールします。
  • MySQLのDB設定 /etc/my.cnfを行います。
    • 文字コードcharacter-set-serve UTF-8
    • クエリキャッシュを有効化 query_cache_type=1し、キャッシュ容量は32MBに拡張します。
  • DBユーザ設定を行います。
    • mysql_secure_installation コマンド相当のSQLを実行し、DBのセキュリティを強化します。
  • /root/.my.cnf にDB認証情報を反映、OSのroot ユーザによるDBアクセスを可能にします。

httpd

  • httpd(httpd-2.4.39-1.amzn2.0.1.x86_64)、php7.2(php-common-7.2.16-1.amzn2.0.1.x86_64) をインストールします。
  • php7.2 と同時にインストールされないが、WordPressなどで利用される事の多い、xml, mbstring , intl, mcrypt , gd などは追加インストールします。
  • ELBとしてALBが利用される事に備え、keepalive、mod_http2 設定を行います。

AmazonLinux2のhttpdをALB経由で公開するWeb環境で発生していた、SafariのHTTPS接続エラーを改善してみた

  • ELBのヘルスチェック先となるindex.htmlを設置します。
  • クロール禁止を示す robots.txt を設置。開発、検証環境のコンテンツが検索サイトに意図せず登録される事を回避します。

#cloud-config
packages:
  - jq
  - httpd
runcmd:
  yum update -y
  # lamp-mariadb10.2-php7.2
  - amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
  # mariadb
  - yum install mariadb-server -y
  - cp -b /root/cloud-init/mysql/my.cnf /etc/my.cnf
  ## systemctl
  - systemctl start mariadb
  - systemctl enable mariadb
  ## db-init
  - [ sh, -c, "cat /root/cloud-init/mysql/db-secure_installation.sql | mysql -u root" ]
  - echo -e "[client]\npassword=\"aaaaaaaa\"" > /root/.my.cnf
  - chmod 400 /root/.my.cnf
  # httpd
  ## xml,  mbstring , intl, mcrypt 
  - yum install php-xml php-xmlrpc php-mbstring php-intl php-pecl-mcrypt php-xsl -y
  ## gd
  - yum install php-gd -y
    
  ## keepalive
  - cp /root/cloud-init/httpd/keepalive.conf /etc/httpd/conf.d/keepalive.conf
  ## mod_http2 off
  - sed -i -e "s/^LoadModule/#LoadModule/g" /etc/httpd/conf.modules.d/10-h2.conf
  ## index.html
  - echo "<html><body>$INSTANCE_ID<br>`date`</body></html>" > /var/www/html/index.html

  ## systemctl
  - systemctl start httpd
  - systemctl enable httpd

write_files:
   # /etc/my.cnf |
  - content: |
      [client-server]
      [mysqld]
      query_cache_type=1
      query_cache_size=32M
      character-set-server=utf8
      symbolic-links=0
      !includedir /etc/my.cnf.d
    mode: '000600'
    owner: root
    group: root
    path: /root/cloud-init/mysql/my.cnf

  # mysql_secure_installation (substitution)
  - content: |
      UPDATE mysql.user SET Password=PASSWORD('aaaaaaaa') WHERE User='root';
      DELETE FROM mysql.user WHERE User='';
      DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
      DROP DATABASE test;
      DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
      FLUSH PRIVILEGES;
    mode: '000600'
    owner: root
    group: root
    path: /root/cloud-init/mysql/db-secure_installation.sql

   # httpd
  - content: |
      KeepAlive On
      KeepAliveTimeout 120
    mode: '000644'
    owner: root
    group: root
    path: /etc/httpd/conf.d/keepalive.conf

  - content: |
      User-agent: *
      Disallow: /
    mode: '000644'
    owner: root
    group: root
    path: /var/www/html/robots.txt

動作確認

  • OSの root 権限を利用して、mysql コマンドによるDBの動作、設定確認を実施しました。
sudo  mysql -u root

クエリキャッシュ

  • query_cache_type が「ON」、query_cache_size が32MBに設定されています。
MariaDB [(none)]> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_strip_comments   | OFF      |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
7 rows in set (0.00 sec)

mysqldump

  • OSの root 権限を利用して、mysqldump コマンドによるDBダンプが出力できる事を確認します。
$ sudo mysqldump -u root --databases mysql
-- MySQL dump 10.16  Distrib 10.2.10-MariaDB, for Linux (x86_64)
--
-- Host: localhost    Database: wordpress_db
-- ------------------------------------------------------
-- Server version	10.2.10-MariaDB
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
(略)
-- Dump completed on 2019-05-16  9:08:06
  • DBダンプ、インポートが出来る事を確認します。
$ sudo mysqldump -u root --databases mysql | gzip > /tmp/dmp.sql.gz
$ zcat /tmp/dmp.sql.gz | sudo  mysql -u root mysql

まとめ

Amazon Linux 2 のAMIを利用した LAMP環境、 EC2インスタンスの起動時に設定、作成する事ができました。

Amazon Linux 2 デフォルトのリポジトリでインストールされるPHP、バージョンは5.4.16(5.4.16-45.amzn2.0.6)となります。

2019年5月時点で、CMSのWordPressが推奨する PHPのバージョンは7.3。 サポート外ながら動作する可能性のあるとされるPHPバージョンも5.6.20以降とされており、 WordPress本体や関連するプラグインは、PHP5.4の環境では正常な動作が期待できない可能性があります。

(WordPress 要件) [https://ja.wordpress.org/about/requirements/] WordPress を実行するには、以下のホスティング環境を推奨します。 PHP バージョン 7.3 以上。 MySQL バージョン 5.6 以上、または MariaDB バージョン 10.1 以上。 HTTPS 対応

エクストラライブラリは Amazon Linux2の LTSサポート外。将来的に新しいPHPへのバージョンアップが必要となる可能性はありますが、 現時点でPHP7のLAMP実行環境をAmazon Linux2で構築される場合には、lamp-mariadb10.2-php7.2 の エクストラライブラリを第一候補としてお試しください。

テンプレート

今回利用したCloudFormationテンプレートです。

sample3