AWS-マルチAZWordPressサイト構築練習【中編】


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

お疲れ様です。株式会社協栄情報システム3部所属の寺尾です。

今回はマルチAZWordpressサイト構築の中編になります。前編や続きに関しては下記のリンクをご参照ください。

また、全体の作業手順はWordPress環境構築手順をご確認ください。

それでは早速続きのほうをやっていきましょう。

2.データベース・ストレージ・ファイルシステム構築

まずはデータベース、ストレージ・ファイルシステムを構築していきます。そこで初めにそれらのデータを暗号化するための暗号化鍵の作成から行いましょう。

1.KMSで暗号化鍵の作成

1.まずはサービスからKMSを選び、キーの作成を選びます。

2.以下の設定値にしたがって作成します。

設定項目 設定値 理由
キーのタイプ 対象(AES-GCM) AWS内部のみで利用するので対象鍵を選ぶ
エイリアス KMS-Wordpress01-tr 入力内容は任意
キー管理者 自分のユーザー 自分でキーを削除するため
キーの使用アクセス
許可を定義
自分のユーザー 自分以外の使用を防止するため
タグ:Name KMS-Wordpress01-tr 入力は任意
タグ:Env WordPress01 入力は任意

キーのタイプについて

  • 対象鍵・非対称鍵は共通鍵・公開鍵と呼ばれる場合もあります。
    • 対象鍵: 対称鍵は情報の暗号化と復号の両方に使用されます。高速。
    • 非対称鍵: 非対称鍵は、情報の暗号化を行う鍵と復号を行う鍵の二つのカギ(キーペア)によって構成されます。高速ではない。
  • 性質上非対称鍵は鍵の受け渡しが容易なので、パブリックなインターネット上での通信に向いています。
  • 対象鍵の暗号化方式はGalois Counter Mode の AES アルゴリズム (AES-GCM) です。
  • 参考リンク → 公開鍵暗号




3.最後に設定を確認して作成しましょう。

4.無事作成できました。

2.サブネットグループ作成

次にサブネットグループを作成していきましょう。
サブネットグループはRDSを配置するサブネットのコレクションです。

1.サービスからRDS、サイドメニューからサブネットグループを選びます。

2.以下の設定値にしたがって作成します。

設定項目 設定値 理由
名前 RDS-sub-wordpress01 入力内容は任意
説明 For RDS 入力は任意
VPC VPC-Wordpress01 今回の環境ではVPCは一つのみ利用するため
アベイラビリティゾーン ・ap-northeast-3a
・ap-northeast-3c
プライベートサブネットのあるAZを選択
サブネット ・private-subNet-3a
・private-subNet-3c
RDSはプライベートサブネットに配置するため

3.無事作成できました。

3.RDS作成

次はRDSを作成していきましょう。

1.次にサイドメニューからデータベースを選択してデータベースの作成を選びます。

2.以下の設定値にしたがって作成します。

設定項目 設定値 理由
データベース作成方法 標準作成 詳細なオプションまで設定するため
エンジンのタイプ MySQL 今回は高い性能を求めていないので、Auroraよりもコストの低いMySQLを選択した
バージョン 8.0.20 安定性を考慮して最新版より一つ前のものを選んだ
テンプレート 開発/テスト 費用を抑えるため
DBインスタンス識別子 rds-wordpress01 入力内容は任意
大文字小文字は区別されない
マスターユーザー名 admin 入力内容は任意
パスワード 入力内容は任意
dbインスタンスサイズ db.t3.micro 大阪リージョンでもっとも安いものを選択
dbインスタンスサイズ 20 コストを考慮して最小値を選択
ストレージの自動スケーリング なし スケールアップした時のコストを考慮したため
VPC VPC-Wordpress01 今回の環境ではVPCは一つのみ利用するため
VPCセキュリティグループ SG-RDS-Wordpress01 RDS用に作成した物を利用
サブネットグループ rds-sub-wordpress01 プライベートサブネット二つに対するサブネットグループ
パブリックアクセス可能 なし 今回の環境ではEC2からのみ利用するため




3.RDSインスタンスの中のDBも以下の設定値に従って作成しておきましょう。

