AWS無料枠で1台のEC2上にWordPressを構築

概要

AWSの無料枠を利用して、EC2にWordPressを構築し、ブログを書けるようにする。

サマリー:

項目 内容
EC2タイプ t2.micro。1vCPU, メモリ1GB
ストレージ 30GB
ELB ALB
LAMP Amazon Linux2 / Apache2.4.53 / MariaDB10.5.10 / PHP8.0.16
WordPress 5.9.3
プロトコル HTTP/HTTPS

前提

AWS上無料枠の申込が完了し、ルートユーザーが作成され、MFA認証のセキュリティ設定が完了していること。

手順

IAM(アイアム)ユーザーの作成する

Identity and Access Management (IAM)のメニューにて、

  • 「ユーザーを追加」ボタンを押す。
  • ユーザー名を決めて入力(割愛)
  • 下記チェックをする
    • 「アクセスキー - プログラムによるアクセス」
    • 「パスワード - AWS マネジメントコンソールへのアクセス」
  • 「コンソールのパスワード」に「カスタムパスワード」にチェック、そしてPWを設定。

にて

  • 「グループの作成」ボタンを押す。
  • グループ名を決めて入力(users)
    実質管理者として作業できるようにしたいため、「AdministratorAccess」にチェック。
  • 「ブループの作成」ボタンを押す。
  • 「「次のステップ:タグ」を押す。 タブの追加は一旦なし。
  • 「次のステップ」を押す。
  • 「ユーザーの作成」を押す。

VPCの作成

パブリックサブネットのVPCを1つ作成し、その中にEC2のインスタンスを後から作成するイメージ。

  • VPC作成完了

  • VPC表示画面

EC2インスタンスを作成

EC2(Elastic Compute Cloud)を作成する。 画面にある「インスタンスを起動」ボタンを押す。

  • ステップ1: Amazon マシンイメージ(AMI)

Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type を選択。

下の「次のステップ:インスタンスの詳細の設定」を押す。

設定項目は多いが、先程作成されたVPCとパブリックサブネットの選択以外、基本は一旦デフォルトでよし。

下の「次のステップ:ストレージの追加」を押す。

  • ステップ 4: ストレージの追加

サイズを8から30に変更(無料枠で使える最大サイズ)。

下の「次のステップ:タグの追加」を押す。

  • ステップ 5: タグの追加

最低限Nameタグを設定する。ここでは「wordpress01」に設定する。

下の「次のステップ:セキュリティグループの設定」を押す。

新しいセキュリティグループを作成する。SSHとHTTPとHTTPSプロトコルを許可する設定する。
SSHは「マイIP」を設定(変動するので、都度変更等を行う必要がある)

下の「確認と起動」を押す。

下の「作成」ボタンを押すと、下記「キーペア」作成のダイアログが表示される。

新しいキーペアの作成を選択、RSAで「wp-ssh-key」のキーペア名を指定し、「キーペアのダウンロード」ボタンを押すと、「wp-ssh-key.pem」という秘密鍵ファイルがDLされる。次に「インスタンスの作成」を押すと、インスタンスが作成される。

作成されました。

Elastic IPの作成と割り当てる

↓ 割り当てられた ↓ 「アクション」プルダウンにある「Elasitc IP アドレスの関連付け」を選択し、出た来た関連付け画面に作られたインスタンス 選択し、「関連付ける」ボタンを押す。これで、EC2のインスタンスには静的なグローバルIPが関連付けられて、SSH接続する準備ができた。

EC2にSSH接続する

インスタンスを選択した状態で、画面上部にある「接続」ボタンを押す。 次に、sshクライアントのタブに切り替えて、 ↓ sshのコマンド行をコピーし、自分が使用するMacにて秘密鍵$chmod 400した後に、コマンドを実行する。 無事にssh接続できた。ついでに以下のコマンドで確認してみた。

$ cat /etc/system-release
Amazon Linux release 2 (Karoo)
$ df -k
ファイルシス   1K-ブロック    使用   使用可 使用% マウント位置
devtmpfs            485340       0   485340    0% /dev
tmpfs               493848       0   493848    0% /dev/shm
tmpfs               493848     408   493440    1% /run
tmpfs               493848       0   493848    0% /sys/fs/cgroup
/dev/xvda1        31444972 1316048 30128924    5% /
tmpfs                98772       0    98772    0% /run/user/1000

