社内AWS研修振り返り

# 取り組みを実施した背景
この記事は、新人社員のインフラ知識向上を目的に、AWSを使用した簡単なWEBアプリケーション環境の構築を行った研修のブログ記事です。

# 最終目標
今回はこのような構成のインフラ環境の構築を目標に進めました。

## 開発環境
<img src="http://www.plantuml.com/plantuml/png/bL9FQzH05B_dKqnpsi9cm-Oa7gJxPx52LuDfBNWfaydRtS79J9XvGr4fQ8gWz2e5hnx4dhm9wiS9KlqMJh9qiouireNDlBpV-_qPNlOCKeqs5zvE1ZCkWGoEa_XeUa0MY8Mv6uQQdlRc71SsjGOqKn91Oe-fFCovK47EPGOwRPwXumQne1ATGAX103KGzky4KH15OSODUZjSCc4pi5hSE8LEArUoLsocSE-tI45FZQ2fgS-0Ey04CwM3eaxX1CAS6WJzb_bAlSuxMZVVnE-314r5UEGyJJkpUG6dKLY4S93J5qe-YKTjTLlIP1IrrN-HBAg4KS7bVBt-jyH4K8ES7IYQ3QcWaZKAHI4ueyYLR07Gs_hRNSOKQKhDJTB7uwIjjhCIO5PpVFuW0udkhBCANbirgmADV5R7W2cLTEvoiRQLRsqj_Jm1CoIeYERp1PACQs3rVJolsMx7AAiPc9EeI_pg_B8wlwhAJrNvjNfzKPNlzWyFuwhyM9LVgl97LNxptTJFjrVNxp__UlN6tztGw3iqIVOt2RylBwu_V5yIlC5qyFJHG_U9TFnLwU-IbnuX1MNFN73YnpOLd2KsbO1-0or_Iu9RVmTOTD8dJljuCkoIGTmbuw5JQKVFlFf_vgsYaI2uHnhQgXUjzVP0PZONVm00">

## 本番環境
<img src="http://www.plantuml.com/plantuml/png/bL9FRzCm5B_dKtWvTTAoQ3aX3cZk7xPA_HCj7PEuJAxZTXQE4zaE4w1Aa0a9j2kQn9K3OYTkIC37YT3WMs2dMys2GeSFpijx_lrvzjkL2WcL9ypPYCcCSWBWKHGU3WVWHAbCtlTzWKwtvrITvDDS4e5JhWXNspXD_8Ior4ieZucOLhkliLx845UQm1U44II9ltFF2xmWy6CgbRD1EMPvJ7B1RfHypPMaV3khkz3_Tt21JYL3Ksc-7jK5wSrIuMN6XIRm4oGL4RV4L-p6RyUA_rtV8vm8nFn3hIdjcNe3cYFB5V5XWfwd_57OiT5TGRrEOAF_0kKgZJ1YbC__ZDTJz1YIYk91Yk8sOeZZYY7B6CL8qPJR0X5D-MQLBb9eYkIDquDkPADcL4HmBgXwrey9L_fhl39gfAgd8aBHcR51XeYZkVQ5RIffJ2tr74Pc2gWK23e_KI2cWc3JZ-DKhzkIQIumaSV15d3BiuloxB8iFfR5b_BLULcytPzCmgWiFfJ5vxBuNXPVNNtinvlBgtUVVhvyxMxMI7PqDOhswu1V5-TNxxyj0N087uz7UaHQxYfqDy4B1u0CuIVQE733VAglFSgdd2ZNbAe5mt3Gxy19VpmQZ66t3GTmrEaTjDo6WhkfaNRfpAJ_q9ph3U48xXbaFMT0rvZ52WiF9-Ee0mVzqPxMihDMumVBTlHmjWWEZdU0RloerzxIlg_xisln3s2m1cY3nQqx4_GfKiHUccNMizToLw5va6xRCXiMlIsSrIC2pti0gXvMkS3acbx0QSXRdhKd0aVlIsLhsgagjTmkuR6Uwzy0">

