【AWS】 Well-Architectedについてのメモ
こんにちは。新卒3年以内に退職して世間的には白い目で見られているだろう駆け出しエンジニアです。
先日退職しまして、来週から新しい職場で働くのですが(どこいった有給)、正直勉強不足すぎて不安で一杯です。
不安はありますが、今年は1週間に1回はアウトプットを出すことが目標ですので今週もやります
すでに他の方が既出の`AWS`の記事ばっかりですが、車輪の再開開発という言葉に動じません。
メンタルだけが取り柄です。
まだまだ、次の業務で必要なスキルは身についていないですが、今年はGo言語
も勉強していきたいです。
この記事で書くこと
- AWSの
Well-Architeted Framework
について、Udemyと原文から学んだことを書きます。 学んだことを踏まえて、前回の記事で作成した構成をまともな構成にしていきたいと思います。
- マルチAZ構成
- RDSの利用
Terraform
の実装は次の記事に回しています。
文字が多くなってしまうので先にまとめ
Well-Architectedフレームワーク
は大局的な設計、運用のベストプラクティス集- 絶対に従わないといけないというものではない。自分たちのシステムにどこが適用できるか。何が足りていないかを把握するための指標
継続的に
Well-Architectedフレームワーク
に沿ったレビューを行い、適切なサービス選択とコスト最適化が必要になってくる
Well-Architectedフレームワークとは
原文はAWSの公式ページを参照してください 。
- 平たくいうと、AWSでインフラを構築するときは
これは意識して設計しないとね
という設計や運用に関するベストプラクティス集 5つの柱
で構成されていて、それぞれはトレードオフの関係となっている- 今勉強しているAWSアソシエイトの試験範囲もこのフレームワークが試験の範囲となっている
5つの柱
あくまで個人の解釈です
名前 | 説明(すごいざっくりとしたイメージ) |
---|---|
運用上の優秀性 | 構成変更や予期せぬイベント(障害)発生時に対してもなるべく自動化 とか社内でレビューされた手順 を考えていきましょうよ |
セキュリティ | 言葉の通り。アクセス追跡やアクションの追跡など全てのレイヤーでセキュリティ保護できるようにしましょうよ |
信頼性 | 障害による、中断・停止と障害復旧による影響を軽減するインフラ構成。なるべく早く復旧できるアーキテクチャにしましょうよ |
パフォーマンス効率 | せっかくクラウド利用するんだから、要求されるリソースを満たす最小限のものを利用しましょうよ |
コスト最適化 | 無駄にコストを払わず、最小限のコストでサービスを提供しましょうよ |
どんな時に使えるのよ??
そもそもWell-Architectedフレームワーク
はプロであるAmazon Web Serviceのエンジニアたちの長年の経験から得たベストプラクティスです。
フレームワークを活用することで、プロたちのノウハウを既存環境のレビュー
や新規システムの設計へのインプット
に活用することができるとされています。
要件定義~運用まで全てに利用する必要があり、改善を続けることがWell-Architectedフレームワーク
の根本ではないかとど素人ながら思います。
つまり、継続的なレビュー&改善(PDCA?)が必要になってくるのはないでしょうか。
先ほど説明した5つの柱
についてざっくりと説明していきます。
運用上の優秀性(Operational Excellence)
AWSの公式(日本語版)では下記のように説明されております。
運⽤上の優秀性の柱には、ビジネス価値を提供し、サポートのプロセスと⼿順を継続的に向上させるためにシステムを稼働およびモニタリングする能⼒ が含まれます。
設計原則は6つあります。
- 運用のコード化
IaC
使っていこうぜ!!
- ドキュメントへの注釈
IaC
で作詞したコードに注釈とか、リソースに対してタグをつけよう!!
- 高頻度で小規模は可逆的変更
- 定期的に改善していこう!!
- 結構無茶だろと思ったけど、
IaC
利用してコードのバージョン管理ができていれば実現可能なのではないでしょうか。
- 結構無茶だろと思ったけど、
- 定期的に改善していこう!!
- 障害の予測
- 障害を自分たちで気づけるようにモニタリングをしましょうよ!!
- 運用手順の頻繁な更新
- 運用上の失敗の改善
- 何か起きた時に対処できる運用手順はみんなでレビューして都度改善していこうよ!!
- 一番難しいのでは。属人化の排除ってすごい難しいですよね。。
- 何か起きた時に対処できる運用手順はみんなでレビューして都度改善していこうよ!!
運用上の優秀性
では3つのベストプラクティスの分野から成り立っています。
- 準備
Cloud Formation
とか使って、開発環境~本番環境まで自動的に構築できようにしていくCloud Watch
を使って、モニタリングできるようにしていく
運用
Cloud Watch
とか使って、改善の指標となる値をモニタリングする- レビューされた
ランブック(運用手順書)
とプレイブック(障害対応手順書)
を準備する
進化
運用フェーズ
で得られた指標から、継続的な改善を検討/実施していく- 障害発生から復旧までの時間とか
ランブック
とプレイブック
の再レビューを実施する
セキュリティ
AWS上に構築したシステムのリスク評価(何がリスクか?どれだけの影響を与えるか?)とリスク軽減(リスクが発生する可能性・影響を小さくする)という観点です。
設計原則は7つです。
強力な認証基盤の実装
- 最小権限で、各リソース同士の通信には認証をかけましょう
トレーサビリティの実現
- ログ監視/保管して、モニタリングできるようにしましょう
全レイヤーへのセキュリティの適用
- オンプレと同様に多層防御が必要ですよ
セキュリティの自動化
- アクセスコントロールとかをIaCとかでテンプレート化して、改善できるようにしていきましょう
データ保護
- データには暗号化をかけようね
データに人の手を入れない
- 保管されているデータに対して、人が手動で直接アクセスしたり編集したりする必要性を無くす
セキュリティイベントへの備え
ベストプラクティスは5つの分野です。
オンプレと同様に、権限管理
・アクセス管理
・ログ監視
・多層防御
・データ保護(暗号化)
・IR
を考える必要があります。
アイデンティティ管理とアクセス管理
IAM
を利用して、AWSリソースにアクセスできるユーザおよびリソースを制限する- 権限はフルオープンにせず、アクセスが必要なリソースだけに
Principal
を使って最小限にする
- 権限はフルオープンにせず、アクセスが必要なリソースだけに
発見的統制
- セキュリティインシデントが発生した際に、すぐに検知・状況把握ができる構成が必要になる
Cloud Trailログ
でAWSリソースに対して実行された操作を記録するCloud Watch
でAWSリソース自体のログを記録・可視化するAmazon GuardDuty
(脅威検出サービス)を利用して、悪意のある動作や不正な操作を検知できる仕組みを作る
インフラストラクチャ保護
- 多層防御の考え方を適用する
- パブリックとプライベートの分離
- WAFやIDS(マーケットプレイスでIDSがあるようです)の導入
データ保護
- データ暗号化(S3やRDSなど)をして、素のデータが開示されるリスクを減らす
KMS
を利用して、暗号鍵の管理や定期的なロテートを実施するS3
にデータを保管して、データがなくなってしまうことを防ぐ
インシデント対応
- セキュリティインシデントに備えて、ファイルに対するアクセスや変更に対するログを記録する
- インシデント訓練を実施して、インスタンスの隔離や自動化ができるか検証する
CloudWatch
をトリガーとして、Lambda
を動作させるなど
信頼性
障害発生時に、中断・停止と障害復旧による影響を軽減するという観点です。
また、障害発生時にすぐに復旧できるかということも重要です。
可用性を高くすることは大事なのですが、何かあった時に適切に復旧できるかという考え方が必要なんですね。
設計原則は5つです。
- 復旧手順をテストする
- クラウド環境なんだから、本番環境と同じ構成を複製して、障害を発生させてテストしよう
- 障害から自動的に復旧する
- システムのKPIをモニタリングして、しきい値を超えた時にシステム側で自動的にアクションを起こせるようにしよう
- 水平方向へのスケール
- 垂直方向(リソース拡張)ではなくて、複数の小規模リソースを配置して単一障害点を無くしましょう
- キャパシティーを予測しない
- 需要(Webシステムで言えばアクセス)に対して、適切なスケーリングができるようにしましょう
- オートメーションで変更を管理する
- IaCを使ってインフラ構成に発生した変更を管理できるようにしよう
ベストプラクティスは3つの分野に別れています。
基盤
- オンプレで考慮点となる
NW帯域
やコンピューティング性能(物理レベルの性能)
はAWS側の責任範囲 - リソースに必要なストレージのサイズやリソースのサイズ(割り当てるCPUやメモリ)を適切に選択する
- オンプレで考慮点となる
変更管理
- 需要の変化に応じて、リソースが自動的に追加や削除される対応ができているか
- ログとリソースのモニタリングを実施して、KPIの設定やしきい値を超えた時のアクションを自動化する
- 変更管理をログとして記録する
障害の管理
- 障害を検出して、自動的に復旧できているか
Cloud Watch
- バックアップデータの保存先に耐久性の高い
S3
を利用する
- 障害を検出して、自動的に復旧できているか
パフォーマンス効率
システム要件を満たすためのコンピューティングリソースを効率化するという観点です。
AWSサービスの進化(新サービス)を柔軟に取り入れて、インフラの効率化が必要とのことです。
5つの設計原則があります。
- 最新テクノロジーの標準化
- 最新技術を簡単に取り入れるように
AWS側
が頑張るから、積極的に取り入れてみてよ
- 最新技術を簡単に取り入れるように
- 数分でグローバルに展開
- 世界中にリージョンがあるから、システムを複数のリージョンに置けるよ
- サーバレスアーキテクチャを利用
- 自分たちでサーバリソースをなるべく持たない構成にしようよ
- より頻繁に実験可能
- 簡単にリソースを作ったり、消したりできるから比較テストを実施しよう
- システムを深く理解
NoSQL
とかストレージを使ってもいいけど、根本的な技術の理解は必要よ
そして4つのベストプラクティス
選択
- 1つの
AWSサービス
ではなく複数のAWSサービス
を利用する - 検討すべきリソースタイプは4つ
- コンピューティング
- EC2のリソースタイプ
- Lambda
- コンテナの利用
- ストレージ
- アクセス方式や参照/更新頻度から選択する
- EBS
- S3
- Glacier
- EFS
- データベース
- システムに対して適切なデータベースを選択する
- RDS
- Aurora
- DynamoDB
- Elastic Service
- コンピューティング
- 1つの
レビュー
AWS
の新機能を取りれているか
モニタリング
- パフォーマンスをモニタリングできるようにする
SQS
やLambda
を通じて、自動的にアクションを起こせるようにする
-
- どの部分を重視するのか
整合性
か耐久性
かレイテンシー
か容量
か- インメモリキャッシュ
ElastiCache
やCDNCloudFront
の利用を検討する
コスト最適化
不必要なリソースを削減したり、適切な料金選択を行って、需要対して最適なコストでサービスを続けましょうという観点
5つの設計原則があります。
消費モデルを導入する
- ビジネス要件に応じて使用するリソースの量を削減する
- 例えば、会社の稼働日だけテスト環境と開発環境を構築して休日中には、リソースを削除する
- ビジネス要件に応じて使用するリソースの量を削減する
全体的な効率を測定する
- ビジネスから得た利益とコストの差異を検証する
- ROIを得れていないリソースの継続検討
DC運用のための費用を排除する
- クラウドシフトしていって、DCの固定コストを排除していく
費用を分析し、帰結させる
- システムの利用状況とコストを分析して
ROI
を透明化する
- システムの利用状況とコストを分析して
マネージドサービスの利用を検討する
4つのベストプラクティスの分野があります。
費用認識
AWS Cost Explorer
やAWS Budgets
を利用して、各リソースの利用状況とコストをモニタリングする
費用対効果の高いリソース
Trusted Advisor
を利用して、支払い過ぎているリソースがないか定期的にレビューする
需要と供給を一致させる
Auto Scalling
を利用して、需要(アクセス)に対して、リソースを増加したり削除したりする
長期的な最適化
最後に
自分の忘備録的に書いているものなので、長々と書いているメモになってしまいました。
(資料の座学だったのでとてもしんどかった)
解釈が誤っている部分もあるかと思いますが、そこは悪しからず。
次回は前回作成したリソースを、改善していきたいと思います。