スポンサーリンク

AWSのCloudFormationでWordPressを構築するテンプレートを修正する1

AWSのマネジメントコンソールでデフォルトで選択可能となっているWordPress環境を構築するテンプレートについてWordPress側の動作可能なPHPのバージョンとEC2にインストールされるPHPのバージョンの不一致が原因で使えなくなっていました。
今回はそんなWordPress環境を構築するテンプレートについて一部修正を盛り込んだテンプレートの作成と検証を行いました。
GitHubにパブリックなリポジトリを作成したので実際に使ってみたい方がいましたらそちらからテンプレートを取得してください。
GitHub:imo-tikuwa/aws-cloudformation-templates

CloudFormationでWordPressのスタックを作成する

テンプレートを一から作成するのは難しいので、サンプルテンプレートをベースとします。

パラメータの入力画面です。「WordPress blog」テンプレートではWordPressで使用するMySQLのインストールも行われるため、MySQLデータベースの設定の入力が必要となっています。

ステップ3は今回は特に設定することがなかったのでそのまま次へボタンをクリック。
ステップ4で設定した内容を確認して実際にスタックを作成します。

イベントタブでスタック作成中の状態を確認することができます。「WordPress blog」テンプレートはシンプルなので2~3分で作成が完了すると思います。

出力タブにテンプレートのOutputsセクションにちなんだWebSiteURLが表示されます。

アクセスしてみたところ以下のようなエラーが表示されてしまいました。
サーバーで稼働中のPHPのバージョンは5.3.29、WordPressを動かすにはPHP5.6.20以上が必要とのこと。

PHPの他、httpdとMySQLについて実際にSSHでアクセスしてバージョンを確認してみたところ以下のようになっていました。

PHP5.3.29
httpd2.2.34
MySQL5.5.62

テンプレートを修正する

PHPなどもろもろのバージョンが古いので先ほど作成したテンプレートについて以下のように修正しました。左が修正前、右が修正後になります。
CloudFormationで作成されるEC2インスタンスがAmazon LinuxのためPHPはphp73、MySQLはmysql57、httpdはhttpd24のような名前でインストールすることが出来ます。この辺りは「yum search」だったり「yum list available | grep 〇〇」のようなコマンドでインストールするプログラムの名前を調べる必要があります。
バージョンの件とは関係ないですがインストールされるWordPressについてもデフォルトの英語版から日本語版に変更しています。

修正したテンプレートをアップロードしてスタックの作成を行ってみたところ、今度は正常にWordPressの初期設定画面が表示されることを確認しました。

インストールされた各バージョンについても以下の通り。

PHP7.3.11
httpd2.4.41
MySQL5.7.27

動作確認する

おなじみの管理者ログインをした後の画面。

テスト記事を投稿してみました。
php-gdも併せてインストールしているため縮小画像の生成が行われていることも確認しました。
アップロードについて、デフォルトのテンプレートのままではwordpressディレクトリのパーミッション不足が原因でエラーとなってしまったので設定を後述しています。

その他変更点1 – SSHLocationを変更

「WordPress blog」テンプレートにはSSHのアクセス元を制限するためのパラメータが存在します。
デフォルトは0.0.0.0/0となっており任意のIPを入力可能ですが、セキュリティ的にマイIPのみを許可するのが望ましいと言えます。
また、httpのアクセスに使用する80番ポートについて、デフォルトでは特にアクセス制限は行われていません。誰でもWordPressのインストールが可能となってしまっているので、80番ポートについても同様のアクセス制限を行うことにしました。
インストールが完了したら手動で80番ポートのセキュリティグループだけ0.0.0.0/0に変更してください。
名称を「SSHLocation」から「AccessAllowIP」に変更しました。

その他変更点2 – 日本語化の設定を追加