設定項目 設定値 理由
データベース名 wordpress01
DBパラメータグループ default.mysql8.0
オプショングループ default:mysql-8-0
IAM db認証 要件がないので認証はなし
自動バックアップの有効化 要件がないのでバックアップによるコスト増加を考慮してなし
暗号を有効化 要件がないので認証はなし
拡張モニタリングの有効化 費用が増加しないのであり
詳細度 60 要件がないのでデフォルト値の60
モニタリングロール デフォルト 要件がないのでデフォルト値
ログのエクスポート 全て□ 要件がないので費用を考慮しなし
マイナーバージョン自動アップグレードの有効化 マイナーアップグレードによる機能の追加やセキュリティ上の恩恵を受けるため
メンテナンスウィンドウ 設定なし 要件がないのでなし
削除保護の有効化 実際に何かを運用するわけではないので削除のしやすさを考慮してなし



4.作成完了です。数分待つと利用可能になります。

4.EFS作成

EFSを作成していきます。

1.サービスからEFS、サイドメニューからファイルシステム、そこからファイルシステムの作成を選びましょう。

2.以下の設定内容に従って作成していきます。

設定項目 設定値 理由
名前 EFS-Worpress01 入力は任意
VPC VPC-Wordpress01 接続先インスタンスを配置するVPCを選択
可用性と耐久性 リージョン 高可用性を実現するため

3.作成できました。

4.次にマウントターゲットを設定していきます。
作成したファイルシステムのネットワークタブから管理を選択します。

5.以下の設定内容になるようにマウントターゲットを修正します。

サブネット IPアドレス セキュリティグループ
public-subNet-3a 10.0.1.XXX SG-EFS-Wordpress01
public-subNet-3c 10.0.2.XXX SG-EFS-Wordpress01
  • マウントターゲットはパブリックサブネットのEC2と通信するためにパブリックサブネットに配置します。


6.二つのパブリックサブネットにマウントターゲットを配置できました。

5.S3バケット作成

次はApacheアクセスログのエクスポート先となるS3バケットを作成していきます。

1.サービス→S3→バケットの作成を選びましょう。

2.以下の設定値にしたがって作成します。

設定項目 設定値 理由
バケット名 s3-wordpress01-tr ・大文字は使えない
・バケット名は世界で一意である必要がある
リージョン ap-northeast-3 遠隔に保管する必要がないのでVPCと同一のリージョンとした
パブリックアクセスを全てブロック 今回はパブリックアクセスを行わないのでブロック
バケットのバージョニング 無効にする 要件がないのでコストを考慮し無効
タグ:Name s3-wordpress01-tr 入力は任意
タグ:Env WordPress01 入力は任意
サーバー側の暗号化 有効にする s3に保管するものは暗号化する要件があるので有効
暗号化キータイプ SSE-S3 KMSはログエクスポートタスクに対応していないため


3.作成出来たら、バケットポリシーにCloudWatchLogsからのアクセス許可を記述します。


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-3.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::s3-wordpress01-tr"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-3.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::s3-wordpress01-tr/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

バケットポリシーについて

  • Principal : どのIAMユーザーやサービス等から受け取るかを定義する。
  • Condition : ポリシーを実行するタイミングの条件を定義する。
    • StringEquals : 完全一致の条件演算子。(大文字小文字の区別あり)
  • CloudWatchLogs(大阪リージョン)からバケットのアクセス制御リスト(ACL)の取得権限
  • CloudWatchLogs(大阪リージョン)からの書き込み権限(オブジェクトの ACL が bucket-owner-full-controlの場合のみ許可)
  • 参考リンク → IAM JSON ポリシーの要素のリファレンス

3.WEBサーバー構築

次はいよいよWordpressの稼働するWebサーバーの構築です!
今回はまず一個EC2インスタンスを稼働させ、そちらにCWAgentをインストールします。そしてそれをAMI経由でコピーして二個目のインスタンスを作成します。
早速作っていきましょう。

1.AWS Systems Managerでパラメータ作成

CloudWatchAgentの設定をインスタンスに接続せずに終わらせるために、あらかじめAWS Systems ManagerでCloudWatchAgentの設定パラメータを作成しておきます。
パラメータの詳細の設定項目を下記に示します。