30GBの容量が確保されていることが分かる。

EC2にLAMP環境を構築

最初はまずSSHログインしている状態で、EC2にインストールされているソフトウェアを最新化する。

$ sudo yum update -y

Apacheをインストール

$ sudo yum install -y httpd
(省略)
$ httpd -v
Server version: Apache/2.4.53 ()
Server built:   Apr 12 2022 12:00:44

次に、apacheを起動する

$ sudo systemctl start httpd
$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2022-05-01 03:10:04 UTC; 5s ago
     Docs: man:httpd.service(8)
 Main PID: 558 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─558 /usr/sbin/httpd -DFOREGROUND
           ├─559 /usr/sbin/httpd -DFOREGROUND
           ├─560 /usr/sbin/httpd -DFOREGROUND
           ├─561 /usr/sbin/httpd -DFOREGROUND
           ├─562 /usr/sbin/httpd -DFOREGROUND
           └─563 /usr/sbin/httpd -DFOREGROUND

 5月 01 03:10:04 ip-10-0-1-153.ec2.internal systemd[1]: Starting The Apache HTTP Server...
 5月 01 03:10:04 ip-10-0-1-153.ec2.internal systemd[1]: Started The Apache HTTP Server.

上記Active: active (running)になっているので、無事に立ち上がっていることが分かる。

次に、OSの再起動とともにhttpdも起動するように設定しておく

$ sudo systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

なお、以下のコマンドでhttpdが自動再起動する設定になっているかを確認できる

$ sudo systemctl is-enabled httpd
enabled

上記の結果がenabledになっているので設定されていることが分かる。

Webサーバが正常に起動されているか、ブラウザからも確認しておこう。http://52.22.省略で以下の画面が開けば確認OK(注:まだSSL証明書が未設定のため、まだhttpsではみれない)

MariaDBをインストール

  • EC2環境にインストール可能なバージョンを確認する
$ amazon-linux-extras | grep -i maria
 54  mariadb10.5              available    [ =stable ]
$ sudo amazon-linux-extras install mariadb10.5
(省略)
$ mariadb -V
mariadb  Ver 15.1 Distrib 10.5.10-MariaDB, for Linux (x86_64) using  EditLine wrapper

MariaDBのバージョンが10.5.10であることが分かる。ついでにMariaDB関連のパッケージは次のコマンドで確認できる

$ yum list installed | grep -i mariadb
Judy.x86_64                    1.0.5-8.amzn2.0.1         @amzn2extra-mariadb10.5
libsphinxclient.x86_64         2.2.11-5.amzn2.0.1        @amzn2extra-mariadb10.5
mariadb.x86_64                 3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-backup.x86_64          3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-common.x86_64          3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-config.x86_64          3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-connect-engine.x86_64  3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-cracklib-password-check.x86_64
                               3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-devel.x86_64           3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-errmsg.x86_64          3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-gssapi-server.x86_64   3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-libs.x86_64            3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-oqgraph-engine.x86_64  3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-pam.x86_64             3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-rocksdb-engine.x86_64  3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-server.x86_64          3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-server-utils.x86_64    3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mariadb-sphinx-engine.x86_64   3:10.5.10-2.amzn2.0.1     @amzn2extra-mariadb10.5
mytop.noarch                   1.7-20.b737f60.amzn2      @amzn2extra-mariadb10.5
sphinx.x86_64                  2.2.11-5.amzn2.0.1        @amzn2extra-mariadb10.5
  • MariaDBサービスを起動する

まずは確認してみる

$ systemctl status mariadb
● mariadb.service - MariaDB 10.5 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:mariadbd(8)
           https://mariadb.com/kb/en/library/systemd/
$ sudo systemctl start mariadb
● mariadb.service - MariaDB 10.5 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:mariadbd(8)
           https://mariadb.com/kb/en/library/systemd/
