ブログ

AWS Systems Manager(通称 SSM)を利用して WordPress 環境を Amazon EC2 に作成してみた

機能が多すぎて、最近まで AWS Systems Manager の世界に踏み込めなかったエンジニアの田中です。
皆さんは AWS Systems Manager を使いこなしていますか?

「AWS Systems Manager (SSM) とは、システム環境を統合的に管理して AWS リソース全体の運用タスクを自動化できるサービスです。」

── と言われても、使っていないと具体的にどんなことができるのか分からないですよね。

さまざまな使い道があるためにハードルが高くなってしまい、結局使えていない方が多いのではないでしょうか。

本ブログでは、そのような方々が最初の一歩を踏み出すための AWS Systems Manager (SSM) の使い方として、EC2 インスタンスに LAMP 環境を構築し、WordPress をインストールするまでの手順を SSM で自動化する方法をご紹介します。

※ 本ブログ記事の内容は 2024/07/01 時点の情報です。

AWS Systems Manager とは?

前述しました通り、AWS Systems Manager とは、システム環境を統合的に管理して AWS リソース全体の運用タスクを自動化できるサービスです。

例えば、EC2 に SSH 接続しなくても AWS Systems Manager を使用してスクリプトを実行し OS 環境の制御ができたり、スクリプトや実行結果も一元管理できたりします。

今回はスクリプトを SSM ドキュメントとして作成し、特定の EC2 に対して SSM ドキュメントを RunCommand 実行することにより、LAMP 環境整備から WordPress のインストールまでを自動化します。

本ブログの前提条件

  • EC2 にはパブリック IP が付与されている。
  • OS は Amazon Linux 2023 を使用する。
  • EC2 には SSM エージェントがインストールされているものとする。
    ※通常 Amazon Linux 2023 には AMI から起動した時点でインストールされている。
  • EC2 には ​1, AWS 管理ポリシー​「AmazonSSMManagedInstanceCore」と、2, S3 バケットへの操作を許可するポリシーが付与されたロールがアタッチされている。
  • コマンド実行時の出力を保存するための S3 バケットが作成されている。

AWS Systems Manager で WordPress 環境を EC2 に作成 -
① SSM ドキュメント作成

まずは実行したいスクリプトを SSM ドキュメントとして作成します。

AWS マネジメントコンソールの検索ボックスに Systems Manager と入力し、検索結果に表示される Systems Manager をクリックします。

左メニュー欄からドキュメントを選択します。

「ドキュメントの作成」から、「コマンドまたはセッション」を選択する。

名前は何でもいいので「WordPress-setup」としました。
ターゲットタイプは「EC2 Instance」を選択し、ドキュメントタイプは「Command」とします。
コンテンツには JSON を指定し、LAMP 環境整備から WordPress インストールまでの一連のスクリプトを入力し、「ドキュメントの作成」をクリックします。

(JSON、スクリプトの説明は本ブログ記事の巻末に記載しておきます)

SSM ドキュメントの作成完了です。
作成した SSM ドキュメントは「自己所有」項目に表示されます。

AWS Systems Manager で WordPress 環境を EC2 に作成 -
② Run Command 実行

作成した SSM ドキュメントを元に RunCommand を EC2 インスタンスに実行します。

左メニューの Run Command をクリックします。

右上の「Run command」をクリックします。

前手順で作成した SSM ドキュメントを選択します。

ターゲットインスタンスを手動で選択します。

実行結果を出力する S3 バケットを選択します。

コマンドがエラーなく実行されたか、エラーが出た場合どの処理がエラーとなったのか、などを管理するためにも極力設定することを推奨します。

残りの設定はデフォルトで「実行」をクリックします。

ステータスが「進行中」から「成功」に変わるまで待ちます。

試しに EC2 のパブリック IP にアクセスしてみると、無事に WordPress の管理者ユーザー登録画面が表示され、Dashboard へのログインも成功しました。

ユーザーデータとの違い

ここまで実施すると、恐らくユーザーデータとの違いに疑問を抱かれた方は多いかと思います。

