AWSだけでWordPressブログを立ち上げる! ~OS設定 編~

AL2023

本記事はAWSでWordPressブログを立ち上げるまでの過程を、
キリの良いところで区切った内容になっています。

通して確認されたい方は以下を先に確認してみてください!

はじめに

第三章は、OSの設定を行います。

  • Amazon Linux 2023 の初期設定
  • WordPressを使用するためにApacheやらMariaDB、PHPなんかをインストール & 設定

ということで本編です。


Amazon Linux 2023の初期設定

あまり設定する内容はなさそうでしたが、以下は行いました。

  • パッケージ更新
  • タイムゾーン変更
  • CloudWatchエージェントインストール & 設定


パッケージ更新

dnf upgrade --releasever=latest


タイムゾーン変更

sudo timedatectl set-timezone Asia/Tokyo

date コマンドで変更されているか確認


CloudWatchエージェントのインストール

インストールは公式ドキュメントにコマンドが載ってます。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html

sudo yum install amazon-cloudwatch-agent


ウィザードを使用してカスタムメトリクスの設定をしてみました。

cd /opt/aws/amazon-cloudwatch-agent/bin
sudo ./amazon-cloudwatch-agent-config-wizard
================================================================
= Welcome to the Amazon CloudWatch Agent Configuration Manager =
=                                                              =
= CloudWatch Agent allows you to collect metrics and logs from =
= your host and send them to CloudWatch. Additional CloudWatch =
= charges may apply.                                           =
================================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
1
Trying to fetch the default region based on ec2 metadata...
I! imds retry client will retry 1 timesAre you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1
Which user are you planning to run the agent?
1. cwagent
2. root
3. others
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:
2
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
1
Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [1]:
1
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
2
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "cwagent"
        },
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle",
                                        "cpu_usage_iowait",
                                        "cpu_usage_user",
                                        "cpu_usage_system"
                                ],
                                "metrics_collection_interval": 60,
                                "totalcpu": false
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent",
                                        "inodes_free"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "io_time"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
1
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2
Do you want the CloudWatch agent to also retrieve X-ray traces?
1. yes
2. no
default choice: [1]:
2
Existing config JSON identified and copied to:  /opt/aws/amazon-cloudwatch-agent/etc/backup-configs
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "cwagent"
        },
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle",
                                        "cpu_usage_iowait",
                                        "cpu_usage_user",
                                        "cpu_usage_system"
                                ],
                                "metrics_collection_interval": 60,
                                "totalcpu": false
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent",
                                        "inodes_free"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "io_time"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
2
Program exits now.


成功すると config.json が作成されています。

ls -l
total 445320
-rw-r--r--. 1 root root        11 Aug 27 19:16 CWAGENT_VERSION
-rwxr-xr-x. 1 root root 133978408 Aug 27 19:16 amazon-cloudwatch-agent
-rwxr-xr-x. 1 root root  14495880 Aug 27 19:16 amazon-cloudwatch-agent-config-wizard
-rwxr-xr-x. 1 root root     14117 Aug 27 19:16 amazon-cloudwatch-agent-ctl
-rwxr-xr-x. 1 root root  39584536 Aug 27 19:16 config-downloader
-rwxr-xr-x. 1 root root 128718408 Aug 27 19:16 config-translator
-rw-r--r--. 1 root root      1106 Oct  1 13:53 config.json
-rw-r--r--. 1 root root  29755484 Aug 27 19:16 opentelemetry-jmx-metrics.jar
-rwxr-xr-x. 1 root root 109433352 Aug 27 19:16 start-amazon-cloudwatch-agent


ここでCloudWatchエージェントのサービス再起動をしましたが、
ステータスが loaded のまま起動しなくなりました。。

sudo systemctl restart amazon-cloudwatch-agent
sudo systemctl status amazon-cloudwatch-agent


出ていたメッセージを確認すると、jsonが読み込めていないようでした。
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json が無いのが原因?

/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exit



config.json をリネームしてフォルダを移動しました。

sudo mv /opt/aws/amazon-cloudwatch-agent/bin/config.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json


再度サービス再起動をするとステータスが正常になりました。

sudo systemctl restart amazon-cloudwatch-agent
sudo systemctl enable amazon-cloudwatch-agent
sudo systemctl status amazon-cloudwatch-agent


マネジメントコンソールでCloudWatchコンソールを見てみると、
カスタムメトリクスにメモリ使用率が表示されました。


信じられないほど沼ったので先に注意点を!!!

本記事はブラウザでWordPressの初期画面が表示できたところで終了します。

初期画面以降の設定は独自ドメインやHTTPS化の設定が完了してから実施した方が良いです。


事象

まさおは最初に以下のURLでアクセスしインストールまで行いました。
http://[パブリックIPアドレス]


その後、以下の流れを踏みました。

①パブリックIPアドレスを固定するためにElastic IP を割り当てた

確認のためサイトにアクセスすると表示も遅いし画面崩れする。

まさお
まさお

Elastic IPを割り当てたからおかしくなったんだ!


② ①を行った状態でインストール → Route53で独自ドメインを購入 → Elactic IPをAレコードで登録

確認するとまた同じ事象が発生している

まさお
まさお

DNS設定をしたからおかしくなったんだ!


③ ②を行い、独自ドメインでアクセスした状態でインストール → ALBを作成してRoute53のエイリアスレコードに登録することでHTTPS化

