Auto Scalingに触れてWebサーバのサステナビリティを考えてみた

#0.はじめに
##0.1.筆者について
元々ITエンジニアとしてキャリアを積んできましたが、ここ数年は構築やプログラミングをせず、現在はとあるBtoBtoCサイトのディレクションをしています。具体的には、ビジネスサイドと討議を重ね、要件をまとめ、何よりもビジネスをグロースするための開発施策を最優先に推進している立場です。

しかし、エンハンスを重ねるごとに、アーキテクチャが徐々に歪んでいくのを目の当たりにしており、それが僕としてはジレンマに感じられてしまいます。施策と並行してリファクタリングを進めたいのですが、そのような作業はビジネス視点で重要視されないためなかなか工数が取れません。

そんなある日、社内のSREから「AWSを広めていきたい」という話を持ちかけられました。もちろん興味はありましたが、最初は上述の経緯もあって、「本当に実現できるのかな」と不安でした。しかし、会話を重ねるごとに、「これはBiz側にも刺さるかも！」と直感したのです。

##0.2.このテーマに決めた理由
現在では担当プロダクトの大部分がAWSへマイグレーションを終え、改めてクラウドサービス（以下、当記事ではもっぱらAWSを指す）の恩恵を感じるようになりました。

従来のオンプレやプライベートクラウドと比較し、クラウドサービスには多くのメリットがありますが、僕は真っ先に**TCO(Total Cost of Ownership)削減**と**柔軟なスケーラビリティ**をメリットに挙げます。

なぜなら、**「コストが年間◯◯％削減できる」とか「ピーク時のページ表示が遅くなるのを改善できる」という効果は、普段システマチックなことにあまり興味を示さないBiz側のステークホルダでも強く関心を示してくれる**ことが多いからです。

特にWebサイトのページ表示速度はSEO評価に大きく影響するため、ピーク時にも耐えられる設計にしなければならない。だから、従来のオンプレでは無し得なかった**AWS Auto Scalingを使わない理由は無いなと真っ先に思いました。**

そこで今回は学び直しという観点で、Auto Scalingを使った入門レベルのWebサーバ構築をハンズオンしてみようと思いました。システム構成は下図の通りです。
![20210920_Qiita投稿_図01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/5e7bffce-15f4-1ffd-465e-a5ffe9070bcd.png)
具体的には、EC2で簡単なWebサーバを構築し、Auto ScalingでマルチAZの冗長構成を作ります。
そして、セッション管理のため、マネージド型のインメモリデータベース**"ElastiCache for Redis"**も構築したのですが、その手順まで書き切ると長くなっちゃうので、本記事ではAuto Scalingのみを対象とします。

#1.簡単なWebサーバを構築する
今回はAuto Scalingの構築をメインに紹介したいので、構築するWebサーバは最低限の設定にしています。また、構築手順も他のサイトや記事で紹介されているものばかりなので、ここではざっくり行ったことだけ書いていきます。

※ちなみに、本記事の作業PCはMacですが、以下の操作はWindowsユーザを考慮し表記を統一します。
・``TeraTarmなどのSSH接続ツール`` → ターミナル
・``control+クリック`` → 右クリック
・``Returnキー`` → Enterキー

##1.1.EC2インスタンスを起動
今回は無料枠で作成できる以下のインスタンスを作成しました。
・AMI：Amazon Linux 2
・インスタンスタイプ：t2.micro
・セキュリティグループ：下表の通り

|IP version|Type|Protocol|Port range|Source|
|:-:|:-:|:-:|:-:|:-:|
|IPv4|SSH|TCP|22|0.0.0.0/0|
|IPv4|HTTP|TCP|80|0.0.0.0/0|
|IPv6|HTTP|TCP|80|::/0|

ここまで出来たら、最後にキーペア作成のダイアログが出てくるので忘れずにpemファイルを作成しダウンロード。これでEC2インスタンスが完成です。

##1.2.Apacheのインストールと起動
ダウンロードしたキーペアを使ってデフォルトのec2-userでSSH接続でログインします。

ターミナルを開いてec2-userでログイン後、Apacheのインストールはいたってシンプルにyumを使用。
インストールができたら起動確認とテストページの表示確認（1.1.で作成したEC2インスタンスの"パブリックIPv4DNS"をブラウザのアドレスバーに入力してEnterを押下する）を行い、最後にApacheの自動起動を有効化しておきました。