大きな違いとして挙げられる点は、ユーザーデータではスクリプトの実行が不確実であるという点です。

筆者も何度か同じ内容のスクリプトを EC2 起動画面のユーザーデータに入力してみましたが、WordPress と DB との連携がうまくいかずエラーを起こしたり、phpMyAdmin のインストールができ出来なかったりと一度も成功しませんでした。

どうやらユーザーデータでは、時間がかかる処理が発生する場合にはスクリプトの実行が不安定になるようです。内部的にはユーザーデータよりも Run Command を使用したスクリプト実行の方が確実に処理を行ってくれることが検証過程で分かりました。

さらに、実行結果やエラー内容の管理についても SSM に利点があります。SSM ではスクリプト実行中にエラーが発生したとしても、実行結果を S3 か CloudWatch Logs に残すため、EC2 にログインせずにどの処理でエラーが起きているかが分かります。

また、複数台のインスタンスを用意する場合には出力結果を一元管理することが可能です。

一方ユーザーデータでは、処理にエラーが発生した際には OS 内部のエラーログとして出力させる事になりますが、その場合の出力結果の一元管理には複雑な工夫が必要です。

AWS Systems Manager で WordPress 環境を EC2 に作成 (まとめ)

AWS Systems Manager (SSM) の第一歩目はいかがでしたでしょうか?

今回は AWS Systems Manager の RunCommand に焦点を当てましたが、この機能だけでもかなり便利なサービスであることがお分かりいただけたと思います。SSM では他にも色々な便利機能が提供されていますので筆者も SSM 達人を目指して使っていこうと思います。

また、本ブログ記事では EC2 を Web サーバとして運用する際に重要な、セキュリティ的な観点は省略しておりますが、Web サイトを公開する上で対策は不可欠です。AWS での堅牢な Web サーバの構築・運用についてご興味がございましたら、ぜひ弊社までお気軽にお問い合わせください。

最後までお読みいただきまして、ありがとうございました。


補足

「① SSM ドキュメント作成」のコンテンツ(JSON)

{
  "schemaVersion": "2.2",
  "description": "Install LAMP stack and setup WordPress on Amazon Linux 2023, secure MariaDB, and install phpMyAdmin",
  "mainSteps": [
    {
      "action": "aws:runShellScript",
      "name": "setupLAMPandWordPress",
      "inputs": {
        "runCommand": [
          "#!/bin/bash",
          "set -e",
          "sudo dnf update -y",
          "sudo dnf install -y httpd wget php-fpm php-mysqli php-json php php-devel mariadb105-server php-mbstring php-xml expect",
          "sudo systemctl enable --now httpd",
          "sudo systemctl enable --now mariadb",
          "cd /var/www/html",
          "wget https://wordpress.org/latest.tar.gz",
          "tar -xzf latest.tar.gz",
          "sudo mv /var/www/html/wordpress/* /var/www/html/",
          "sudo rmdir /var/www/html/wordpress",
          "sudo chown -R ec2-user:apache /var/www/html",
          "sudo chmod -R 2775 /var/www/html",
          "find /var/www/html -type d -exec sudo chmod 2775 {} \\;",
          "find /var/www/html -type f -exec sudo chmod 0664 {} \\;",
          "sudo mysql -e \"CREATE DATABASE wordpress;\"",
          "sudo mysql -e \"CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '<任意のパスワード>';\"",
          "sudo mysql -e \"GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';\"",
          "sudo mysql -e \"FLUSH PRIVILEGES;\"",
          "cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php",
          "sed -i \"s/database_name_here/wordpress/\" /var/www/html/wp-config.php",
          "sed -i \"s/username_here/wpuser/\" /var/www/html/wp-config.php",
          "sed -i \"s/password_here/<任意のパスワード>/\" /var/www/html/wp-config.php",
          "sudo usermod -a -G apache ec2-user",
          "echo '<?php phpinfo(); ?>' > /var/www/html/info.php",
          "sudo systemctl restart httpd",
          "cd /var/www/html",
          "wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz",
          "mkdir phpMyAdmin && tar -xvzf phpMyAdmin-latest-all-languages.tar.gz -C phpMyAdmin --strip-components 1",
          "rm phpMyAdmin-latest-all-languages.tar.gz",
          "sudo systemctl restart php-fpm",
          "sudo systemctl restart httpd"
        ]
      }
    }
  ]
}