確認するとまたまた同じ事象が発生している

まさお
まさお

設定変更をするたびにおかしくなるな。さすがに調べよう。


原因

以下が原因で事象が発生していました。

  • WordPressで設定されているURLと実際にアクセスしたURLの相違
  • 混合コンテンツエラー

終わってみればあっさり解決したのですが、なんやかんや解決のために色々なことをしました。

EC2のスペックが足りない?とか
ALBとEC2間をHTTPS化してみたとか
WordPressの設定をいじってみたりとか
DBに登録されているURL情報を修正しようとしたりとか
ApacheやらEC2の設定をいじってみたりとか
などなど

なかなか解消しないのでEC2は4~5回ほど作り直しました。。


結論、
独自ドメインを使用してWordPress初期画面にHTTPSアクセスができている
状態になるまで、ブラウザからのインストールは避けるのが吉です。


実は、よく見たらチュートリアルの中にもヒントがありました。
「前提条件」や末尾の「ヘルプ! ~」のところ
https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/hosting-wordpress-aml-2023.html


ということで、初期画面までやっていきましょう。


WordPress等のインストール、セットアップ

AWS公式ドキュメントに以下のチュートリアルがありました。
これをそのままやってみます。

AL2023 で WordPress ブログをホストする
https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/hosting-wordpress-aml-2023.html


インストール系

# MariaDB、PHP、Apacheインストール
sudo dnf install wget php-mysqlnd httpd php-fpm php-mysqli mariadb105-server php-json php php-devel -y

# WordPressインストール、解凍
sudo wget https://wordpress.org/latest.tar.gz
sudo tar -xzf latest.tar.gz


MariaDB設定

# mariadb、httpdの起動
sudo systemctl start mariadb httpd

# rootログイン
# インストール直後はパスワードが設定されていないようなので、# 以下のコマンドで強行突破する
sudo mysql -u root -p

# rootパスワード設定
ALTER USER 'root'@'localhost' IDENTIFIED BY "パスワード";

# WordPress用ユーザ作成
CREATE USER '任意のユーザ名'@'localhost' IDENTIFIED BY 'パスワード';

・WordPress用DB作成
CREATE DATABASE `任意のデータベース名`;

・WordPressユーザに権限付与
GRANT ALL PRIVILEGES ON `作成したデータベース名`.* TO '作成したユーザ名'@'localhost';

・設定反映
FLUSH PRIVILEGES;


WordPress設定

# 設定ファイルの作成
sudo cp wordpress/wp-config-sample.php wordpress/wp-config.php
sudo vi wordpress/wp-config.php

# 以下の部分を書き換える
> // ** Database settings - You can get this info from your web host ** //
> /** The name of the database for WordPress */
> define( 'DB_NAME', '作成したデータベース名' );
>
> /** Database username */
> define( 'DB_USER', '作成したユーザ名' );
>
> /** Database password */
> define( 'DB_PASSWORD', 'パスワード' );

# 以下にアクセスして生成されるランダムな値に書き換える
# https://api.wordpress.org/secret-key/1.1/salt/
define('AUTH_KEY',         '');
define('SECURE_AUTH_KEY',  '');
define('LOGGED_IN_KEY',    '');
define('NONCE_KEY',        '');
define('AUTH_SALT',        '');
define('SECURE_AUTH_SALT', '');
define('LOGGED_IN_SALT',   '');
define('NONCE_SALT',       '');


インストールディレクトリを決める

hxxps://example.com/ で作成したサイトにアクセスさせたい時は、
/var/www/html/ にWordPressを配置する

hxxps://example.com/site/ で作成したサイトにアクセスさせたい時は、
/var/www/html/site/ を作成して、ここにWordPressを配置する

# /var/www/html/blogにする
sudo mkdir /var/www/html/blog
sudo cp -r wordpress/* /var/www/html/blog/


WordPress permalinks

sudo vim /etc/httpd/conf/httpd.conf
# <Directory "/var/www/html">セクションの「AllowOverride None」を「AllowOverride ALL」に書き換え


Apacheの権限設定

sudo chown -R apache /var/www
sudo chgrp -R apache /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0644 {} \;
sudo systemctl restart httpd


Apache、MariaDBの起動、自動起動設定

sudo systemctl enable httpd && sudo systemctl enable mariadb
sudo systemctl status mariadb
sudo systemctl status httpd
sudo chkconfig httpd on && sudo chkconfig mariadb on
sudo service mariadb status
sudo service httpd status


ここまで実行すると、WordPressの初期画面にアクセスできます。
http://パブリックIPアドレス

前述の通り、この初期画面は独自ドメインの設定やHTTPS化が完了するまで、
設定を進めないことをおすすめします。


おわりに

今回は作成したEC2のOS設定をしました。

まさかあんなに沼ると思っていなかったので、事前に調べておくことも大事だなと思いました。

勉強だと思えば満点の沼り方でしたね。


次回は、Route53から独自ドメインを取得します。

この記事を書いた人
まさお

AWSエンジニアをしています。
エンジニア経験は5年ほどです。
主にはIT基盤のAWS移行やAWSでの新規構築・運用保守をやってます。
当ブログは まさおのアウトプットの場として作りました。
何かが皆さまのお役に立てれば嬉しいです。

AL2023AWSAWS CLIEC2SSM
シェアする
タイトルとURLをコピーしました