円安の今だから読みたいAWS Well-Architected コスト最適化の柱

# 概要

* **今日の日本(2022/6/18時点)において、えげつない円安を更新し続けています。**
* その影響により日本ではAWSをはじめとするドルベース料金のクラウドサービスのコストが増大しているとよく耳にします。
* そんな情勢の中なので、クラウドサービスのコスト削減は必須と言えるのではなかろうか。
* 今回は、awsにおけるコスト削減をする際にぜひ読んでいただきたいベストプラクティス**AWS Well-Architectedのコスト最適化の柱**についてサマライズしていこうと思います。

![円安.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/757866a5-600d-4f15-fc01-2b3d25195ba9.png)

# AWS Well-Architected コスト最適化の柱

* AWS Well-Architectedとは、クラウド上でワークロードを設計および実行するための設計原則、アーキテクチャのベストプラクティスについてまとめたものです。

* また、AWS Well-Architectedは6つの柱から構成されており、それぞれの柱ごとにカテゴリが分かれ、カテゴリごとのベストプラクティスが詳細に書かれています。
* 今回のテーマとしては、その柱の中の**コスト最適化の柱**について着目していきたいと思います。

## コスト最適化の柱

* コスト最適化の柱で扱うトピックは以下のものです。それぞれのトピックごとにサマライズしていきながら独自の観点も踏まえつつ話を進めていきたいと思います。(そのため、ちゃんと理解したい場合は、元の資料をお読みください。)
* **重要な点としてコスト最適化にはトレードオフがあります。** 
* たとえば**市場投入に要する期間**と**コスト**のようにコストを犠牲にしなければならないケースもあるので、そこは注意が必要です。

> **・クラウド財務管理を実践する**
 **・経費支出と使用量の認識**
 **・コスト効率を考慮しながらリソースを利用する**
 **・需要を管理しリソースを供給する**
 **・継続的最適化**

![会計士.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/525c0633-ea39-486c-4a0c-918e242d9d86.png)


### クラウド財務管理を実践する

* 総じて述べられているのが、**コストを意識する文化**です。
* そのために、ある個人でもいいし、チームでもいいので**コスト最適化を目指す担当者**を決めます。
* 重要なのは**コストを最適化する活動だけ**ではなく、**運用する時間も確保する必要**があります。
* また、この担当者が動きやすいよう(社内政治で殺されないよう)サポートできる、ある程度発言力とポジションの高い人(決定権のある人)を見つけましょう。

---

* 会社によっては、財務と直接バトルような会社もあるし、ないかもしれません。
* 財務とバトらなければならない場合は、**財務部門とテクノロジー部門のステークホルダー同士のパートナーシップを確立**が重要です。
* このパートナーシップを確立するのに重要なのが以下のようなものです。

> ・コストと使用量をほぼリアルタイムで把握できること
・予想外のクラウドへの支出に対応するための標準となる運用手順を確立できていること
・awsにおける割引が効くようなもの(リザーブドインスタンスやAWSSavings Plansなど)への理解とちゃんと割引ためにどうすべきかを戦略できること
・将来的なAWSのコストと使用量を予測し、組織の予算を調整および構築できること
・よくDDDで言われるが、両部門がお互いに分かる言葉(ユビキタス言語)を使用して、財務の概念への共通理解ができていること

上記の内容を満たすことがかなり重要です。
そのためのAWSのサービスもあるくらいです。

## 上記を満たすためのAWSの各サービス

