社内AWS研修の振り返り

## 取り組みを実施した背景
社内の新人Webエンジニアがインフラにあまり慣れていなかった為、インフラスキルの向上を目的にAWS研修を実施していただきました🙇‍♂️

## 実施にあたり自分のAWSに関するスキル感
- EC2上でWordPressを立てたことがある
  - プライベートサブネットにWordPressのEC2サーバを、プライベートサブネットにMySQLのEC2サーバを立てた
  - <a href="https://aws.amazon.com/jp/elasticloadbalancing/?whats-new-cards-elb.sort-by=item.additionalFields.postDateTime&whats-new-cards-elb.sort-order=desc">ELB</a>や<a href="https://aws.amazon.com/jp/autoscaling/">AWS Auto Scaling</a>は使用したことがない

## 今回作ったインフラの構成図と使用したもの
### 開発環境

```plantuml
@startuml
!define AWSPUML https://raw.githubusercontent.com/milo-minderbinder/AWS-PlantUML/release/18-2-22/dist
!includeurl AWSPUML/common.puml
!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/master/dist
!include AWSPuml/AWSCommon.puml
!include AWSPuml/General/Users.puml
!includeurl AWSPUML/Compute/AmazonVPC/AmazonVPC.puml
!includeurl AWSPUML/Compute/AmazonEC2/AmazonEC2.puml
!includeurl AWSPUML/Compute/AmazonEC2/AutoScaling/AutoScaling.puml
!includeurl AWSPUML/Compute/ElasticLoadBalancing/ApplicationLoadBalancer/ApplicationLoadBalancer.puml
!includeurl AWSPUML/Database/AmazonRDS/AmazonRDS.puml
!includeurl AWSPUML/SecurityIdentityCompliance/AWSCertificateManager/certificatemanager/certificatemanager.puml

left to right direction

Users(sources_2, "ブラウザでHTTPアクセス", "(仮)利用者")
Users(sources_1, "SSHアクセス", "開発者")

AMAZONVPC("AMAZONVPC") {
  package "PublicSubnet" {
        AMAZONEC2(ec2_1 , "リバースプロキシ, WEB, DB") {
        }
  }
}
sources_1 --> ec2_1
sources_2 --> ec2_1
@enduml
```

### 本番環境
```plantuml
@startuml
!define AWSPUML https://raw.githubusercontent.com/milo-minderbinder/AWS-PlantUML/release/18-2-22/dist
!includeurl AWSPUML/common.puml
!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/master/dist
!include AWSPuml/AWSCommon.puml
!include AWSPuml/General/Users.puml
!includeurl AWSPUML/Compute/AmazonVPC/AmazonVPC.puml
!includeurl AWSPUML/Compute/AmazonEC2/AmazonEC2.puml
!includeurl AWSPUML/Compute/AmazonEC2/AutoScaling/AutoScaling.puml
!includeurl AWSPUML/Compute/ElasticLoadBalancing/ApplicationLoadBalancer/ApplicationLoadBalancer.puml
!includeurl AWSPUML/Database/AmazonRDS/AmazonRDS.puml
!includeurl AWSPUML/SecurityIdentityCompliance/AWSCertificateManager/certificatemanager/certificatemanager.puml

left to right direction


Users(sources_2, "ブラウザでHTTPアクセス", "(仮)利用者")
Users(sources_1, "SSHアクセス", "開発者")
AMAZONVPC("AMAZONVPC") {
  package "PublicSubnet" {
      APPLICATIONLOADBALANCER("APPLICATIONLOADBALANCER"){
           CERTIFICATEMANAGER("CERTIFICATEMANAGER")
      }
        AUTOSCALING("AutoScaling"){
            AMAZONEC2(ec2_1 , "リバースプロキシ, WEB") {
            }
            AMAZONEC2(ec2_2 , "リバースプロキシ, WEB") {
            }
       }
  }
  package "PrivateSubnet" {
    AMAZONRDS("AMAZONRDS", "DB") {
     }
   }
}
sources_1 --> ec2_1
sources_2 --> APPLICATIONLOADBALANCER
APPLICATIONLOADBALANCER --> ec2_1
APPLICATIONLOADBALANCER --> ec2_2
ec2_1 --> AMAZONRDS
ec2_2 --> AMAZONRDS
@enduml
```