[ec2-user@ip-10-0-1-153 ~]$ sudo systemctl start mariadb
[ec2-user@ip-10-0-1-153 ~]$ systemctl status mariadb
● mariadb.service - MariaDB 10.5 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   çsince 日 2022-05-01 05:16:43 UTC; 4s ago
     Docs: man:mariadbd(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 1540 ExecStartPost=/usr/libexec/mariadb-check-upgrade (code=exited, status=0/SUCCESS)
  Process: 1377 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
  Process: 1353 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS)
 Main PID: 1487 (mariadbd)
   Status: "Taking your SQL requests now..."
   CGroup: /system.slice/mariadb.service
           └─1487 /usr/libexec/mariadbd --basedir=/usr

 5月 01 05:16:41 ip-10-0-1-153.ec2.internal systemd[1]: Starting MariaDB 10.5 database server...
 5月 01 05:16:41 ip-10-0-1-153.ec2.internal mariadb-prepare-db-dir[1377]: Initializing MariaDB database
 5月 01 05:16:43 ip-10-0-1-153.ec2.internal mariadb-prepare-db-dir[1377]: Two all-privilege accounts were created.
 5月 01 05:16:43 ip-10-0-1-153.ec2.internal mariadb-prepare-db-dir[1377]: One is root@localhost, it has no password, but you need to
 5月 01 05:16:43 ip-10-0-1-153.ec2.internal mariadbd[1487]: 2022-05-01  5:16:43 0 [Note] /usr/libexec/mariadbd (mysqld 10.5.10-...7 ...
 5月 01 05:16:43 ip-10-0-1-153.ec2.internal systemd[1]: Started MariaDB 10.5 database server.
Hint: Some lines were ellipsized, use -l to show in full.
  • MariaDBのプロンプトに入ってみる
$ sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.5.10-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
  • MariaDBのセキュリティ設定をする
    • rootアカウントのパスワード設定
    • 匿名アカウントの削除
    • rootによるリモートログインの無効化
    • テストDBの削除 セキュリティをよくする設定のようだ。
$ sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n]
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n]
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

rootアカウントのパスワードを設定し、他はすべてデフォルトのYで設定した。

  • MariaDBを再起動するように設定しておく
$ systemctl is-enabled mariadb
disabled
$ sudo systemctl enable mariadb
Created symlink from /etc/systemd/system/mysql.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/mysqld.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
$ systemctl is-enabled mariadb
enabled
$

Phpをインストール

EC2上利用可能なバージョンを確認する

$ amazon-linux-extras | grep php
 42  php7.4                   available    [ =stable ]
 51  php8.0                   available    [ =stable ]

一方、Supported Versions によると、php7.4は2022/11/28でセキュリティサポートが切れる。
なので、php8.0をインストールことにする。