```
$ sudo systemctl enable httpd
```
こうすることで、後ほどAuto Scalingによって起動される他のインスタンスでも、Apacheが自動的に起動されるようになります。

これでWebサーバの構築は完了となります。(実はPHPもインストールしてますが、本記事ではPHPを使用しないので割愛します。)

#2.Auto ScalingとALB(Application Load Balancer)を作る
ここでは、先程作成したEC2インスタンスのAMIを取得し、Auto Scalingの際、そのイメージからインスタンスを起動し、さらにロードバランサーとの紐付けまで行なっていきます。
##2.1.Webサーバのイメージを作成する
①マネジメントコンソール左ツリーの「▼インスタンス」＞「インスタンス」をクリックし、1.で作成したインスタンスIDをcontrol+クリック(Windowsの右クリック)し、「イメージとテンプレート　▶︎」＞「イメージを作成」を選択します。
![20210917_Qiita投稿_図10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/6338a9d2-577a-3c4c-c48a-e10ebc249947.png)

②「イメージ名」と「イメージの説明」に任意の文字を入力し、画面下の「イメージを作成」をクリックします。
![20210917_Qiita投稿_図11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/d199918a-0743-56dd-a6d5-25a4bddd8d00.png)
![20210917_Qiita投稿_図12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/ec379fe3-cf78-9d7c-169b-59e818b25e71.png)

③下図のような表示が出てきたら完了です。
![20210917_Qiita投稿_図13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/9710aa61-1bf8-cec5-51e9-cdff50135ad1.png)

##2.2.起動テンプレートを作成する
①マネジメントコンソールの「▼インスタンス」＞「起動テンプレート」をクリックし、右側の「起動テンプレートを作成」をクリックします。
![20210917_Qiita投稿_図15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/f54aba0b-09b3-80dd-a800-452b056bc764.png)

②「起動テンプレート名」、「テンプレートバージョンの説明」に任意の文字を入力します。
![20210917_Qiita投稿_図16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/21701040-91fc-9522-fe5d-db24d06a857b.png)

③Amazon マシンイメージ(AMI)で、2.1.で作成したイメージを選択し、インスタンスタイプにはイメージの元となったEC2インスタンス(1.1.で作成したもの)と同じt2.microを選択します。
![20210917_Qiita投稿_図17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/2d4d6da1-cbb9-f4fe-658b-81689ce04f76.png)

④1.1.で作成したEC2インスタンスと同じキーペアとセキュリティグループを選択。ここまで行なったら「起動テンプレートを作成」をクリックします。
![20210917_Qiita投稿_図18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/f2ef8d8a-a59e-fe96-31f3-8bacfcee0c68.png)

⑤起動テンプレートの作成が完了しました。そのまま赤枠で示した「Auto Scaling グループを作成」リンクをクリックします。
![20210917_Qiita投稿_図20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/fef43f16-4818-cb2d-d27e-15df4be514e0.png)

##2.3.Auto Scalingグループを作成する
①Auto Scaling グループ名に任意の文字を入力し、2.2.で作成した起動テンプレートを選択し、「次へ」をクリックします。
![20210917_Qiita投稿_図21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/ffd473d1-661f-6caf-f73f-bf4e784bbda3.png)
![20210917_Qiita投稿_図22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/06c157b6-bd1b-4e1e-aba7-5bfbb66848a5.png)

②インスタンスの購入オプションは「起動テンプレートに準拠する」を、VPCは既存のEC2インスタンスが存在する場所を選択。サブネットは耐障害性を考慮して既存のEC2インスタンスと別のAZを選択し、「次へ」をクリックします。
![20210917_Qiita投稿_図23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/41212e5a-0d97-91f3-df00-1c20bd1c888d.png)
![20210917_Qiita投稿_図24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/559c3fed-e54d-0441-6c83-fbc7b1ceab68.png)

③新たにロードバランサーにアタッチするため、「新しいロードバランサーにアタッチ」を選択し、ロードバランサーのタイプからは"Application Load Balancer(いわゆるALB)を選択します。
![20210917_Qiita投稿_図25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/168902ce-a900-9167-a964-dbba5f862ed8.png)

④ロードバランサーの名前はデフォルトの値とし、スキームはInternet-facingを選択。アベイラビリティーゾーンとサブネットは、既存のEC2インスタンスが存在するAZにもチェックを付けます。
![20210917_Qiita投稿_図26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/af452d54-1fbb-37f2-fafa-6da87e959903.png)