### 使用したもの
 - OS: Amazon Linux release 2 (Karoo)
 - リバースプロキシサーバ: nginx 1.18.0
 - WEBサーバ: PHPビルトインウェブサーバ
   - PHP 8.0.1
 - DBサーバ: MySQL 8.0.20



# 研修の流れと「やったこと、わかったこと、わからなかったこと」

## 座学 📚
  - IPアドレスやサブネットマスク
     - <a href="https://qiita.com/mogulla3/items/efb4c9328d82d24d98e6">IPアドレスの基礎知識 - Qiita</a> 
  - OSの種類
  - yumやapt-getについて
  - リージョンやアベイラビリティーゾーン
     - 可用性の高め方
  - VPCやサブネット
     - パブリックサブネットとプライベートサブネットの使い分け
     - <a href="https://blogs.itmedia.co.jp/hokaritomoya/2021/01/cloud-network-easy.html#utm_source=ent-mag&utm_campaign=20210128">VPCやサブネットってなんなの？AWSをオフィスビルでわかりやすく表現してみた：穂苅智哉の Webビジネス！日進月歩：オルタナティブ・ブログ</a>
  - EC2、RDS、ELBについて
     -  <a href="https://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde">0から始めるAWS入門：概要 - Qiita</a> 

  - 分からなかったこと
    - ロードバランサーの設定方法イメージ出来なかった
       - WEBサーバの前段でアクセス負荷を分散させてくれるということは知っていた
       - しかし、スキーム、証明書の設定、ターゲットグループといった概念や設定方法をなんとなくでしか理解していなかった
       - 後ほど行ったハンズオンで理解することが出来ました🙇‍♂️

## 開発環境構築（ハンズオン）🔧

### やったこと
- パブリックサブネットでグローバルIPのあるEC2を作成
- yumでnginxを入れて初期ページを表示する

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605440/ca476887-a37f-8e14-0b17-a83652d456d9.png">

- yumでPHP8系をインストール
  - その後PHPのビルトインサーバでHelloWorld
     - PHP-FPMとビルトインサーバの2つがWEBサーバの候補で、他の参加者がPHP-FPMを選んでいたため物は試しと思いあえてビルトインサーバの方を選んだ（結果的に良くない実装だった😣 ）

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605440/cd1791f6-1fef-a123-c005-868f27e68552.png"> 



- yumでMySQL8系をインストール
  - その後ビルトインサーバでHelloWorld
      - PHPでMySQLに入れたダミーデータを取得し表示

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605440/6aaa9686-a3f9-d037-4ff1-0c50936e26cf.png">


- WordPressをインストール
  - nginx.confにルーティングを記述し、nginx再起動
  - ビルトインサーバを起動
  - IPアドレス経由でWordpressが開くかどうかをデバッグしながら確認

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605440/4c09a4de-ee87-b939-efec-44b468723151.png">


### 分かったこと
- EC2インスタンスの構築方法
- MySQL5.7系以降のパスワードの初期値について
  - <a href="https://kitsune.blog/mysql-login">参考サイト: MySQLにrootでログインできない！初期設定やファイル変更が必要です！ </a>
- PHPにおけるMySQLとの連携方法

### 分からなかったこと
  - WordPressコンテンツが読み込まない状態になってしまった
    - DB内の「WordPressの設定データ」が間違っていた可能性がある
      - 原因調査しきれず🙇‍♂️
    - WordPress再インストールとconfigの再設定、DBの再生成で直った🙇‍♂️
  
## 本番環境構築（ハンズオン）🚀
### やったこと
- 開発環境からのコピー
  - 開発環境のEC2からamiを作成し、本番環境のEC2を生成&起動
  - 開発環境のDBからdump取って、本番環境のRDSに入れる

### 分かったこと
  - amiのとり方
  - amiから複製する方法
  - 開発環境のDBからdumpをエクスポートする方法
  - 本番環境のDBにdumpをインポートする方法

### 分からなかったこと
  - 特になし
  
