取り組みを実施した背景
社内の新人Webエンジニアがインフラにあまり慣れていなかった為、インフラスキルの向上を目的にAWS研修を実施していただきました🙇♂️
実施にあたり自分のAWSに関するスキル感
- EC2上でWordPressを立てたことがある
- プライベートサブネットにWordPressのEC2サーバを、プライベートサブネットにMySQLのEC2サーバを立てた
- ELBやAWS Auto Scalingは使用したことがない
今回作ったインフラの構成図と使用したもの
開発環境
本番環境
使用したもの
- OS: Amazon Linux release 2 (Karoo)
- リバースプロキシサーバ: nginx 1.18.0
- WEBサーバ: PHPビルトインウェブサーバ
- PHP 8.0.1
- DBサーバ: MySQL 8.0.20
研修の流れと「やったこと、わかったこと、わからなかったこと」
座学 📚
-
IPアドレスやサブネットマスク
-
OSの種類
-
yumやapt-getについて
-
リージョンやアベイラビリティーゾーン
- 可用性の高め方
-
VPCやサブネット
- パブリックサブネットとプライベートサブネットの使い分け
- VPCやサブネットってなんなの?AWSをオフィスビルでわかりやすく表現してみた:穂苅智哉の Webビジネス!日進月歩:オルタナティブ・ブログ
-
EC2、RDS、ELBについて
-
分からなかったこと
- ロードバランサーの設定方法イメージ出来なかった
- WEBサーバの前段でアクセス負荷を分散させてくれるということは知っていた
- しかし、スキーム、証明書の設定、ターゲットグループといった概念や設定方法をなんとなくでしか理解していなかった
- 後ほど行ったハンズオンで理解することが出来ました🙇♂️
- ロードバランサーの設定方法イメージ出来なかった
開発環境構築(ハンズオン)🔧
やったこと
- パブリックサブネットでグローバルIPのあるEC2を作成
- yumでnginxを入れて初期ページを表示する
- yumでPHP8系をインストール
- その後PHPのビルトインサーバでHelloWorld
- PHP-FPMとビルトインサーバの2つがWEBサーバの候補で、他の参加者がPHP-FPMを選んでいたため物は試しと思いあえてビルトインサーバの方を選んだ(結果的に良くない実装だった😣 )
- その後PHPのビルトインサーバでHelloWorld
- yumでMySQL8系をインストール
- その後ビルトインサーバでHelloWorld
- PHPでMySQLに入れたダミーデータを取得し表示
- その後ビルトインサーバでHelloWorld
- WordPressをインストール
- nginx.confにルーティングを記述し、nginx再起動
- ビルトインサーバを起動
- IPアドレス経由でWordpressが開くかどうかをデバッグしながら確認
分かったこと
- EC2インスタンスの構築方法
- MySQL5.7系以降のパスワードの初期値について
- PHPにおけるMySQLとの連携方法
分からなかったこと
- WordPressコンテンツが読み込まない状態になってしまった
- DB内の「WordPressの設定データ」が間違っていた可能性がある
- 原因調査しきれず🙇♂️
- WordPress再インストールとconfigの再設定、DBの再生成で直った🙇♂️
- DB内の「WordPressの設定データ」が間違っていた可能性がある
本番環境構築(ハンズオン)🚀
やったこと
- 開発環境からのコピー
- 開発環境のEC2からamiを作成し、本番環境のEC2を生成&起動
- 開発環境のDBからdump取って、本番環境のRDSに入れる
分かったこと
- amiのとり方
- amiから複製する方法
- 開発環境のDBからdumpをエクスポートする方法
- 本番環境のDBにdumpをインポートする方法
分からなかったこと
- 特になし
本番環境構築(ハンズオン)続き🚀
やったこと
わかったこと
- AutoScalingの設定方法
- ApacheBenchコマンドを用いた負荷テストで、Scalingするかを確認する方法
分からなかったこと
- AutoScalingで新規起動したサーバでビルトインサーバを起動する方法😣
個人アプリ検討、選定、実装まで
検討
- MoonGift等でOSSを調べて以下のアプリに興味を持った
選定
- Dockerで立ち上げ可能なアプリを選定
- 第1候補: OwaspZap
- 理由: 今後業務でアプリを作った際に試しに自己診断してみたいと考えたため
- 第2候補: Redmine
- 理由: チケット管理ツールを立ち上げて実際に使ってみることで、今後の開発時に活きる「実装アイディア」を得られればなと考えた
- ただ、現状業務ではプロジェクト管理はGitHub内の機能を使用しているため、Redmineが業務に直接活きないと考えたため第2候補にした
- 理由: チケット管理ツールを立ち上げて実際に使ってみることで、今後の開発時に活きる「実装アイディア」を得られればなと考えた
実装
- OwaspZap
- DockerでCUIが起動出来た
- しかし、GUIを起動するにはマシンリソース不足だったため断念😓
- DockerでCUIが起動出来た
- Redmine
- Dockerを用いて起動出来た
- GUIで起動出来た🙌
- Dockerを用いて起動出来た
振り返り🧐
うまくいったこと 👍
- EC2インスタンスで開発環境と本番環境を作ること
- LBを経由してWordPressを公開すること
うまくいかなかったこと😓
- nginxのルーティングをベストな設定で記述したかった
- 十分な理解が無いままに記述して序盤上手く行ってしまったため、終盤にルーティングがぐちゃぐちゃになって困った
- WordPressを稼働させる上で最適な構成にしたかった
- ビルトインサーバで稼働させる方向で進めてしまった
- その影響もありAutoScalingの設定時に他の参加者では不要な作業が発生した
- もし次やるならPHP-FPMで作りたい
- その影響もありAutoScalingの設定時に他の参加者では不要な作業が発生した
- ビルトインサーバで稼働させる方向で進めてしまった
今後トライしたいこと💪
- コンテナ周りのマネージドサービスを適切に使用して、運用負荷の少ないシステム構築すること
- nginxのルーティングを、きちんと理解した上で記述出来るようにすること
- AutoScalingで新規起動したサーバ上で、アプリケーションもちゃんと起動するようにすること
まとめ
一度プライベートでEC2でWordPressを立てたことはあったのですが、ざっくりとしか着手していなかった為今回の研修では「わかっていなかった所」が数多く見つかり、かつその理解を深めることが出来たのでとても良かったです。ありがとうございました🙇♂️
「ビルトインサーバでWordPress環境構築」という、「PHP-FPMを使った構築」より比較的情報が少ないかつ本番環境では非推奨な実装方法で進めてしまったため、問題が起こったときの原因究明が難しかったことが印象に残っています。(とはいえ、インフラの根本的な仕組みについて理解していれば解決は難しくないはず。主に自身の実力不足。)
今後技術選定を行うときは、「信頼できる情報源が豊富かどうか」も頭に入れた方が良いと学びました。