今回はAWSのボリュームディスカウントの仕組みを理解することで、組織内で散見するアカウントの統合によってコスト削減を実現するアプローチについて紹介します。 具体例として、ストレージサービスであるAWS S3の各アカウントの使用データ量を確認し、アカウントを統合することでどの程度コスト削減が見込めるかを検証していきます。

どうぞよろしくお願いいたします。


必要な知識を得る

Card image cap

AWS Organization

AWSのアカウントを集約するサービスです。

組織内のチーム毎などで複数のAWSアカウントを保持している場合、統合することでボリュームディスカウントなどの恩恵を受けることができます。

AWSのボリューム割引①

一つの組織にまとめると複数のAWSアカウントを跨いで累計の利用量で計算され、一部のサービスの割引が受けられます。

一つの組織にまとめた場合、月額の請求内容が変わる可能性があるので注意してください。

参考URL:Amazon Web Service社様HP
画像表示
Card image cap

AWSのボリューム割引②

第1回で説明したRI(リザーブドインスタンス)は組織を跨って適用されます。

短いサーバの利用を繰り返すプロジェクトを集約することで、普段恩恵を受けられなかったアカウントでも恩恵を受けられる可能性があります。

RIを組織内で共有する場合、各アカウントへ割引後の平均額(RIが適用されなかったものと適用されたものの平均利用料金)にて請求されます。

RIを特定のアカウントのみで利用したい場合はRIの共有を無効化することも可能です。

Card image cap

AWSのボリューム割引例

今回はS3のストレージ料金の割引を検討します。S3の東京リージョンの料金体系は以下となっており、AWSアカウントを統合することで、ストレージ1GBあたり0.001USD~0.002USD/月額の割引が受けられます。

最初の50TB/月 0.025USD/GB

次の450TB/月 0.024USD/GB

500TB/月を超える分 0.023USD/GB


作業に必要な準備をする

Card image cap

過去回で利用したものを流用します

手順を実施していない方は下記リンクから参照の上実施してください。

第1回 Amazon EC2 利用コストを可視化してリザーブドインスタンス(RI)を使い倒す

第2回 Amazon EC2 サーバリソースの無駄を可視化してコストを削減する

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/月程度の効果が見込めそうです。

S3 UsageQuanitityデータサンプル
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のデータ使用量が参照できるようにもなります。