<スクリプトの説明>

  • `set -e`: エラーが発生した場合にスクリプトの実行を停止します。
  • `sudo dnf update -y`: システムのパッケージを最新に更新します。
  • `sudo dnf install -y httpd wget php-fpm php-mysqli php-json php php-devel mariadb105-server php-mbstring php-xml expect`: Apache HTTPサーバー、wget、PHP、MariaDBサーバー、その他必要なPHPモジュールをインストールします。
  • `sudo systemctl enable --now httpd`: Apache HTTPサーバーを起動し、自動起動を有効にします。
  • `sudo systemctl enable --now mariadb`: MariaDBサーバーを起動し、自動起動を有効にします。
  • `cd /var/www/html`: ウェブサーバーのルートディレクトリに移動します。
  • `wget https://wordpress.org/latest.tar.gz`: WordPressの最新バージョンをダウンロードします。
  • `tar -xzf latest.tar.gz`: ダウンロードしたWordPressを解凍します。
  • `sudo mv /var/www/html/wordpress/* /var/www/html/`: 解凍したWordPressファイルをウェブサーバーのルートディレクトリに移動します。
  • `sudo rmdir /var/www/html/wordpress`: 空になったディレクトリを削除します。
  • `sudo chown -R ec2-user:apache /var/www/html`: ウェブサーバーのルートディレクトリの所有権を変更します。
  • `sudo chmod -R 2775 /var/www/html`: ディレクトリのアクセス権を変更します。
  • `find /var/www/html -type d -exec sudo chmod 2775 {} \;`: 全ディレクトリのアクセス権を設定します。
  • `find /var/www/html -type f -exec sudo chmod 0664 {} \;`: 全ファイルのアクセス権を設定します。
  • `sudo mysql -e "CREATE DATABASE wordpress;"`: WordPress用のデータベースを作成します。
  • `sudo mysql -e "CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password';"`: WordPress用のデータベースユーザーを作成します。
  • `sudo mysql -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';"`: データベースユーザーに全ての権限を付与します。
  • `sudo mysql -e "FLUSH PRIVILEGES;"`: データベースの権限をリフレッシュします。
  • `cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php`: WordPressの設定ファイルのサンプルをコピーします。
  • `sed -i "s/database_name_here/wordpress/" /var/www/html/wp-config.php`: 設定ファイルのデータベース名を変更します。
  • `sed -i "s/username_here/wpuser/" /var/www/html/wp-config.php`: 設定ファイルのデータベースユーザー名を変更します。
  • `sed -i "s/password_here/password/" /var/www/html/wp-config.php`: 設定ファイルのデータベースパスワードを変更します。
  • `sudo usermod -a -G apache ec2-user`: ec2-userをApacheグループに追加します。
  • `echo '<?php phpinfo(); ?>' > /var/www/html/info.php`: PHP情報を表示するファイルを作成します。
  • `sudo systemctl restart httpd`: Apache HTTPサーバーを再起動します。
  • `cd /var/www/html`: ウェブサーバーのルートディレクトリに移動します。
  • `wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz`: phpMyAdminの最新バージョンをダウンロードします。
  • `mkdir phpMyAdmin && tar -xvzf phpMyAdmin-latest-all-languages.tar.gz -C phpMyAdmin --strip-components 1`: phpMyAdminを解凍し、指定のディレクトリに配置します。
  • `rm phpMyAdmin-latest-all-languages.tar.gz`: ダウンロードした圧縮ファイルを削除します。
  • `sudo systemctl restart php-fpm`: PHP-FPMを再起動します。
  • `sudo systemctl restart httpd`: Apache HTTPサーバーを再起動します。

元記事発行日: 2024年08月09日、最終更新日: 2024年08月07日