$ sudo amazon-linux-extras enable php8.0
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  5  postgresql9.6            available    \
        [ =9.6.6  =9.6.8  =stable ]
  6  postgresql10             available    [ =10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
 11  vim                      available    [ =8.0  =stable ]
 18  libreoffice              available    \
        [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    \
        [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50
          =stable ]
 24  epel                     available    [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 28  firecracker              available    [ =0.11  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 32  lustre2.10               available    \
        [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
  _  php7.4                   available    [ =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
 46  collectd                 available    [ =stable ]
 47  aws-nitro-enclaves-cli   available    [ =stable ]
 48  R4                       available    [ =stable ]
  _  kernel-5.4               available    [ =stable ]
 50  selinux-ng               available    [ =stable ]
 51  php8.0=latest            enabled      [ =stable ]
 52  tomcat9                  available    [ =stable ]
 53  unbound1.13              available    [ =stable ]
 54  mariadb10.5=latest       enabled      [ =stable ]
 55  kernel-5.10=latest       enabled      [ =stable ]
 56  redis6                   available    [ =stable ]
 57  ruby3.0                  available    [ =stable ]
 58  postgresql12             available    [ =stable ]
 59  postgresql13             available    [ =stable ]
 60  mock2                    available    [ =stable ]
 61  dnsmasq2.85              available    [ =stable ]

Now you can install:
 # yum clean metadata
 # yum install php-cli php-pdo php-fpm php-mysqlnd

続けて、以下のコマンドを実行する。

$ sudo yum clean metadata
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
リポジトリーを清掃しています: amzn2-core amzn2extra-docker amzn2extra-kernel-5.10 amzn2extra-mariadb10.5 amzn2extra-php8.0
22 個の metadata ファイルを削除しました
8 個の sqlite ファイルを削除しました
0 個の metadata ファイルを削除しました
$
$ sudo yum install php-{pear,pdo,common,curl,mbstring,gd,mysqlnd,gettext,bcmath,json,xml,fpm,intl,zip}
(省略)
========================================================================================================================================
 Package                        アーキテクチャー         バージョン                           リポジトリー                         容量
========================================================================================================================================
インストール中:
 php-bcmath                     x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                    65 k
 php-common                     x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                   1.2 M
 php-fpm                        x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                   1.7 M
 php-gd                         x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                   168 k
 php-intl                       x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                   179 k
 php-mbstring                   x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                   473 k
 php-mysqlnd                    x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                   189 k
 php-pdo                        x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                   122 k
 php-pear                       noarch                   1:1.10.12-9.amzn2                    amzn2-core                          359 k
 php-xml                        x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                   173 k
依存性関連でのインストールをします:
 libxslt                        x86_64                   1.1.28-6.amzn2                       amzn2-core                          240 k
 libzip                         x86_64                   1.3.2-1.amzn2.0.1                    amzn2-core                           62 k
 oniguruma                      x86_64                   5.9.6-1.amzn2.0.4                    amzn2-core                          127 k
 php-cli                        x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                   5.0 M
 php-process                    x86_64                   8.0.16-1.amzn2                       amzn2extra-php8.0                    83 k

トランザクションの要約
========================================================================================================================================
インストール  10 パッケージ (+5 個の依存関係のパッケージ)

総ダウンロード容量: 10 M
インストール容量: 48 M
Is this ok [y/d/N]:y
(省略)
完了しました!

php-json is available in Amazon Linux Extra topic "php7.4"

To use, run
# sudo amazon-linux-extras install php7.4

Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras

php-jsonはphp7.4までしかなう、php8.0ではインストールされなかったが、一旦よしとする。
次にバージョン確認

$ php -v
PHP 8.0.16 (cli) (built: Mar  1 2022 00:31:45) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.16, Copyright (c) Zend Technologies

Httpdのファイルにアクセス権限追加

Apache2でのドキュメントルートは/var/www/htmlになる。EC2のデフォルトユーザである「ec2-user」がドキュメントルート配下のディレクトリやファイルにアクセスできるようにする。

  • ec2-userをapacheグループに追加
$ sudo usermod -a -G apache ec2-user

追加直後だと、まだapacheグループが作成されていない状態

$ groups
ec2-user adm wheel systemd-journal

なので、一旦SSH接続をログアウトにしてから再ログインする。

$ groups
ec2-user adm wheel apache systemd-journal

apacheグループが追加され、カレントユーザであるec2-userがそのグループのメンバーになっていることが分かる。

  • /var/wwwとその配下コンテンツのオーナーとグループを変更
$ sudo chown -R ec2-user:apache /var/www

これにより、変更前のroot:rootからec2-user:apacheのオーナーとグループに変わる。

$ sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;

これにより、各ディレクトリのパーミッションdrwxrwsr-xになり、ec2-userユーザとapacheグループに読み書き、その他ユーザに参照権限が付く。
また、各ディレクトリ配下で作られるファイルは、そのディレクトリと同じグループを継承することになる。

$ find /var/www -type f -exec sudo chmod 0664 {} \;
  • httpdを再起動する
$ sudo systemctl restart httpd

おまじないのphpinfo.phpでテストする

$ tee /var/www/html/phpinfo.php <<EOF
><? phpinfo(); ?>
EOF
<?php phpinfo(); ?>

ブラウザから、http://52.22.xx.xx/phpinfo.phpでアクセスすると(xx.xx部分は割愛)

phpが正しく動いたことが確認できたので、phpinfo.php ファイルを削除する。ここまで一息休憩。

WordPressをインストールする

DLとDB設定
  • 最新バージョンをダウンロード

下記サイトからDL可能(2022/05/01時点では、5.9.3が最新バージョン)。

ダウンロード | WordPress.org 日本語

$ wget https://ja.wordpress.org/latest-ja.zip
--2022-05-01 08:15:05--  https://ja.wordpress.org/latest-ja.zip
ja.wordpress.org (ja.wordpress.org) をDNSに問いあわせています... 198.143.164.252
ja.wordpress.org (ja.wordpress.org)|198.143.164.252|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 21126278 (20M) [application/zip]
`latest-ja.zip' に保存中

100%[=============================================================================================>] 21,126,278  22.6MB/s 時間 0.9s

2022-05-01 08:15:06 (22.6 MB/s) - `latest-ja.zip' へ保存完了 [21126278/21126278]
  • unzipコマンドでzipを解凍
$ unzip latest-ja.zip
(省略)
$ ls -l wordpress
合計 216
-rw-r--r--  1 ec2-user ec2-user   405  2月  6  2020 index.php
-rw-r--r--  1 ec2-user ec2-user 19915  4月  5 20:05 license.txt
-rw-r--r--  1 ec2-user ec2-user 10083  4月  5 20:05 readme.html
-rw-r--r--  1 ec2-user ec2-user  7165  1月 21  2021 wp-activate.php
drwxr-xr-x  9 ec2-user ec2-user  4096  4月  5 20:00 wp-admin
-rw-r--r--  1 ec2-user ec2-user   351  2月  6  2020 wp-blog-header.php
-rw-r--r--  1 ec2-user ec2-user  2338 11月  9 23:07 wp-comments-post.php
-rw-r--r--  1 ec2-user ec2-user  4068  4月  5 20:05 wp-config-sample.php
drwxr-xr-x  5 ec2-user ec2-user    69  4月  5 20:05 wp-content
-rw-r--r--  1 ec2-user ec2-user  3939  8月  3  2021 wp-cron.php
drwxr-xr-x 26 ec2-user ec2-user 12288  4月  5 20:05 wp-includes
-rw-r--r--  1 ec2-user ec2-user  2496  2月  6  2020 wp-links-opml.php
-rw-r--r--  1 ec2-user ec2-user  3900  5月 15  2021 wp-load.php
-rw-r--r--  1 ec2-user ec2-user 47916  1月  4 08:30 wp-login.php
-rw-r--r--  1 ec2-user ec2-user  8582  9月 22  2021 wp-mail.php
-rw-r--r--  1 ec2-user ec2-user 23025 11月 30 17:32 wp-settings.php
-rw-r--r--  1 ec2-user ec2-user 31959 10月 25  2021 wp-signup.php
-rw-r--r--  1 ec2-user ec2-user  4747 10月  8  2020 wp-trackback.php
-rw-r--r--  1 ec2-user ec2-user  3236  6月  8  2020 xmlrpc.php
  • MariaDBへ接続するDBユーザとパスワードを作成
MariaDB [(none)]> CREATE USER 'wp-user'@'localhost' IDENTIFIED BY 'your_strong_password';

実際には、各自でユーザ名とパスワードを決めて実行すること。

MariaDB [(none)]> CREATE DATABASE `wp-db`;
  • 作成したDataBaseに対しDBユーザに権限を付与する
MariaDB [(none)]> GRANT ALL PRIVILEGES ON `wp-db`.* TO "wp-user"@"localhost";
  • 権限付与を反映する
MariaDB [(none)]> FLUSH PRIVILEGES;
wp-config.phpファイルを作成
  • テンプレートからコピペしてする
$ cd wordpress; cp wp-config-sample.php wp-config.php
$ vim wp-config.php
  • DB関連の設定変更
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'database_name_here' );

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

/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'password_here' );
  • 認証キーなどを設定する

https://api.wordpress.org/secret-key/1.1/salt/ にアクセス、自動生成の値を下記キーに設定する

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のファイルをhttpdのドキュメントルート配下にコピーする
$ cp -r wordpress/* /var/www/html/
$ sudo vim /etc/httpd/conf/httpd.conf

<Directory "/var/www/html">の中にあるAllowOverride NoneAllowOverride Allに変更する。

  • apacheユーザがWordPress領域のファイルを読み書きするための権限設定

httpdapacheユーザで動作するため、ドキュメントルート以下のコンテンツを読み書きできるよう、オーナーをapacheに変更する。

$ sudo chown -R apache /var/www
$ sudo systemctl restart httpd

ブラウザからhttp://52.22.xx.xxにアクセスし次のような画面が表示されれば成功!(xx.xx部分は割愛)

` 試しに、タイトル、ユーザ名、パスワード、メールアドレスを入力してWordPressをインストール!
すると、次のような画面が現れてる。

「ログイン」を押すと、次のhttp://domainname.net/wp-login.php画面になる。

先程作ったユーザー名とパスワードでログインすると、なんと

WordPressダッシュボードが表示され、環境構築がようやく完了した!!

ドメイン名を使えるようにする

前提は、お名前.comなどドメイン名登録サービスを通じて自分のドメインを登録していること(済み)。

  • Route 53に登録する

にて、「ホストゾーンの作成」を押す。

ドメイン名」に、取得したドメイン名を入力し、説明欄に適当に入力する。
「タイプ」に「パブリックホストゾーン」を選択し、下部の「ホストゾーンの作成」を押す。

すると、NSレコードとSOAレコードが作られる。

  • ドメイン購入サイト(お名前.com)側の設定

ドメインを購入した際に作られたIDやパスワードを使ってログインする。下記「初期設定」を押す。

「ネームサーバーの選択」に「その他のサービス」を選択し、Amazon Route 53のホストゾーンにて表示されている4つのNSを入力する。

これにより、Route 53と購入したドメインが関連付けられた。設定の反映が少し時間がかかるそうだ。

Route 53のホストゾーン詳細画面にて「レコードを作成」を押す。
「レコードタイプ」にAレコードを選択し(デフォルト)、レコード名は空にし、値にIPv4のElastic IPアドレスを入力する。

下部の「レコードを作成」を押す。これにより、ドメインとEC2のIPアドレスが紐付けられた。

ブラウザにてhttp://domainname.net(実際のドメイン名に読み替える)を打って動作確認をすると、ちゃんと見れた!

HTTPS通信できるように設定する

AWSではCertificate Managerというサービスがありサーバ証明書を発行・管理することができて、しもし無料で!

Certificate ManagerでSSL証明書を発行

Certificate Managerを検索して入る。

「証明書をリクエスト」を押す。 下部の「次へ」を押す。 ドメイン名にトップドメイン(domainname.net)とサブドメイン(*.domainname.net)を入力し、「リクエスト」を押す。

にある「証明書ID」のリンクを押すと、次の画面が表示される。

「Route 53でレコードを作成」ボタンを押すと、

が表示されるので、「レコードを作成」ボタンを押すと、DNSレコードが正常に作成された。

ロードバランサーを設定

AWSではhttpsを通信させるためには、ロードバランサーを設定する必要がある。その場合の通信経路のプロトコルは次のようになる
ユーザ <->(https)<-> ロードバランサ <->(http)<-> EC2

  • ロードバランサの作成画面に入る

「Applicatoin Load Balancer」を選択する(「Create」を押す)。

設定項目が多いため、省略。

  • Route53を設定

設定したALB経由でEC2にアクセスされるようにRoute53の設定を変更する。
Route 53のホストゾーン画面にて、取得したドメインの詳細画面に入り、もともとあったAレコードを削除し、新たに「レコードを作成」し、ALBにルーティングするように設定する。これでしばらく(1、2分)後、https://domainname.netでアクセス可能になる。

WordPress内のhttps化

管理画面へアクセスする`http://domainname.net/wp-login.php'。次に左カラムにある「プラグイン」の「新規追加」を選択。 次に、「Really Simple SSL」を検索しインストール。インストールが終わったら有効化。

しかし、これだけではまだ完了しないので、EC2サーバ側での設定も必要。

  • 画面画面へのhttps接続を設定

WordPressのwp-config.php に管理画面へのhttpsアクセスを許可するよう設定を追加。
EC2へSSH接続し、wp-config.phpを編集するが、ec-userによる書き込み権限がなければ $ sudo chmod g+w wp-config.phpをしておく。

require_once(ABSPATH . 'wp-settings.php’);行より前に、下記3行を追加。

$_SERVER['HTTPS']='on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
  • 管理画面の設定変更
    左カラムの「設定」を押して、「一般設定」画面にて、
    WordPress アドレス (URL)
    ・サイトアドレス (URL)
    両方とも、https://domainname.netに変更する。

httpをhttpsへリダイレクトする

EC2のロードバランサの画面にいき、対象のALBを選択した状態で画面下部にある「リスナー」画面にて、HTTP:80の行の「ルールの表示/編集」を押す。 そして、ルール編集画面にて、上部の「+」を押して、出てきた「ルールの挿入」を押して、以下のように設定する。

・IF(すべてに一致) → 「パス...」=「*」に設定
・THEN → 「リダイレクト先...」=「HTTPS」「443」に設定
・デフォルトホスト、パス、クエリを使用... → 「301-完全に移動されました」に設定

画面右上の「保存」ボタンを押す。

これで、全部の設定が完了した。

トラブルシューティング

メモリ不足

504エラーが出てWeb接続できない現象が頻発。topコマンドをみると、Memory free容量が数十MBな状態。
対策:swapメモリを確保すること(EC2デフォルトでは確保されていない)。

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo chmod 600 /swapfile

設定後、topコマンドをみると、約2GBのfree memoryが表示されている。

参考資料(Special THX!)