はじめに
この記事ではAWSにおけるいわゆるベストプラクティスに沿った構成について自分なりの考えをまとめてみようというものです。
インフラ経験がほぼない状態でインフラエンジニアを始めた身として、まずはじめにどのような構成が"良い"とされているのかを学ぶのが良いと考えて色々構成図と睨めっこをしていました。
そこで自分が得たことに関して軽くこの記事でまとめたいと思います。
アプリケーションの構成
今回はよくあるwebアプリケーションサービスの構成を作るイメージで構成図を作成しました。
構成の内訳
ざっくりどのようなリソースがあるかを説明していきます。
ここでは各サービスの細かい説明はせず、何がこの構成に存在しているかとどんな役割を担うかを書いていきます。
-
route53
- DNSサービスとしてドメイン名の名前解決をします
- また、トラフィックのルーティング制御も担うため、internetからの接続は最初にroute53を経由して適切なサービスへとルーティングされていきます
-
CloudFront
- CloudFrontは静的コンテンツの配信を行うものです
- s3 bucketに静的ファイルを格納し、それを元に配信を行います
-
Internet Gateway
- VPC内のPrivate IPアドレスとPublic IPアドレスの変換を実行します
- これを置くことにより、VPC内のリソースとインターネットの通信が可能になります
-
Application Load Balancer
- アプリケーション層の通信制御を行います
- ヘルスチェックをクリアしたEC2にトラフィックを分散します
-
Nat gateway
- プライベートサブネットからの外向き通信を可能にします
- 外部APIやアップデート時に使用されます
-
Availability Zone
- aws内でのインフラ設備の単位のこと
-
Public Subnet
- インターネットゲートウェイ経由で外部通信が可能なVPC内のネットワークです
-
Private Subnet
- 直接の外部通信が不可能であるVPC内のネットワークです
- アプリケーション層とデータベース層で別々のsubnetを置くことでデータベース層を完全に隔離することができます
この構成がベストプラクティスに沿っているかを考えてみる
どうしたらこれがベストプラクティスと言えるのか、それはもちろんサービスごとに異なるのでどのようなパターンでもこれが正解!というものはないと思っています。
ただ、どのような点を抑えればベストプラクティスに近づくのかという指標はあると思っています。それはAWS Well-Architectedフレームワークの5つの柱というものです。
AWS Well-Architectedフレームワークの5つの柱とは運用上の優秀性、セキュリティ、信頼性、パフォーマンス効率、コスト最適化の五つの要素のことであり、これに沿った設計をしているものがいわゆるベストプラクティスに近い構成なのではないかなと自分は考えています。
それでは、上記の構成におけるそれぞれの項目について考えていきます。
運用上の優秀性
この構成ではインフラストラクチャをコードとして管理しやすい設計になっています。
各コンポーネントが明確に分離され、責務が明確なため、運用面での優位性が高いと言えます。
例えば以下の点がこの柱に当てはまる構成のポイントと言えます。
- マルチAZ構成により計画的なメンテナンスができること
- ALBによるヘルスチェックで異常検知が自動化されること
- public, privateサブネットにリソースを分離することによりアクセス制御が用意であること
信頼性
信頼性ではサービス運営における要素のうち単一障害点を排除することが大切になると思います。
今回の構成の場合以下のような点がこの柱に当てはまる構成と言えます。
- 複数AZにまたがるリソース配置による冗長化
- ALBによる負荷分散
- RDSのマルチAZ構成による自動フェイルオーバーの実現
- CloudFrontによるコンテンツ配信の安定化
セキュリティ
セキュリティの大事な考えである多層防御にどれくらい基づくかが構成を考える鍵になると思います。
今回行ったセキュリティ対策としては以下の点が挙げられます。
- サブネットの三層構造による境界防御
- 認証認可の一元管理が可能な設計
パフォーマンス効率
リソースをいかに効率的に利用し要求されるパフォーマンスを実現できるかがここのポイントになります。
パフォーマンスを支える要素として今回取り込まれたのは以下です。
- CloudFrontによるコンテンツのキャッシュと高速配信
- ALBによる負荷分散
- データベース層を分離
- リージョン間のレイテンシー最適化が可能な構成
コスト最適化
コスト設計は正直プロダクトによると思っていて今回の構成が必ずしも最適かと言われると一番自信がありません。
が、だいたいポイントは以下の点かなと思っているのでそれを示しておきます。
- マルチAZの過剰ではない冗長化
- NAT Gateway共有
- CloudFrontによるオリジンサーバーの負荷軽減
- 開発環境との分離が容易な構成
この構成に拡張を加えるとすると?
この構成はあくまで基本構成であるので、実際はここを土台に色々生やしていくではないかないかなと思います。
そのアイデアをここに羅列してこの記事を締めたいと思います。
-
セキュリティを強化したい場合
- WAF
- AWS Shield
- GuardDuty
- AWS System Manager Session Managerによる踏み台サーバー
-
可視性の向上
- CloudWatch
- AWS X-ray
- CloudTrail
-
パフォーマンス向上
- ElastiCacheでDBのキャッシュを行う
- RDS リードレプリカ
- AutoScalingの導入
(追記)
最新だと6つの柱でしたね…
https://docs.aws.amazon.com/ja_jp/wellarchitected/2022-03-31/framework/the-pillars-of-the-framework.html
昔の5つの柱がなくなるわけではないと思うので、皆さんはサステナビリティについても考慮に入れた構成を考えてみてくださいmm