こんにちは、SRE の平です。
AWS でのコストの可視化、やったところで売り上げは伸びないし、フロント・バックエンドエンジニアもコストを意識して開発されているので(ありがとう素晴らしき仲間たち!!!)、なかなか無駄遣いも無く無駄骨になることが往々にしてありませんか? でも Amazon Managed Service for Grafana ならAWSアカウントを超えた会社全体のコストを簡単に可視化できるのでやってみました。
Amazon Managed Service for Grafana (以下AMG)とは
Grafanaのマネージドサービスです。2021年8月10日時点でまだ Preview とのことでリージョンも us-east-1 または eu-west-1 しか選べなかったり、まだ仕様変更があるかもしれませんので 公式のドキュメント をたまに巡回することをおススメしますが、今回のコストの可視化にはなんら問題ありません。
なお AMG の利用には AWS Single Sign-On (以下 SSO ) が必須ですが、今回は AMG が目的なので、後述する設定は IAM ユーザーでサインインしたマネジメントコンソールにて行い、 SSO 経由でサインインするマネジメントコンソールの利用方法については記述しておりません。
AMG 利用までの事前作業
以下の順で用意をしていきます。
- AWS Organizations の有効化
- 管理アカウントで SSO の有効化
- 管理アカウントの SSO にてグループ・ユーザーの作成
- 管理アカウントで AMG のワークスペース等の作成
- SSO にサインインして AMG のデータソース・AWSアカウントの選択
1. および 2. Organizations および SSO の有効化
Organizations を有効化し、管理アカウントの東京リージョンを選択してから『AWS SSO を有効にする』を押し、 SSO を有効にしました。ID ソースは AWS SSO にしました。
3. 管理アカウントの SSO にてグループ・ユーザーの作成
AWSブログ『 Amazon Managed Service for Grafana を始めよう』と 公式ドキュメント を見ながら作成すると理解が早かったです。色々な方法があると思いますが、僕は SSO で閲覧用グループと、編集・閲覧用の2つのグループを作成し、そこに作成したユーザーをどちらかのグループに所属させることで一括管理するようにしました。以下はその手順です。
- SSO > グループ > 『グループの作成』を選ぶ。
- グループ名 : grafana_viewer (閲覧用)と grafana_admin (編集・閲覧用)の2つを作成する。
- SSO > ユーザー > 『ユーザーを追加』を選ぶ。
- ユーザー名、名前、タイムゾーンなど適宜記入し、次の『ユーザーをグループに追加』にて AMG 閲覧専用なら grafana_viewer 、* 編集・閲覧用なら grafana_admin を選択し、『ユーザーを追加』ボタンを押す。
4. 管理アカウントで AMG のワークスペース等の作成
AMG にて us-east-1 選択後、Create workspace を押し、以下のように作成していきました。
- Workspace name : 適宜
- Permission type : Service managed
- access : Organization
- AWS OU ID : rootのID
- data source : CloudWatch
1~2分でワークスペースが作成されて 『 Assign user group 』のボタンが表示されるので押してください。
- Groups タブにある grafana_viewer, grafana_admin をどちらも選択し『 Assign user group 』を押す。
追加しただけではどちらも閲覧専用になっていますので、以下のように編集・閲覧用グループを選択した状態で『 Make admin 』を押し、 User group type が Admin に変わるのを確認してください。
ちなみに SSO のアプリケーションを開くと、 Amazon Grafana-ワークスペース名 が追加されているのが目視できます。
これで AMG を利用する準備は整いました。
5. SSO にサインインして AMG のデータソース・AWSアカウントの選択
ユーザー作成時に表示されていた https://d-xxxxxxxx.awsapps.com/start のような URL で SSO にサインインします。すると以下のように Amazon Grafana が選択できますのでこれをクリックします。次の『 Sign in with AWS SSO 』もクリックしてください。
aws アイコンから次のようにしていきます。
なお以下サンプルでリージョンは東京を選んでいますが、本当にコストしか可視化しないのであれば US East (N.Virginia) でも構いません。お好みで選択してください
(※このスクショは自腹 AWS のスクショなので Account id が2個しかありませんが会社ですと何十行と並ぶと思いますw)。
- Service : CloudWatch
- Default region : Asia Pacific ( Tokyo )
- Account id : 全部
AMG でグラフを作っていく
やっとグラフの作成です(笑)。 Dashboards > Manage > 『 New Dashboard 』を選択します。
まず最初にアカウントごとの合算額を積み上げてみます。
なお以下のスクリーンショットは私の個人アカウントなので合算額なのに $6 でとても安い、かつアカウントの1つは $0 なので見た目は詰み上がっていませんが、Stack を ON にしているので一応積み上げのはずです。
- アカウント : 管理アカウントを指定する
- Region : us-east-1
- Namespace : AWS/Billing
- Metric Name : EstimatedCharges
- Dimensions : Currency=USD, LinkedAccount=*
- Period : 86400
- Stack : ON
- Left Y Unit : Dollars ($)
次にサービスごとの合算額を積み上げてみます。 さきほどとの違いは LinkedAccount を ServiceName に変えたくらいです。
- Dimensions : Currency=USD, ServiceName=*
次はサービスごとのアカウント別ランキングを出してみます。 さきほどとの違いはやはりDimensionsとなりますが、作成後にグラフ右側の Current を押して降順にするとランキングになります。
- Dimensions : Currency=USD, LinkedAccount=*, ServiceName=AmazonEC2等
同じように Dimensions の LinkedAccount でアカウントを固定して、 ServiceName を * とすることで、アカウントごとのサービス別ランキングになります。
そして最後に全アカウント合算での日ごとのグラフとなります。
Grafana は有志等によるカッコいいダッシュボードを数字だけ入力すれば取り込めるのですが、そのうちの1つ AWS Billing の1つをそのまま流用させていただきました。
- クエリA
- Disable/Enableクエリ : Disable (表示しない)
- Dimensions : Currency=USD
- id : a
- クエリB
- Disable/Enableクエリ : Disable (表示しない)
- id : b
- Expression : RATE(a) * PERIOD(a)
- クエリC
- Expression : IF(b>0,b)
- Alias : 日ごと
今までのをまとめるとこんな感じになりました。
- 全アカウントの合算額
- 全サービスの合算額
- アカウントごとのサービス別ランキング
- 日別の全アカウントの合算額
コストも色んな切り口で可視化することで、見えていなかった無駄や、逆にリソースをうまく使い切っているチームなどが見えてきました。そういったチームには今後表彰していけるような企画を作りたいなぁ、などとグラフを見ながら思っています。
またアラート機能を使うことで、突発的なコスト上昇も24時間以内に気づける可能性があるので、うまく使うと便利だと思います。
まとめ
今回は AMG のご紹介で終わってしまいましたが、今後は
- slack連携でのアラート
- コード化
- Amazon Managed Service for Prometheus (AMP) との連携
- etc
等についても書ければと思っています。