ソリューションアーキテクトに学ぶFiNC AWS勉強会

はじめに

こんにちは、FiNCでSREを担当しているSatoshi Nakamuraです。

FiNCには半年前の2017年1月にジョインしました。
ジョインしてからほぼ ECS と Jenkins と戯れております。

今日はAWSの方にご協力いただき社内で開催した勉強会についてご紹介します。(SAの @akitsukada さん。本当にありがとうございました!!)

開催するに至った経緯

FiNCのインフラ環境はAWSをメインに使用しているのですが、ご存知の通りAWSのサービスはインフラ以外もたくさんあります。

EC2、ECS、RDSなどは当然使用していますが、開発ツールやアプリケーションサービスなどは未だ使用していないものの、使用したら何か課題解決が出来るのではないかという期待と新しいものに触れたいという気持ちからAWSの方に相談して開催することになりました。

勉強会の内容を検討

初のAWS勉強会な為、実施するにあたり業務で使用する可能性の高い『ALB、Application Load Balancerを使ったスケーラブルなWebSocketサーバクラスタ構築』を今回は実施することになりました。

■1. Serverless Architecture入門ハンズオン
対象者: サーバサイド開発者、インフラエンジニア
レベル: 初級

■2. AWS Elastic Beanstalkを使ったお手軽Webスタックの構築と開発
対象者: サーバサイド開発者、インフラエンジニア
レベル: 初級

■3. Amazon ECSを使ってコンテナベースでマイクロサービスを構築してみる
対象者: サーバサイド開発者、インフラエンジニア
レベル: 中級

■4. Amazon Pinpointを使ったプッシュ通知からのデータ分析
対象者: 
(前半)モバイルアプリ開発者
(後半)マーケティング担当者、ディレクター
レベル: 初級

■5. AWSのモバイル系サービス体験ハンズオン
対象者: モバイルアプリ開発者
レベル: 初級

■6. ALB、Application Load Balancerを使ったスケーラブルなWebSocketサーバクラスタ構築
対象者: サーバサイド開発者、インフラエンジニア
レベル: 中級

■7. AWS上で実現するCI/CDパイプライン
対象者: サーバサイド開発者、インフラエンジニア
レベル: 中級

■8. AWS IoTのMQTT Over WebSocketを用いたチャット機能
対象者: フロントエンドエンジニア、サーバサイド開発者、インフラエンジニア
レベル: 初級

参加者 11名

・SRE・・・3名
・サーバサイド開発者・・・8名 (インターン生、お母さんを含む)

勉強会の内容

■ ざっくりやった事
1. WebSocketサーバを立てて
2. Redisを立てて
3. チャットルームで試して
4. オートスケールグループを作って
5. 実際にスケールアウトさせてみる

こんな感じです。

ーーーーーーーーー 開始 ーーーーーーーーー

作ったもの

Node.jsで動いているチャットシステムに対して、コネクション数に応じて自動でサーバがスケールアウトするという環境を作りました。

ALBがない場合

•コネクション数や負荷状況を自分で状態管理し、クライアントがどのWebSocketサーバに接続すべきかを判定するアプ リケーション(Dispatcher)を実装する必要があった 
• クライアントはWebSocketサーバに直接接続する必要が あった = WebSocketサーバはインターネットに公開されていた 
• WebSocketサーバ群をオートスケーリングさせたいとき、 スケールイン時(サーバが減るとき)の状態更新、再接続先 取得など複雑な実装になりがちだった

Tips: クライアント側で適切に reconnect 処理を

• (ALB でなくても再接続を考慮するのは当然のことだが)
• 例えば Auto Scaling で接続先インスタンスがターミネート
すればもちろん WebSocket 接続は切断される
• クライアント側で再接続処理をすれば問題なし
• 再接続にはエクスポネンシャルバックオフ+ジッタを
– AWS でのエラーの再試⾏とエクスポネンシャルバックオフ
https://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html

開催風景

↓ 教えてもらいながら

↓コードはこんな感じで。

オートスケール設定

ーーーーーーーーー 終了 ーーーーーーーーー

開催してみて分かった事

・インフラとサーバーサイドの共通言語が出来た
- そもそもロードバランサーって?
- Infrastructure as Codeって何?
- サーバのスケールアウトって?
- サーバ構築のアンチパターン
などなど

・インターンも実際にサービスが動いているAWSに触れられて良い機会になった
サービスが動いているインフラ環境をインターンに触れさせる会社は少ないと思いますが、今回はインターンが実際にチャットシステムが動いているサーバをオートスケールさせていました。分からないことは後でまとめて聞いてもらうようにしていましたが、質問の数が多く学びの多い時間になったのではないかと思います。

・ALBなどの細かい仕様で普段気になってたことが聞けた
- ALBはCLBの上位互換のような位置づけだが、TCPモードなどCLBにしかない機能もある。
- ELBはRound-Robin, Least-Outstanding-Requestsなど複数のルーティングアルゴリズムを持つ
このような普段聞けないような細かい仕様を確認する事が出来ました。

まとめ

小規模なサービスを開発、運用する場合は恐らくAWSの知識も必要がなく、SaaSなどのサービスを利用すれば良いと思いますが、中規模〜大規模なサービスを開発する場合、インフラ環境の知識や今回行ったAWSのサービスの知識があることで技術の選択肢が増えます。技術の知識、特性を知ることで、運用時のリスクヘッジや品質向上が可能となります。また、勉強会を通してエンジニア内で共通言語化が図れる事で迅速な障害対応が可能となり、ミスコミュニケーションを減らす事で開発スピードを上げるという事が出来る為、ユーザ(エンドユーザ、社内カスタマー)への満足度を高めていけると思っています。

次回以降の予定

全くもってノープランですが、アプリケーション寄りのサービスの勉強会をやりたいなと思っております。

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.