/tmp以下にjp-settingというbashスクリプトを新規作成しました。
wordpressの方だと設定ファイルの作成は「install_wordpress」で行い、実行は「configure_wordpress」で行っていました。以下のドキュメントにあるようにfilesがcommandsより先に実行されるとのことなのでconfigSetの分割を行わずに1つの設定内で足りるような気がしましたがよくわかりませんでした(^q^
参考:AWS::CloudFormation::Init – AWS CloudFormation

cfn-init ヘルパースクリプトは、次の手順でこれらの設定セクションを処理します。パッケージ、グループ、ユーザー、ソース、ファイル、コマンド、そしてサービスの順です。別の順番にする場合は、セクションを別の設定キーに分割し、設定キーが処理される順序を指定する configset を使用します。

jp-settingについては以下のような記述となりました。
ついでにyum updateも行っています。

"AWS::CloudFormation::Init": {
    "configSets": {
        "wordpress_install": [
            "install_cfn",
+            "init_jp_setting",
            "install_wordpress",
            "configure_wordpress"
        ]
    },
+    "init_jp_setting": {
+        "files": {
+            "/tmp/jp-setting": {
+                "content": {
+                    "Fn::Join": [
+                        "",
+                        [
+                            "#!/bin/bash -xe\n",
+                            "yum -y update\n",
+                            "sed -i \"s/ZONE=\\\"UTC\\\"/ZONE=\\\"Asia\\/Tokyo\\\"/\" /etc/sysconfig/clock\n",
+                            "/bin/cp -f /usr/share/zoneinfo/Japan /etc/localtime\n",
+                            "sed -i \"s/en_US\\.UTF-8/ja_JP\\.UTF-8/\" /etc/sysconfig/i18n\n"
+                        ]
+                    ]
+                },
+                "mode": "000500",
+                "owner": "root",
+                "group": "root"
+            }
+        },
+        "commands": {
+            "01_execute_init_jp_setting": {
+                "command": "/tmp/jp-setting",
+                "cwd": "~"
+            }
+        }
+    },
}

その他変更点3 – WordPressの初期設定スクリプトに追記

デフォルトのテンプレートではwp-config.phpファイルのSALTキーが初期値のままとなってしまっています。テンプレート内で/tmpディレクトリ以下に作成しているcreate-wp-configというbashスクリプト内にSALTキーを更新する処理を追記しました。
また、wordpressの所有者をapacheに設定する処理も追記しました。
参考:BASH script to change the Security Keys and SALTs in a wp-config.php file | jbmurphy.com

"/tmp/create-wp-config": {
    "content": {
        "Fn::Join": [
            "",
            [
                "#!/bin/bash -xe\n",
                "cp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php\n",
                "sed -i \"s/'database_name_here'/'",
                {
                    "Ref": "DBName"
                },
                "'/g\" wp-config.php\n",
                "sed -i \"s/'username_here'/'",
                {
                    "Ref": "DBUser"
                },
                "'/g\" wp-config.php\n",
                "sed -i \"s/'password_here'/'",
                {
                    "Ref": "DBPassword"
                },
                "'/g\" wp-config.php\n",
+                "\n",
+                "# salt change\n",
+                "SALTS=$(curl -s https://api.wordpress.org/secret-key/1.1/salt/)\n",
+                "while read -r SALT; do\n",
+                "SEARCH=\"define('$(echo \"$SALT\" | cut -d \"'\" -f 2)\"\n",
+                "REPLACE=$(echo \"$SALT\" | cut -d \"'\" -f 4)\n",
+                "sed -i \"/^$SEARCH/s/put your unique phrase here/$(echo $REPLACE | sed -e 's/\\\\/\\\\\\\\/g' -e 's/\\//\\\\\\//g' -e 's/&/\\\\\\&/g')/\" wp-config.php\n",
+                "done <<< \"$SALTS\"\n",
+                "\n",
+                "# apache setting\n",
+                "chown -R apache: /var/www/html/wordpress\n"
            ]
        ]
    },
    "mode": "000500",
    "owner": "root",
    "group": "root"
}
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpressdb' );

/** MySQL database username */
define( 'DB_USER', 'dbuser' );

/** MySQL database password */
define( 'DB_PASSWORD', 'dbpassword1' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix = 'wp_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define( 'WP_DEBUG', false );

/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
        define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}

/** Sets up WordPress vars and included files. */
require_once( ABSPATH . 'wp-settings.php' );
<?php
/**
 * WordPress の基本設定
 *
 * このファイルは、インストール時に wp-config.php 作成ウィザードが利用します。
 * ウィザードを介さずにこのファイルを "wp-config.php" という名前でコピーして
 * 直接編集して値を入力してもかまいません。
 *
 * このファイルは、以下の設定を含みます。
 *
 * * MySQL 設定
 * * 秘密鍵
 * * データベーステーブル接頭辞
 * * ABSPATH
 *
 * @link http://wpdocs.osdn.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86
 *
 * @package WordPress
 */

// 注意:
// Windows の "メモ帳" でこのファイルを編集しないでください !
// 問題なく使えるテキストエディタ
// (http://wpdocs.osdn.jp/%E7%94%A8%E8%AA%9E%E9%9B%86#.E3.83.86.E3.82.AD.E3.82.B9.E3.83.88.E3.82.A8.E3.83.87.E3.82.A3.E3.82.BF 参照)
// を使用し、必ず UTF-8 の BOM なし (UTF-8N) で保存してください。

// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'wordpressdb');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'dbuser');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'dbpassword1');

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DB_CHARSET', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

/**#@+
 * 認証用ユニークキー
 *
 * それぞれを異なるユニーク (一意) な文字列に変更してください。
 * {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org の秘密鍵サービス} で自動生成することもできます。
 * 後でいつでも変更して、既存のすべての cookie を無効にできます。これにより、すべてのユーザーを強制的に再ログインさせることになります。
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         'z.{byBhs iogsO2_p,r<UFT*ZK,Hiw%WE_+{{!ok0+eT^RT*6lC}ewdxtydt-3,^');
define('SECURE_AUTH_KEY',  'UH WG@n|H<0Lb/($GP*+ZV.{*iWoJ+&F:G9hnK-$E+&i1g6^@a*Kkgf#H2qU-yXu');
define('LOGGED_IN_KEY',    'J2n<Xbg-?.Z.jplHM;5onpwl^wv-C-XP&J!Y&g1s!`t1^94glF|_-w%1jTU{eF$');
define('NONCE_KEY',        'J#ddD 591z>UhA]Qk5tQV2EF:@>?;ugtvPB-k+Bj5{#J727PDS~m?HkJV2MRJI[<');
define('AUTH_SALT',        'u+D(2XE5Tm~QQFr8cL+G|.P=Q]eBzo9T+F2*{TL| u{6vN:+X-}p7b-spO$?/e9V');
define('SECURE_AUTH_SALT', 'vaBgCVj5tuV/HC}R9X/ KT*sn%=++TGjxV`.[L^vWi]),/OC9E7p4-|]9=6W`QoF');
define('LOGGED_IN_SALT',   'iFO|4zfyja+.[bK,5i|Aj9=sVpAUPP<?^ZUXMzgN@k>)TkHL]h0Jv=7z6G`84/#?');
define('NONCE_SALT',       'T*Py_!nx+-=@<b9OO[}A}cWBWz^`AYpw0jb-9Z%TSj)u2e}|$JoER,GJ-[LF=tq`');

/**#@-*/

/**
 * WordPress データベーステーブルの接頭辞
 *
 * それぞれにユニーク (一意) な接頭辞を与えることで一つのデータベースに複数の WordPress を
 * インストールすることができます。半角英数字と下線のみを使用してください。
 */
$table_prefix = 'wp_';

/**
 * 開発者へ: WordPress デバッグモード
 *
 * この値を true にすると、開発中に注意 (notice) を表示します。
 * テーマおよびプラグインの開発者には、その開発環境においてこの WP_DEBUG を使用することを強く推奨します。
 *
 * その他のデバッグに利用できる定数については Codex をご覧ください。
 *
 * @link http://wpdocs.osdn.jp/WordPress%E3%81%A7%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0
 */
define('WP_DEBUG', false);

/* 編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。 */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
        define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

その他変更点4 – 米表示されるパラメータの入力値を出力タブに追加

DBユーザーやDBパスワードなどテンプレートファイル内で「”NoEcho”: “true”,」の記載があるパラメータ項目は完了後のパラメータタブから入力した値が分からないようになっています。

今回はそんなマスクされてる項目について、入力内容を忘れたときのために出力タブの方に出力する設定を追加しました。

以下のような感じで表示されます。

その他変更点5 – パラメータをグループ化

スタック作成する際、パラメータを入力する画面の項目の並び順はjson内の並び順ではなくおそらくアルファベットの昇順(?)でソートされてしまう模様。パラメータが増えてくると入力画面が見づらくなってしまうことが考えられます。
調べたところMetaDataセクションでグループ化することで並び順を任意に設定できるとのことでした。今回はEC2インスタンスを作成するための設定とデータベースを作成するための設定の2グループを作成してみました。

設定後のパラメータ入力画面は以下の通り。
今回はEC2インスタンス1台とセキュリティグループ1個のシンプルな構成なので設定しなくてもそんなに気にならないですが、複数台のインスタンスを起動するようなテンプレートの場合はMetaDataセクションでインスタンスごとにパラメータをグループ化すると良いと思います。

まとめ

今回はWordPress環境を構築するシンプルなテンプレートを少しカスタマイズするという内容となりました。
AWSのドキュメント内にはもっと複雑なスタックの作成についての情報があるので詰まったら以下の辺り調べるといいかも。
参考:サンプルテンプレート – AWS CloudFormation

その他、EBSのディスクサイズをパラメータから変更可能にしたり、インストールディレクトリを設定可能にしたりする予定。インストールディレクトリは未入力のとき/var/www/htmlに直接インストールの予定。
マルチAZ版の方もそのうち修正してGitHubにプッシュしようと思います。

タイトルとURLをコピーしました