dipでインフラコスト最適化を行なっている大熊です!今回はAWS Cost Optimization HubのTipsを紹介します!
はじめに
AWS Cost Optimization Hub(以下和訳、コスト最適化ハブ)は、AWS Compute Optimizerなどの各サービスで個別に提示されていた推奨事項を集約し、「最も効果的な削減案」を提示する機能です。
まだ触ったことのない方は下記の記事がわかりやすいです。
https://qiita.com/shimazushi/items/48a847cd99c6d69e365d
コスト最適化ハブはコンソールでも見やすく、リソースIDなどで検索もできるため便利なのですが、「最も効果的な削減案」を提示するため重複削除をしてしまうという欠点があります。
この「重複排除」の仕様は、全体の削減見込み額を正確に算出する上では有用であるものの、個別のリソースに対する最適化アクションを選定するフェーズにおいては、選択肢を狭める要因となる場合があります。
(Copute Optimizer では複数選択肢を見られるのですが、色々な推奨事項を一括で取得したい場合はコスト最適化ハブでできると嬉しいです。)
本記事では、コスト最適化ハブの仕様上の特性と課題を整理し、AWS CLIを用いてすべての推奨項目をCSV形式で抽出し、外部ツールで管理・分析するための手法を紹介します。
AWS Cost Optimization Hub のデフォルト仕様と課題
コスト最適化ハブはデフォルトで、同一リソースIDに対して複数の推奨事項が存在する場合、「推定削減額」が最も大きい項目のみを表示・計算対象とします。
これはアカウント全体の削減額を過大評価しないための正しい仕様ですが、実運用においては以下のような課題が生じます。
課題:難易度が低くコスパのいい選択肢が隠蔽される
典型的な例として、あるEC2インスタンスに対して以下の2つの推奨事項が存在するケースを想定します。
- Graviton インスタンスへの移行(削減額:大 / 対応工数:高)
- 同世代ファミリー内でのサイズダウン(削減額:中 / 対応工数:低)
コスト最適化ハブのコンソール上では、削減額の大きい「1. Graviton移行」のみが表示されます。
しかし、Graviton移行はアーキテクチャの変更や十分な動作検証を伴うため、即座に対応できないケースが多々あります。この際、本来であれば即時対応が可能な「2. サイズダウン」という選択肢が存在するにも関わらず、それが提示されないため、「今は対応できない」という判断に至り、コスト削減機会そのものを損失するリスクがあります。
解決策:--include-all-recommendations オプションの活用
AWS CLIの list-recommendations コマンドには、この課題を解決するためのオプション --include-all-recommendations が用意されています。
AWS CLI Command Reference: list-recommendations
--include-all-recommendations|--no-include-all-recommendations(boolean)
List of all recommendations for a resource, or a single recommendation if de-duped by resource ID.
このオプションを有効にすることで、コスト最適化ハブが集約の過程で非表示とした推奨事項も含め、すべてのデータを取得することが可能になります。
実装:全推奨事項をCSV出力するシェルスクリプト
AWS CLIを使用し、ページネーション(NextToken)を処理しながら全件を取得し、CSV形式に変換するスクリプトを作成しました。
前提条件
- AWS CLI v2 がインストールおよび構成済みであること
-
jqコマンドがインストールされていること
スクリプト (export_coh_full_data.sh)
#!/bin/bash
# 出力ファイル名の設定
OUTPUT_FILE="${OUTPUT_FILE:-cost_optimization_recommendations.csv}"
echo "AccountId,Region,ResourceId,ResourceType,ActionType,ImplementationEffort,EstimatedMonthlySavings,SavingsPercentage,RecommendationLookbackPeriod,RecommendedResource" > "$OUTPUT_FILE"
echo "Starting export of all recommendations from Cost Optimization Hub..."
# 変数初期化
NEXT_TOKEN=""
PAGE_COUNT=0
while : ; do
if [ -z "$NEXT_TOKEN" ]; then
# 初回リクエスト
JSON_OUTPUT=$(aws cost-optimization-hub list-recommendations \
--region us-east-1 \
--include-all-recommendations \
--output json)
else
# 2回目以降のリクエスト(NextToken利用)
JSON_OUTPUT=$(aws cost-optimization-hub list-recommendations \
--region us-east-1 \
--include-all-recommendations \
--next-token "$NEXT_TOKEN" \
--output json)
fi
# jqを用いてJSONから必要なフィールドを抽出し、CSV形式で追記
echo "$JSON_OUTPUT" | jq -r '.items[] | [
.accountId,
.region,
.resourceId,
.resourceType,
.actionType,
.implementationEffort,
.estimatedMonthlySavings,
.estimatedSavingsPercentage,
.recommendationLookbackPeriodInDays,
(.recommendedResourceSummary | tostring)
] | @csv' >> "$OUTPUT_FILE"
# NextTokenの抽出
NEXT_TOKEN=$(echo "$JSON_OUTPUT" | jq -r '.nextToken // empty')
# 進捗表示
((PAGE_COUNT++))
echo "Processed page: $PAGE_COUNT"
# NextTokenが存在しない場合はループを終了
if [ -z "$NEXT_TOKEN" ]; then
break
fi
done
echo "Export completed. File saved as: $OUTPUT_FILE"
出力結果
AccountId,Region,ResourceId,ResourceType,ActionType,ImplementationEffort,EstimatedMonthlySavings,SavingsPercentage,RecommendationLookbackPeriod,RecommendedResource
"123456789101","ap-northeast-1","i-a1b2c3d4e5",,"MigrateToGraviton","VeryHigh",50,29.0,93,"t4g.micro"
"123456789101","ap-northeast-1","i-a1b2c3d4e5",,"Rightsize","High",40,11.0,93,"t3.micro"
まとめ
こういった方法で全ての推奨事項を取得することができます。
CSVとして出力した推奨事項は、Excel や Google スプレッドシートに取り込むことで一覧性高く確認できます。
また、コスト最適化ハブのコンソールでは提供されていない 対応ステータス(未対応/検討中/対応済み など)の管理 や、担当者・対応期限の付与も可能になるため、コスト最適化を「見るだけ」で終わらせず、実行フェーズまで落とし込みやすくなります。
コスト最適化ハブはその特性を理解することで非常に有用なサービスになると思うので、これからも有効活用していきたいです!