## 本番環境構築（ハンズオン）続き🚀
### やったこと
  - <a href="https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/introduction.html">ALB</a>の作成
     - <a href="https://qiita.com/suzuki-navi/items/a8f4e21d75e685df51e9">AWSの3種類のLBの比較と使い分け (ALB, NLB, CLB) - Qiita</a>
  - <a href="https://aws.amazon.com/jp/certificate-manager/">ACM</a>を利用してSSL証明書の作成とALBへの設定
  - AutoScalingさせる
    - ターゲットグループの設定
    - オートスケーリンググループの設定
 
### わかったこと
  - AutoScalingの設定方法
  - <a href="http://httpd.apache.org/docs/2.4/programs/ab.html">ApacheBench</a>コマンドを用いた負荷テストで、Scalingするかを確認する方法
    - <a href="https://qiita.com/flexfirm/items/ac5a2f53cfa933a37192">Apache Benchでサクッと性能テスト - Qiita</a>

### 分からなかったこと
  - AutoScalingで新規起動したサーバでビルトインサーバを起動する方法😣
  
# 個人アプリ検討、選定、実装まで

### 検討
 - [MoonGift](https://moongift.jp/)等でOSSを調べて以下のアプリに興味を持った
    - <a href="https://www.zaproxy.org/">OWASP ZAP</a>
       - Webアプリケーションセキュリティスキャナー
    - <a href="https://redmine.jp/">Redmine</a>
       - プロジェクト管理ソフトウェア
    - <a href="https://github.com/meetmore/lottery.js">Lottery</a>
      - 懇親会等で使えそうなルーレットアプリ

### 選定
- Dockerで立ち上げ可能なアプリを選定
- 第1候補: OwaspZap
  - 理由: 今後業務でアプリを作った際に試しに自己診断してみたいと考えたため
- 第2候補: Redmine
  - 理由: チケット管理ツールを立ち上げて実際に使ってみることで、今後の開発時に活きる「実装アイディア」を得られればなと考えた
      - ただ、現状業務ではプロジェクト管理はGitHub内の機能を使用しているため、Redmineが業務に直接活きないと考えたため第2候補にした
 
### 実装
- OwaspZap
  - DockerでCUIが起動出来た
    - しかし、GUIを起動するにはマシンリソース不足だったため断念😓
- Redmine
  - Dockerを用いて起動出来た
    - GUIで起動出来た🙌

# 振り返り🧐
### うまくいったこと 👍
- EC2インスタンスで開発環境と本番環境を作ること
- LBを経由してWordPressを公開すること

### うまくいかなかったこと😓
- nginxのルーティングをベストな設定で記述したかった
  - 十分な理解が無いままに記述して序盤上手く行ってしまったため、終盤にルーティングがぐちゃぐちゃになって困った
- WordPressを稼働させる上で最適な構成にしたかった
  - ビルトインサーバで稼働させる方向で進めてしまった
    - その影響もありAutoScalingの設定時に他の参加者では不要な作業が発生した
      - もし次やるならPHP-FPMで作りたい

### 今後トライしたいこと💪
- コンテナ周りのマネージドサービスを適切に使用して、運用負荷の少ないシステム構築すること
- nginxのルーティングを、きちんと理解した上で記述出来るようにすること
- AutoScalingで新規起動したサーバ上で、アプリケーションもちゃんと起動するようにすること

# まとめ
一度プライベートでEC2でWordPressを立てたことはあったのですが、ざっくりとしか着手していなかった為今回の研修では「わかっていなかった所」が数多く見つかり、かつその理解を深めることが出来たのでとても良かったです。ありがとうございました🙇‍♂️

「ビルトインサーバでWordPress環境構築」という、「PHP-FPMを使った構築」より比較的情報が少ないかつ本番環境では非推奨な実装方法で進めてしまったため、問題が起こったときの原因究明が難しかったことが印象に残っています。（とはいえ、インフラの根本的な仕組みについて理解していれば解決は難しくないはず。主に自身の実力不足。）
今後技術選定を行うときは、「信頼できる情報源が豊富かどうか」も頭に入れた方が良いと学びました。