💬
AWS Well-Architected Frameworkから学ぶエンジニアリングの知識
AWS Well-Architected Frameworkは、様々なアプリケーションやワークロード向けに対応したアーキテクチャを設計・運用するためのベストプラクティス集です。
公式ドキュメントはアプローチとそれに付随したAWSのサービスの利用についてメインに書かれています。
AWSに限らず、より汎用的な知識も身に着けるために有用だと思ったので、個人的に学びのあった記事や事例を集めています。(随時追加)
AWS Well-Architected Framework
運用上の優秀性
コードによるオペレーション(IaC)
- CloudFormationやTeraformを利用したデプロイの自動化
障害時の対応
-
収集したログ・メトリクスに対してフィルター及びアラームを実装
-
CloudWatchとかよりは最近は監視Saasが大体利用されている印象
変更の品質保証
- 問題が発生した時のロールバックや分割リリースなど、被害を軽減できるリリース方式を準備する
セキュリティ
- アイデンティティ管理とアクセス管理
利用者ごとのIAMユーザー作成
- ユーザごとのポリシーの設定、MFAの設定、操作の追跡を行う
IAMロール
- プログラムにIAMユーザーのアクセスキーを付与しないで、ロールを使用する(キーの流出を防ぐ)
最小権限の原則
リソースポリシー
- 利用するサービス側でもアクセス管理を行う
(CloudTrailの)ログ
- ログを参照して失敗の原因を探る
マルチアカウント
- 開発・ステージング・本番でアカウントを分ける
伝送中及び保管中のデータの暗号化
-
組織のルールや業界基準をもとにデータを分類し、機密性に併せて暗号化を行う。
全レイヤーでの多層防御
- 各レイヤーごとに対策を講じる必要がある。
インシデント対応
- インシデントが起きた場合に迅速に検知・対処し影響を最小化する必要がある。
信頼性
復旧手順のテスト
- 障害発生のシミュレーション
障害からの自動復旧
- 閾値を設けて負荷状況などが超過した場合にトリガーを設定し、問題が発生した場合にリソースの追加や交換を行う。
スケーラブルなシステム
まずは水平方向にスケールすることを考える (単一コンポーネントで障害が起こっても他のサービスでサービスが継続できる、セッションなどは持たずステートレスにする必要あり)
キャパシティ推測を不要に
-
一般的にWebサーバやアプリケーションサーバはスケールアウトが容易だが、DBサーバーはスケールアウトが難しい。
- 参照系と更新系を分離する
- 参照系はリードレプリカを利用し、スケールアウト可能
- 更新系はスケールアップし処理性能をあげる
バックアップと復元
- 定期的なバックアップをとり、エラー時に確実に復旧できるようにする。
RTOやRPO等のビジネス要件に基づき決定される。
パフォーマンス効率
- リソースの選択
コンピューティング
- インスタンスなど、過少でも過剰でもない適切なリソース種別を選定することが必要。
ストレージ
- インスタンス側とボリューム側のIOPSとスループットのうち、どこにボトルネックがあるかをメトリクスから取得s、適切なリソース種別とキャパシティ設定を見極める。
IOPS: 一秒あたりの入出力操作数で、ストレージデバイスが処理できる操作の量
スループット: 一秒あたりに処理できるデータの量で、ストレージデバイスが処理できるデータの量
レイテンシ: ストレージにアクセスするために必要な時間
データベース
- RDBMS、NoSQLの選択が第一。
- RDBMSは汎用的に利用可能だが、水平方向へのスケーリングは苦手。
ネットワーク
- インスタンスごとのネットワーク帯域の限界がある。
- CPUやメモリに余裕があるのにパフォーマンスが出ない場合は、インスタンスのネットワーク帯域の上限に達している可能性がある。
- インスタンスからブロックストレージ(EBS)へのアクセスはネットワーク経由のため、ストレージへのアクセスがボトルネックになる場合もある。
リソースの確認とモニタリング
- システム構築後も継続的なモニタリングが必要。
- モニタリング中に閾値を超えた場合は適切な対応が必要
- 例)RDSのパフォーマンスを高めたい→キャッシュを挟む
- 例)RDS Proxyを利用してDBコネクションをプールして共用する
トレードオフの判断
- パフォーマンスの向上は整合性、耐久性、レイテンシーの余裕と引き換えに実現されるケースがある。→キャッシュの利用(DB:Redis,コンテンツ:CDN)
コスト最適化
需給の一致
- ピーク時に備えてあらかじめ大量のリソースを用意しない
インスタンスの購入方法によるコスト削減
- リザーブドインスタンスや、スポットインスタンスの活用
アーカイブストレージの活用
- 低頻度アクセスクラスのストレージに変更する
コストの把握
- 月次の請求以外にも常時で現在の利用額を確認する
サステナビリティ
- 影響を把握する
パフォーマンス指標を確立し、改善を評価する。
サステナビリティ目標の設定
- ROIを意識したエンジニアリング
使用率の最大化
より効率的な新しいハードウェアとソフトウェアの提供を予測して採用する
Discussion