設定項目 設定値 理由
名前 AmazonCloudWatch-linux-Wordpress01 CloudWatchAgentの設定パラメータとして使用する場合AmazonCloudWatchより始まる名前である必要がある
利用枠 標準 パラメータが標準サイズ内に収まり、パラメータポリシーの使用要件もないため
タイプ(データ型) 文字列 設定値が文字列で、暗号化要件もないため
詳細は下に記載 DiskUsedpercentメトリクスとApacheのアクセスログを出力するため
タグ:Name AmazonCloudWatch-linux-Wordpress01 入力は任意
タグ:Env WordPress01 入力は任意
  • 設定値
    {
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/httpd/access_log",
                                                "log_group_name": "/var/log/httpd/access_log",
                                                "log_stream_name": "{instance_id}"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
    }

    セクションごとにそれぞれ必要なパラメータをjson形式で記述しています。

  • agent セクションエージェントの全体的な設定をを行います。
  • logs セクション エージェントによってCloudWatch Logsに発行されるログを設定します。
    ここではapacheのアクセスログを指定しています。
  • Metrics セクション カスタムメトリクスの収集と CloudWatch へのその発行に関する設定をします。
  • 参考リンク → CloudWatch エージェント設定ファイルを手動で作成または編集する

1.AWS Systems Manager→パラメータストア→パラメータ作成へと進みます。

2.設定値にしたがって作成します。


3.作成に成功しました。

2.EC2インスタンス作成

以下の手順に従ってWebサーバーとなる二台のインスタンスを作成していきます。

1.サービスからEC2、サイドメニューからインスタンスを選び、インスタンスの作成を選びましょう。

2.今回はAmazonLinux2のイメージから作成していきます。

3.無料利用枠のt2.microを選びます。
大阪リージョンAZ3cではt2.microが利用できなかったので二台目のインスタンスはt3.microで作成しました。

4.下記の設定値にしたがって設定します

設定項目 設定値 理由
ネットワーク VPC-Wordpress01 今回の環境ではVPCは一つのみ利用するため
サブネット ・public-subNet-3a
・public-subNet-3c
Webサーバーはパブリックサブネットに配置するため
自動割り当てパブリックIP 有効 SSHでアクセスするため
IAMロール IRL-EC2-Wordpress01-tr CloudWatchAgentを稼働させるため
シャットダウン動作 停止 インスタンスを一時的に停止にする場面のため
終了保護の有効化 実際に運用しないことと削除のしやすさを考慮してなし
CloudWatch詳細モニタリング 要件にないので費用を考慮してなし
テナンシー 共有 占有する要件がないので費用を考慮してなし
クレジット仕様 CPUに高負荷がかかる予定ないので費用を考慮してなし
ネットワークインターフェイス 自動的に割り当て IPを指定する要件がないので自動割り当て

SSHアクセス用にパブリックIPは有効にしておきましょう。(サブネット設定で自動割り当てパブリックIPを有効にしているとデフォルトのままでも有効になっています)

5.ユーザーデータに後で記述するコマンドを入力しておきます。
こうする事でインスタンスを作成した時に自動的に入力しておいたコマンドが実行されます。

コマンド

#!/bin/bash
sudo yum install httpd -y
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2
sudo yum install -y amazon-efs-utils
sudo mount -t efs -o tls fs-4b06c43e:/ /var/www/html/
echo 'fs-4b06c43e:/ /var/www/html efs tls,_netdev 0 0' | sudo tee -a /etc/fstab