## 実施にあたり自分のAWSに関するスキル感
EC2やALBという単語を聞いたことはあるけど、実際どんな動きをしているかは答えられないレベル🙄
（学生の時、[Linuc](https://linuc.org/linuc1/range/101.html)という資格を取るために勉強したことがあるので、インフラについての知識が0だったわけではないですが、苦手意識が強く、実際にAWSを使用した環境構築をしたことはありませんでした）

# 研修の流れ・所感
## 1. 座学
- IPアドレス、サブネット、OSの種類等について、インフラの基礎知識
- region, availability zone, EC2, ALBなど、AWSの基礎知識

### **わかったこと**
前述の通り、IPアドレスやOSについては軽く勉強したことがあったので、教えていただきながら理解することができました。

### **わからなかったこと**
インターネットゲートウェイ、セキュリティグループ、ロードバランサーの設定は、どこをどこに繋げれば良いかわからず混乱しました。
特にセキュリティグループのインバウンドルールはどこを開ければ良いか迷いましたが、調べたり質問しながらハンズオンで実際に環境構築することで慣れていき、最終的にはうまく繋げることができました🎉

## 2. 開発環境構築（ハンズオン）
- EC2を使用し開発用サーバ構築
- 構築した開発用サーバへSSH接続し、必要なものをyumインストール
- Nginxのconfファイルを編集し、PHP, MySQL, Wordpressをそれぞれ使ったファイルの表示

今回用意した環境
- Amazon Linux release 2 (Karoo)
- NGINX(1.18.0)
- PHP(8.0.1)
- MySQL(8.0.2)
- PHP-FPM
- Wordpress

↓こんな感じで表示できました
PHPからこんにちは！
![スクリーンショット 2021-05-06 19.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908779/44520f6d-07e0-d173-0c87-250aa7ec00b6.png)

DBからこんにちは！
![スクリーンショット 2021-05-06 19.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908779/14e91871-46b9-d5a9-dc35-74557b58ce45.png)

Wordpressからこんにちは！
![スクリーンショット 2021-05-07 17.19.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908779/a4078c2c-dba9-a95d-5f7c-d0b3d0fdd2ca.png)

### **わかったこと**
教えてもらいながらということもあり、開発用サーバ構築や各ソフトウェアのインストールまでは結構すんなり進めたので、それまで苦手意識しかなかったAWSですが、少し楽しくなってきました。

### **わからなかったこと**
- PHP-FPMについては正直まだよくわかっていません😭 
調べると、PHP-FPMってなに? → FastCGIってなに? → …　ってなって沼にはまりそうだったので、一旦今回は記事に従ってPHPを動かすことだけを目標に進めました…
- Nginxも初めて触ったのですが、403や404エラーが出て、ファイル権限あるしパスもあってるはずなのに何で??? となったり、WordpressのHTMLは正常に表示されているのにJSとCSSだけ読み込まれていなかったりとたくさんはまり、小さなエラーの解決に何時間もかかったので、まだ勉強が必要だと感じました。（今回の研修で一番Nginxが一番難しかった…😭）

## 3. 本番環境構築（ハンズオン）
- 開発用サーバからAMIの取得、そのAMIから本番用のEC2を起動
- SSL証明書の取得、HTTPS化
- ドメインの用意
- 開発環境で使用したDBを別サーバ（RDS）へ移行し、ウェブサーバとDBサーバを分離
- ロードバランサ（ALB）の作成、起動したEC2の紐付け
- Auto Scalingの設定
- [Apache Bench](http://httpd.apache.org/docs/2.4/programs/ab.html)を使用し負荷テスト、スケールイン/アウトしているか確認

### **わかったこと**
ロードバランサ設定→セキュリティグループ設定→ターゲットグループ設定というALB作成の流れを掴むことができた。
また、Auto Scaling設定後の負荷テスト実施時、CloudWatchでスケールイン/アウトしている動きが目に見えて理解しやすかった。

### **わからなかったこと（はまったところ）**
Nginxの設定ファイル編集中、急にSSH接続できなくなりAWSコンソールを確認すると、接続先のインスタンスが停止されており、それまで作業していたインスタンスの中身が全部吹っ飛びました😭
何事かと思い相談すると、Nginxの設定に間違いがあり、Auto Scalingに設定しているインスタンスのヘルスチェックが通らず、インスタンスが自動停止されたようでした…
練習用で良かった…😭
この事件のおかげでAuto Scalingの設定時に気を付けるべきことやAMIを取得しておくべきだということを学びました😂

## 4. 個人アプリ検討、選定、実装
今回の研修の成果発表として、社内で使えるようなアプリを選定、実装することにし、私は[Roulette.js](http://demo.st-marron.info/roulette/sample/demo.html)を使わせていただくことにしました。
（環境は上記で3. 本番環境構築で構築したものをそのまま使用）

# 振り返り
## Keep
AWSを使用した簡単なWEBアプリケーション環境を構築し、作成手順や構造を把握することができた。
「ロードバランサー」や「Auto Scaling」など、聞いたことはあるけど漠然と「便利なんだな」としか認識していなかった言葉が、実際どういう風に使われ、どう便利なのかわかってきた。

## Problem
Nginxの設定がまだあまり理解できておらず、404エラーが発生したり、その404エラーを修正すると今度はWordpress内のJSとCSSだけが反映されなくなったりと、Wordpressを表示するだけでも手間取った。
（そもそもNginxにエラーログがあることを知らず、ブラウザに表示されるエラー（404とか）のみを見て戦っていたので、エラー修正にとても時間がかかった）

## Try
エラー発生時、表示されるエラーだけを見て対処するのではなく、他にも見えないところでエラーが発生していないか、デバッグの方法も調べるようにする。

# まとめ
ハンズオンしてみると、ドキュメントを読むだけではわからなかったエラーがたくさん発生するので、やっぱり実際に体験してみることが一番ですね！
苦手意識しかなかったインフラ構築ですが、今回の研修で苦手克服への第一歩を踏み出しました🎅
私が今関わっているプロジェクトでもAWSを使用しているので、今後はその業務に生かせるよう引き続き勉強します🎅🎅


## 参考記事集
AWSを理解するにあたりお世話になった記事
[0から始めるAWS入門：概要](https://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde)

PHP8系のインストールで詰まった時一番参考にした記事
[Installer PHP 8 & NGINX sur AWS EC2](https://yanik-lupien.com/nouvelles/installer-php-8-nginx-sur-aws-ec2)

一瞬でABテストできるようになる記事
[Apache Benchでサクッと性能テスト](https://qiita.com/flexfirm/items/ac5a2f53cfa933a37192)