⑤デフォルトルーティング(転送先)で「ターゲットグループを作成する」を選択すると、新しいターゲットグループに自動的にグループ名が表示されるので、デフォルトのままとします。
![20210917_Qiita投稿_図27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/3a3c6c09-eda7-dd24-0d12-b72387cc9161.png)

⑥その他もデフォルトのまま、「次へ」をクリックします。
![20210917_Qiita投稿_図28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/1af3ddc6-9051-2364-5221-6367008347b0.png)

⑦今回は下図の通りグループサイズを設定します。(既存のEC2インスタンスに加え、④で指定したAZにもう1台インスタンスが作成されます。)
![20210917_Qiita投稿_図29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/88a49e79-c2f1-3a2e-31c0-d6011ff81fc1.png)

⑧スケーリングポリシーは「なし」を選択し、「次へ」をクリックします。以降、「通知の追加」と「タグの追加」のステップに進みますが、設定せず確認画面まで進みます。
![20210917_Qiita投稿_図30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/f45d938b-43bb-cefb-0e62-cd9f4d55ea66.png)

⑨確認画面が表示され、内容に問題なければ「Auto Scaling グループを作成」をクリック。
下図の画面が表示されたら作成は完了です。
![20210917_Qiita投稿_図36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/461d4dd8-abea-06d7-29c1-8ca7dc05600b.png)

⑩左メニューの「▼インスタンス(INSTANCES)」＞「インスタンス(Instances)」をクリックすると、新たなインスタンスがap-northeast-1cのAZに作成されたのが確認できます。
![20210917_Qiita投稿_図37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/d4c089d9-5ed2-d216-9567-9994323767ee.png)
ここでも、作成されたインスタンスのパブリックIPアドレスとキーペアを使って、SSHでログインすることも可能です。

#3.ちょっと遊んでみた・・・
本来はエンジニアらしくフェイルオーバーテストの結果なんかをお見せするべきなんでしょうが、長くなるので、やや遊びに近いのですがAuto Scalingの凄さをもっとより実感できるオペレーションを行なってみました・・・
①Auto Scalingで作成されたインスタンスを停止します。
![20210920_Qiita投稿_図04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/b20649ff-cccc-bf28-941d-88e84e3488bf.png)
②すると下図のようなダイアログが表示されますが、デタッチなどせず「停止」します。
![20210920_Qiita投稿_図05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/b44afc86-6163-2df2-8177-ee5161bb8c05.png)
③インスタンスが停止されます。
![20210920_Qiita投稿_図06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/1b4c9609-504b-b74a-181a-b243142e5941.png)
④ところが、停止したインスタンスとは別に、見慣れないインスタンスが勝手に起動され、気づいたら実行中になっていました。
![20210920_Qiita投稿_図07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016713/6f2faa0c-03c1-302e-2902-17047834afa7.png)
なるほど、これがグループサイズに指定した通り、1台止まったらすぐさまテンプレートから新たな1台を起動するようになっているのですね。
可用性を維持し**サステナブル**(持続可能性のある)**なWebサーバ**と言えそうです！

#4.おわりに
今回はおそらく入門レベルのハンズオンだったかと思いますが、このハンズオンを通して以下のようなことを実感しました。

**①とにかくリソース供給が早い**
もちろんしっかりしたインフラ設計は不可欠ですが、従来のオンプレやプライベートクラウドではここまで俊敏な構築は実現できなかったはずです。

**②可用性に富み、サステナブルなプロダクトをユーザーに提供できる**
冒頭にも述べましたが、ビジネスをグロースするための開発施策を最優先としつつ、いびつなアーキテクチャにならないようエンハンスを進めることが、僕の職責と捉えています。だから常日頃
**プロダクトのグロースを推進するためには、SEOやCVR向上などの施策だけでなく、システムもサステナブル(持続可能な)ものであるべきだ！**
と考えています。

テクノロジーばかり追求してもユーザーにプロダクトの進化を伝えにくいため、ユーザーがワクワクしビジネスを成功に導く施策を推進することは大事ですが、その施策は最適化されたアーキテクチャの上に成り立っていくものです。

ビジネスサイドや、クラウドの経験が浅いエンジニア(僕も含め)たちは、はじめは尻込みしてしまいそうですが、このAuto Scalingの構築の手軽さに触れ、ビジネスとシステムという点同士が線になっていくのを実感頂けると幸いです。

最後までお読みいただきありがとうございます。
次回は続編としてElastiCache for Redisのハンズオンについて投稿します。