cd /tmp/
sudo wget https://wordpress.org/latest.zip
unzip latest.zip
sudo mv wordpress/* /var/www/html/
sudo rm -rf wordpress/ latest.zip
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 0664 {} \;
sudo systemctl enable httpd.service
sudo systemctl start httpd.service
wget https://s3.ap-northeast-3.amazonaws.com/amazoncloudwatch-agent-ap-northeast-3/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
sudo rpm -U ./amazon-cloudwatch-agent.rpm
sudo amazon-linux-extras install collectd
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-linux-Wordpress01
  • 1行目 #!/bin/bash

    ユーザーデータのシェルスクリプトは、#! の記号と、スクリプトを読み取るインタープリタのパス (通常は /bin/bash)) から始める必要があります。

    起動時に Linux インスタンスでコマンドを実行するより引用
    とのことですので入力してます。

  • 2行目 sudo yum install httpd -y
    apacheのインストールコマンドです。ApacheはWebサーバ(HTTPサーバ)ソフトウェアの一つで、一番普及している物です。

  • 3行目 sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2
    Amazon Linux 2のExtras Libraryとよばれるパッケージ群(トピックと
    いいます)からLamp環境に必要なものをまとめてインストールしています。

  • 4行目 sudo yum install -y amazon-efs-utils
    EFSマウントヘルパーのインストールです。

  • 5行目 sudo mount -t efs -o tls fs-4b06c43e:/ /var/www/html/
    EFSのマウントコマンドです。ですのでfs-4b06c43eを自分のefsIDに書き換える必要があります。

    • -t オプションはタイプ指定オプションですのでefsを指定しています。
    • -o tls オプションを利用することでefsとEC2間の通信をtlsを利用して暗号化することができます。
  • 6行目 echo 'fs-4b06c43e:/ /var/www/html efs tls,_netdev 0 0' | sudo tee -a /etc/fstab
    インスタンスの再起動時に、EFSを自動マウントするためのコマンドです。ですのでfs-4b06c43eを自分のefsIDに書き換える必要があります。

    • 「/etc/fstab」ファイルは、マウントするファイルシステムの情報を記述するファイルです。ですのでこちらにfs-4b06c43e:/ /var/www/html efs tls,_netdev 0 0を書き込む事で起動時に自動マウント設定を行えます。
    • sudo echo で直接書き込もうとするとリダイレクト処理が挟まって一般ユーザー権限になりPermission deniedエラーが発生します。
    • teeコマンドは標準入力から受け取った内容を、標準出力とファイルに書き出すコマンドです。ですのでリダイレクトを使わずにパイプラインでteeコマンドに引き渡すことで、root権限で書き込みできます。
    • -aはファイルに内容を追記するオプションです。
  • 8行目 cd /tmp/
    /tmp/ディレクトリ下への移動コマンドです。
    /tmp/ディレクトリは作ったファイルを入れておくディレクトリ(後で中のファイルは自動的に削除されます)なのでそこにインストールファイルを配置しています。

  • 9行目と10行目
    sudo wget https://wordpress.org/latest.zip
    unzip latest.zip
    Wordpressをダウンロードし、解凍しています。

  • 11行目 sudo mv wordpress/* /var/www/html/
    apacheの公開領域にwordpressファイルを移動させています。

  • 12行目 sudo rm -rf wordpress/ latest.zip
    解凍する前のものを削除しています。

  • 13~17行目は権限周りの付与です。

    WordPress で使用できる機能の中には、Apache ドキュメントルートへの書き込み権限が必要なものがあります (管理画面を使った、メディアのアップロードなど)。まだ設定していない場合は、次のグループのメンバーシップおよびアクセス許可を適用します

    チュートリアル: Amazon Linux 2 での WordPress ブログのホストより引用
    とのことですので設定します。
    こちらを設定しないとWordpressインストールプロセス中にconfig.phpファイルを自動で作成することができません。

  • 18行目 sudo systemctl enable httpd.service
    起動時にapacheの自動起動を有効にするコマンドです。

  • 19行目 sudo systemctl start httpd.service
    apacheの起動コマンドです。

  • 20行目と21行目
    wget https://s3.ap-northeast-3.amazonaws.com/amazoncloudwatch-agent-ap-northeast-3/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
    sudo rpm -U ./amazon-cloudwatch-agent.rpm
    CloudWatchAgentをダウンロードし、解凍しています。

  • 22行目 sudo amazon-linux-extras install collectd
    collectdのインストールコマンドです。DiskUsedPercentメトリクスを取得するためにcollectdをインストールしてます。

  • 23行目 sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-linux-Wordpress01 は
    CloudWatchAgentの起動コマンドです。ssm:AmazonCloudWatch-linux-Wordpress01 にはSystemManagerで設定したパラメータの名前を選び、そちらの設定を参照して起動します。

6.EBSの選択です。
下記の設定値にしたがって設定します。

設定項目 設定値 理由
サイズ 8 費用を考慮し最小値
ボリュームタイプ gp3 gp2と比べて費用が安く、少ないボリューム同士の場合gp3の方が高速なため
IOPS 3000 費用を考慮し最小値
スループット 125 費用を考慮し最小値
暗号化 KMS-Wordpress01 EBS用に作成した物を使用します

gp3についての参考リンク → EBSのタイプはgp2からgp3に変更する

7.タグとセキュリティグループの設定です。
下記の設定値にしたがって設定します。

設定項目 設定値 理由
タグ:Name ・EC2-Wordpress01-1
・EC2-Wordpress01-2
入力は任意
タグ:Env WordPress01 入力は任意
セキュリティグループ SG-EC2-Wordpress01 EC2用に作成したものを選択


8.確認してキーペアを選び作成しましょう。キーペアはブログ外で作成したものを使用しました。


9.最後にしっかり情報が収集できているかCWからメトリクスを確認してみましょう。



10.上記の手順に従ってもう一台のインスタンスを作成しました。

file

4.ネットワーク構築

1.ALB作成

まずはALBから構築していきましょう。

1.サービスからEC2、サイドメニューからロードバランサーを選びます。

2.下記の設定項目にしたがって設定します。

設定項目 設定値 理由
ロードバランサーの種類 アプリケーションロードバランサー アプリケーション層でトラフィックを振り分けるため
名前 ALB-Worpress01 入力内容は任意
スキーム インターネット向け インターネットに公開するため
IPアドレスタイプ ipv4 今回はipv6を利用しないため
ロードバランサーのプロトコル/ポート http/80 https設定をWordpress上で行ってから設定するため一時的にhttp
IPアドレスタイプ ipv4 今回はipv6を利用しないため
VPC VPC-Wordpress01 接続先インスタンスを配置するVPCを選択
サブネット ・public-subNet-3a
・public-subNet-3c
インターネットと通信するALBはパブリックサブネットに配置する必要があるため
VPC VPC-Wordpress01 接続先インスタンスを配置するVPCを選択
可用性と耐久性 リージョン 高可用性を実現するため
タグ:Name ALB-Wordpress01 入力は任意
タグ:Env WordPress01 入力は任意
セキュリティグループ SG-ALB-Wordpress01 ALB用に作成したものを選択



セキュリティ警告は一旦無視して次に進みます。


6.ルーティングの設定をします。

設定項目 設定値 理由
ターゲットグループ 新しいターゲットグループ
名前 TGN-Worpress01 入力内容は任意
ターゲットの種類 インスタンス インスタンスにリクエストを振り分けるため
プロトコル HTTP VPC内部の通信は暗号化する要件がないため
ポート 80 VPC内部の通信は暗号化する要件がないため
ヘルスチェック
プロトコルバージョン HTTP1
プロトコル HTTP 要件がないためデフォルト
パス / 要件がないためデフォルト
ポート トラフィックポート 要件がないためデフォルト
正常のしきい値 5 要件がないためデフォルト
非正常のしきい値 2 要件がないためデフォルト
間隔 30 要件がないためデフォルト
成功コード 200、301 https通信を実装するとリダイレクトが挟まれ、301コードが返ってくるため
ターゲットの登録 ・EC2-Wordpress01-1
・EC2-Wordpress01-2
タグ:Name TGN-Wordpress01 入力は任意
タグ:Env WordPress01 入力は任意


7.作成したインスタンスを登録済みに追加しましょう。

8.確認して作成します。

9.ターゲットグループにタグを追加しました。

10.サイドメニューのセキュリティグループからALB用セキュリティグループを選び、一時的にhttpでアクセスするためにインバウンドルールを修正しましょう。

2.Route53作成

1.サービスからルート53、サイドメニューからホストゾーン、ホストゾーンの作成へと進んでいきます。

2.以下の設定値に従ってホストゾーンを作成します。(今回は練習のために設定値のみ記載していますが、実際にパブリックホストゾーンを利用するにはドメインの購入が必要になります)

設定項目 設定値 理由
ドメイン名 自分のドメイン名 入力内容は任意
説明 入力は任意
タイプ パブリックホストゾーン インターネットに公開するため
タグ:Name Route53-Wordpress01-tr 入力は任意
タグ:Env WordPress01 入力は任意

3.以下の設定値に従ってレコードを作成します。

設定項目 設定値 理由
レコード名 任意のレコード名 入力内容は任意
レコードタイプ Aレコード ALBに接続するためAWS内部ではエイリアスレコードとして扱うが、外部からはAレコードとして扱うため
ルーティングポリシー シンプルルーティング ルーティング先が一つしかないため
トラフィックのルーティング先 ・エイリアス
・Application Load BalancerとClassic Load Balancer
・大阪リージョン
・ALB-Worpress01
ALBに接続するため
タグ:Name Route53-Wordpress01-tr 入力は任意
タグ:Env WordPress01 入力は任意

今回はいったんここで区切ります。
ぜひ続きもご確認ください。

Last modified: 2024-02-06

Author