意外と知らない?AWS OrganizationでAWSのボリュームディスカウントを使い倒す
今回はAWSのボリュームディスカウントの仕組みを理解することで、組織内で散見するアカウントの統合によってコスト削減を実現するアプローチについて紹介します。 具体例として、ストレージサービスであるAWS S3の各アカウントの使用データ量を確認し、アカウントを統合することでどの程度コスト削減が見込めるかを検証していきます。
APIを活用したクラウドの「コストの見える化」改革
- 2019年09月17日公開
APIを活用したクラウドの「コスト見える化」改革
第3回 意外と知らない?AWS OrganizationでAWSのボリュームディスカウントを使い倒す
- AWS管理者アカウント 1個
- Linuxマシン(VM) 1台
- :60分
- 効果:
今回はAWSのボリュームディスカウントの仕組みを理解することで、組織内で散見するアカウントの統合によってコスト削減を実現するアプローチについて紹介します。 具体例として、ストレージサービスであるAWS S3の各アカウントの使用データ量を確認し、アカウントを統合することでどの程度コスト削減が見込めるかを検証していきます。
どうぞよろしくお願いいたします。
必要な知識を得る
AWS Organization
AWSのアカウントを集約するサービスです。
組織内のチーム毎などで複数のAWSアカウントを保持している場合、統合することでボリュームディスカウントなどの恩恵を受けることができます。
AWSのボリューム割引①
一つの組織にまとめると複数のAWSアカウントを跨いで累計の利用量で計算され、一部のサービスの割引が受けられます。
一つの組織にまとめた場合、月額の請求内容が変わる可能性があるので注意してください。
参考URL:Amazon Web Service社様HPAWSのボリューム割引②
第1回で説明したRI(リザーブドインスタンス)は組織を跨って適用されます。
短いサーバの利用を繰り返すプロジェクトを集約することで、普段恩恵を受けられなかったアカウントでも恩恵を受けられる可能性があります。
RIを組織内で共有する場合、各アカウントへ割引後の平均額(RIが適用されなかったものと適用されたものの平均利用料金)にて請求されます。
RIを特定のアカウントのみで利用したい場合はRIの共有を無効化することも可能です。
AWSのボリューム割引例
今回はS3のストレージ料金の割引を検討します。S3の東京リージョンの料金体系は以下となっており、AWSアカウントを統合することで、ストレージ1GBあたり0.001USD~0.002USD/月額の割引が受けられます。
最初の50TB/月 0.025USD/GB
次の450TB/月 0.024USD/GB
500TB/月を超える分 0.023USD/GB
作業に必要な準備をする
AWS管理ポリシーの作成
過去回で作成した「api_user」アカウントに、API実行に必要な権限を追加で割り当てます。今回はAWS上で必要な管理ポリシー(権限セット)が提供されていないため、以下データを「ポリシー」として新規作成します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ce:*" ], "Resource": [ "*" ] } ] }
AWS管理ポリシーの手配
作成した管理ポリシーを「api_user」に付与します。
APIを使ってデータの取得する
1.今回利用するAPI
それではAPIを使って実際にデータを取得していきましょう。
各AWSアカウントの料金を取得するために
「AWS.CostExplorer.getCostAndUsage」を利用します。
2.スクリプトの作成
CostExplorerのAPI実行スクリプトを作成します。以下の内容をコピーして「get_costexplorer_s3.js」として保存してください。
require('date-utils'); const AWS = require('aws-sdk'); //credential情報の読込 AWS.config.loadFromPath('credential.json'); //AWSアカウント毎にファイル名を切り替えて利用してください。 //時刻の設定 var dt_today = Date.today(); var dt_1monthago = Date.today().remove({"months": 1}); var formatted_today = dt_today.toFormat("YYYY-MM-01"); var formatted_1monthago = dt_1monthago.toFormat("YYYY-MM-01"); //Metricsの設定 const metric = { "TimePeriod": { "Start": formatted_1monthago, "End": formatted_today }, "Granularity": "MONTHLY", "Filter": { "Dimensions": { "Key": "SERVICE", "Values": [ "Amazon Simple Storage Service" ] } }, "GroupBy":[ { "Type":"DIMENSION", "Key":"USAGE_TYPE" }, { "Type":"TAG", "Key":"Environment" } ], "Metrics":["BlendedCost", "UnblendedCost", "UsageQuantity"] }; //cloudwatchの生成+リージョン指定 CostExplorerAPIは日本リージョンを指定するとエラーになるので注意 const costexplorer = new AWS.CostExplorer({apiVersion: '2017-10-25',region: 'us-east-1'}); //データを投げる costexplorer.getCostAndUsage(metric, (err, data) => { if (err) console.log(err, err.stack); // an error occurred else console.log(JSON.stringify(data.ResultsByTime)); // successful response });
3.利用中のS3ストレージサイズの取得
$ node get_costexplorer_s3.js | jq -r '.[].Groups[] | select( .Keys[0] == "APN1-TimedStorage-ByteHrs") | .Metrics.UsageQuantity
4.結果の確認
スクリプト実行時の結果のサンプルを以下に示します。
{ "Amount": "120.0984232081", //ストレージ利用量 "Unit": "GB-Month"//単位 }
5.結果の分析
上記のデータを加工して、各アカウント毎のストレージ利用量を累計します。
データの見方
それぞれアカウントが独立している場合、最も安い料金レートである0.023USD/GBが適用されるのはアカウントEのみだったものが、アカウントを統合することですべてのアカウントの料金レートがアカウントの累計で産出されるため最安レートの適用範囲が広がります。
今回のデータでは、アカウントE以外のAWSアカウントによるデータ利用量累計が640000GBほどあるため、およそ$640/月程度の効果が見込めそうです。
AWSAccountId | S3データ利用量 |
---|---|
A | 120(GB) |
B | 439003(GB) |
C | 12805(GB) |
D | 52090(GB) |
E | 591048(GB) |
F | 44020(GB) |
G | 92100(GB) |
AWS Organizationでアカウントを統合する
アカウントの統合
削減効果があることを確認したところで、実際にAWSのOrganizationのページから対象のアカウントを追加します。
AWSのアカウントを統合することで、親アカウントの物からS3のデータ使用量が参照できるようにもなります。
NTTテクノクロス株式会社
ビジネスソリューション事業部