* 例えば、[AWS Cost Explorer](https://docs.aws.amazon.com/cost-management/latest/userguide/ce-forecast.html)を使用すると、過去のコストをもとに機械学習アルゴリズムに基づいて、日次(最大3か月)または月次(最大12か月)のクラウドコストを予測できます。
* あとは**AWS Budgets Reports**を使用することで、設定された予算に対するコストと使用量の状況を追跡することができます。
* **AWS Budgets**には他にもコストと使用量に関する通知を実装して、コストと使用量の変化をすばやくターゲットに通知することもできます。
* [Amazon QuickSight](https://aws.amazon.com/jp/quicksight/)を使用することで、コストと使用状況レポート(CUR)データとともに、より詳細なデータによる高度にカスタマイズされたレポートを提供することもできます。

![スクリーンショット 2022-06-18 22.31.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/9b318c27-65d7-3fc6-3897-4be8f98323ae.png)

[引用元画像: aws-cost-explorer](https://aws.amazon.com/jp/aws-cost-management/aws-cost-explorer/)


**これらのサービスを利用することで、組織/チーム/個人レベルでコストに対する意識を持たせることもできます。**

* あとは、コストを意識する文化を作っていく、例えば、**自発的または独断で行なったコスト最適化の成果を公開または非公開で評価して、間違いから学び、今後繰り返さないようするといった取り組み**をすることも重要です。

---

* **最後に重要なのが、コスト最適化によってどれだけ金額が削減されたのかを数値化し広めることです。**
=> 数値化により、コスト最適化が必要な投資であるよを各ステークホルダーに説明できます。
さらに、将来のコスト最適化への投資に関してステークホルダーからより多くの賛同を得ることもできます。

* 数値化としては、たとえば、Savings Plansの購入時にオンデマンドEC2インスタンスのコスト削減を数値化できるし、アイドル状態のEC2インスタンスが終了した際、またはアタッチされていないEBSボリュームが削除された際に、AWSへの支出のコスト削減を数値化できます。

## 経費支出と使用量の認識 / 需要を管理しリソースを供給する

* ここでは、組織レベルでのaws使用量の追跡方法が論じられています。
* awsを利用している組織では、一般的に複数のワークロードがあり、それらを複数のチームによってオペレーションされていると思います。
* 各チームはさまざまな組織単位に属する可能性があり、それぞれに独自の収益の流れもあります。

**このトピックについては、SAAやSAPでよく問題に出される内容ですね。**

例えば、AWSアカウントを組織内のチームごとに保持し、その管理をどうしようとかです。

=> **AWSにおけるベストプラクティスは、組織の規模や使用量にかかわらず、1つのメンバーアカウントを持つマスターを少なくとも常に1つ持つことです。**

* なので、AWSは1つの親アカウントと複数の子アカウントからなる構造を持つようにし、すべてのワークロードリソースが存在するのは、メンバーアカウント内のみとするようにします。

* あとは、これを管理する方法ですが、[AWS Organizations](https://aws.amazon.com/jp/organizations/)を使用しましょう。**AWS Organizations**の**一括請求**により、1つ以上のメンバーアカウントとマスターアカウントとの間に構造が作成されます。

* また、メンバーアカウントを使用すると、コストと使用量をグループ別に区別できます。

* **一括請求機能**を使用すると、複数のメンバーのAWSアカウントの支払いを単一のマスターアカウントにまとめつつ、各メンバアカウントのアクティビティの可視性も維持できます。コストと使用量がマスターアカウントに集計されると、サービスのボリューム割引とコミットメント割引(**Savings Plans**と**リザーブドインスタンス**)を最大限に活用し、割引額を最大化することができます。

**いや、この設定わかるけど大変だよぉ**
=> 安心してください。この設定を簡単にするサービスもあります。

* [AWS Control Tower](https://aws.amazon.com/jp/controltower/?control-blogs.sort-by=item.additionalFields.createdDate&control-blogs.sort-order=desc)では、複数のAWSアカウントのセットアップと構成をすばやく行い、ガバナンスが組織の要件に適合していることを確認できるのです。！

* 最後に、上記の構成を作れたらワークロードに不必要なリソースを作る輩を排除することも必要ですw

**何を使うか**

=> **AWS Identity and Access Management(IAM)**、および**AWS Organizations サービスコントロールポリシー(SCP)** を使用してポリシーを適用します。

* IAMを使用することで、AWSのリソースを作成および管理できるユーザー、作成できるリソースのタイプ、リソースを作成できる場所を制御することができます。

**これにより、不必要なリソースを作る輩を排除すること(正確には制御する)ができます**

---

**リソースのタグ付け** この機能による恩得は大きいです。
=> [タグ付け](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html)をすることで、それぞれのリソースに組織の情報を含ませることができます。

* タグ付けにより組織情報を含ませ(組織を表すタグを適用する)、コストを分類、追跡させることでワークロードやワークロードの環境(開発環境/本番環境)を識別して、組織全体のコストと使用量を確認することができます。

---

* 最後に不要になったワークロードのリソース廃止、削除をするです。
**やはりコストを抑えるのに一番効くのがリソースの削除なので、きちんとやりましょう**

もちろん全く使用していないリソースはそれでいいのですが、**自動的にリソースを削除するライフサイクルを作るというのも重要です。**

=> **どういうことかというと例えば、ワークロードの中でスケーリングさせる必要があり、不必要な時に余分な資源が残りそれがコスト圧迫しているといったこともあるので、その場合には、[AWS Auto Scaling](https://aws.amazon.com/jp/autoscaling/)を使用して適切な閾値をもとにスケーリングするよう設定しましょう。**

* Auto Scalingはマジで便利なサービスで、これを利用することでキャパシティーを調整し、安定した予測可能なパフォーマンスを可能な限り低いコストで維持することができます。無料(**EC2インスタンス**、**スポットフリート**、**Amazon ECS**、**Amazon DynamoDB**、**Amazon Aurora**と統合されたフルマネージド型サービス)。

* また、**Amazon CloudWatch**のメトリクスとアラームを使用して、ワークロードのスケーリングイベントをトリガーできます。

=> よく使用される一般的なメトリクスは、**CPU使用率**、**ネットワークスループット**、**ELBで確認されたリクエストとレスポンスのレイテンシなどの標準のEC2のメトリクス**を使用します。

## 費用対効果の高いリソース

* このトピックでは、ワークロードにおけるリソースの選択と評価をちゃんと考え、実施することを言っています。

**どういうことか。**

* 例えば、時間の経過とともにワークロードは変化する可能性があると思うのですが、その時ワークロードのアーキテクチャやリソースの使用方法が変化すると、適切だったサービスの組み合わせが最適ではなくなってしまうことがあるということです。

なので、**AWS Cost Explorer**および**CUR**では、PoCで使用した環境や実行中の環境のコストを分析したり、**AWS簡易見積りツール**や**AWS Pricing Calculator**を使用して、ワークロードのコストを見積もることを推奨しています。

**あとは、マネージドサービスを利用することを検討する。マネージドサービスを使えば、サービス維持に伴う運用上および管理上の負担が軽減されるためコストの軽減に繋がります。**

---

* **正しいリソースタイプ、リソースサイズ、リソース数を選択する**ことも大切です
* 最低限のリソースコストで技術要件を満たすには、この選択が重要なのですが、じゃあ選択するための基準はどうすれば確認すればよいのでしょうか？


* その基準を確認するのに使用できるのが[AWS Compute Optimizer](https://aws.amazon.com/jp/compute-optimizer/)です。
* **AWS Compute Optimizer**は、使用履歴に基づきコンピューティングリソースの正しいサイズ設定に関するレコメンデーションを提供してくれます。

![スクリーンショット 2022-06-18 22.36.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/6a47eb5c-a935-5912-ca44-80dfcbb7bce2.png)

[引用元画像: AWS Compute Optimizer](https://aws.amazon.com/jp/compute-optimizer/getting-started/)

---

* あとは、ネットワーキングリソースを効率的に使用するためには、例えばCDNのサービスである[Amazon CloudFront](https://aws.amazon.com/jp/cloudfront/) を利用するという手もあります。

## 継続的最適化

* **このトピックで一番重要なのは、AWSで新しいサービスと機能がリリースされた際は、既存のアーキテクチャを確認し、費用対効果を維持し、要件の変化に応じて不要になったリソース、コンポーネント、ワークロードを積極的に排除することです。**

## まとめ

* コストの最適化と運用は、継続的な取り組みだと言っています。財務部と開発者でちゃんと協力し合い、アーキテクチャのアプローチをレビュー、AWSサービスの選択(知識のアップデート)していくことで実現できます。

# 参考

https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/cost-optimization-pillar/welcome.html