さて、みなさまクラウド活用されていますか?

このブログでは国内で利用の多いクラウドサービスについて、APIを利用したクラウドサービスの利用状況の確認、および無駄なリソースの把握によるサービス利用費用削減をテーマに執筆していきます。 対象クラウドサービスは以下を予定しています。

  • AWS
  • Box
  • Salesforce
  • GSuite
  • Office365

今回はAmazon Elastic Compute Cloud (EC2) を対象に、リソースがどの程度使われているのかを把握し、Amazon EC2の割引サービスであるリザーブドインスタンス(RI)の活用につなげるアプローチについて紹介します。 第1回ということで、必要となる環境の構築方法や必要となる前提知識なども合わせて説明していきます。

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


必要な知識を得る

AWSの費用内訳

一般的にRDSとEC2の割合が多いので、まずはこれらを対象に状況を把握するのがコスト削減の近道です。

画像表示

RIの仕組み①

AWSのRIは、1年、または3年の利用宣言による割引サービスです。

参考URL:Amazon Web Service社様HP

画像表示

RIの仕組み②

AWSのRIは、特定のインスタンス(サーバ)リソースに紐づくものではなく、一つのRI契約で複数のインスタンスリソースに適用されます。1時間単位で精算され、リザーブドインスタンス契約を使い切るまで複数のインスタンスに適用されます。

参考URL:Amazon Web Service社様HP

画像表示

RIの仕組み③

AWSのRIは、インスタンスサイズ(large,smallなどの性能スペック)が異なっていても適用されます。※mediumをRI契約したらsmall×2でもOK。

各インスタンスサイズは正規化係数という数値で管理され、契約したRIの正規化係数分割引されます。※mediumは[2]、smallは[1]

インスタンスタイプ(t3,m5など)は合わせる必要があります。※t3のRI契約がm5に適用されることはない。

参考URL:Amazon Web Service社様HP

画像表示

作業に必要な準備をする

AWS管理者アカウントの手配①

AWSのマネジメントコンソール画面からにログインし、IAMのサービスを開きます。

画像表示

AWS管理者アカウントの手配②

AWSのIAMサービスから、APIによるデータ取得に利用するユーザを作成します。ユーザー作成時に「プログラムによるアクセス」にチェックを入れてください。

画像表示

AWS管理者アカウントの手配③

上記画面で表示された「アクセスキーID」と「シークレットアクセスキー」を後ほど利用しますのでcsvファイルのダウンロードなどで保管してください。

画像表示

AWS管理者アカウントの手配④

ユーザーを作成後、API実行に必要な権限を割り当てます。上記画面で「AmazonEC2FullAccess」の権限を付与してください。

画像表示
Card image cap

Linuxマシンの手配

API実行はLinuxのコマンドを利用して実行します。今回は仮想化ソフトウェアのVirtualBoxとCentOS7を利用します。

参考:VirtualBoxのダウンロードページ

参考:CentOS7のダウンロードページ

Card image cap

jqツールのインストール

AWSのAPIはJSON形式のデータです。Linux上でJSONデータを整形するためのツールである「jq」を以下コマンドでLinuxのコマンドラインからインストールしてください。

$ sudo yum -y install epel-release

$ sudo yum -y install jq

Card image cap

AWS SDKのインストール

AWSからAPIを実行するためのSDKが提供されています。今回はJavaScriptSDKを利用しますので以下コマンドでLinuxのコマンドラインからインストールしてください。

$ sudo yum -y install npm

$ npm install aws-sdk


APIを使ってデータを取得する

1.今回利用するAPI

さて、それではAPIを使ってデータを取得していきましょう。

まずは現状どの程度のEC2リソースが利用されているのかをAPIを使ってデータを取得します。

APIは「AWS.EC2.describeinstances」を利用します。

2.認証情報ファイルの作成

AWSのマネジメントコンソール画面でユーザーを作成した際に取得した認証ファイルから以下のファイルを"credential.json"として作成します。"XXX"となっているそれぞれの値は環境に合わせて修正してください。

{
  "accessKeyId": "XXXXXXXXXXXXXXXXXXX",
  "secretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

3.スクリプトの作成

 

実際にAPIを実行するスクリプトファイルを上記の認証ファイルが存在する同フォルダ内に"sample.js"として作成します。以下の内容をコピーして利用ください。

const AWS = require('aws-sdk');
//認証情報の読込 AWSの日本Regionを指定
AWS.config.loadFromPath('credential.json');
AWS.config.update({ region: "ap-northeast-1"});
//params
const params = {};
//EC2 obj
const ec2 = new AWS.EC2();
//APIの実行
ec2.describeInstances(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(JSON.stringify(data.Reservations));           // successful response
});

4.実行

作成したスクリプトを以下のコマンドで実行します。

  • JSON形式出力

    $ node sample.js | jq -r '.[].Instances[] | [.InstanceId, .LaunchTime, .InstanceType, .State.Name]'

  • CSV形式出力

    $ node sample.js | jq -r '.[].Instances[] | [.InstanceId, .LaunchTime, .InstanceType, .State.Name] | @csv'

5.結果の確認(JSON形式)

スクリプト実行時の結果のサンプルを以下に示します。このデータを整形して、長時間停止されていないサーバのリソースを調べます。

前述したとおり、RIについてはインスタンスを跨って割引が適用されるため、細かく停止、起動を繰り返すサーバについても割引が適用されます。 今回の記事ではEC2のAPIではこのようなサーバの正確な情報を取得することが難しいため、割愛します。CloudTrailやCloudWatchのAPIを利用することで、サーバの起動タイミングや停止タイミングのイベント情報を取得可能です。

[
  "i-XXXXXXXXXXXXXXXXX",//インスタンスIDが出力されます
  "2018-07-13T00:34:08.000Z",//最終起動時刻が出力されます
  "m5.large",//インスタンスタイプが表示されます
  "running"//サーバの状態が表示されます。
]
[
  "i-YYYYYYYYYYYYYYYYY",
  "2018-07-10T05:30:02.000Z",
  "t3.micro",
  "stopped"
]
  • 結果の分析

上記のデータを加工して、長時間起動している各インスタンスタイプの正規化係数を求めます。CSV形式の出力データをExcelで加工するのが簡単だと思います。

  • データの見方

c5については、リニアに利用量が上がっており、将来増加する可能性が高いと思われます。

t3については、この1か月に急激に利用量が上がっており、t3というCPU処理バースト向けのインスタンスタイプを利用していることから、短期間の起動でバッチ処理などに利用されている可能性が高いでしょうか。この利用方法が一時的なものなのか、定常的なものなのかを判断してRIの計画を立てる必要があります。

m5については、ほぼ一定でインスタンスIDが変わらないことから、定常的に永続起動しているものということが容易にわかります。RIを優先的に適用すべきデータとなります。

長時間起動中のインスタンスタイプ別正規化係数(NormalizationFactor)データサンプル
InstanceType 12month+ 6month+ 3month+ 2month+ 1month+
c5 8.0 40.0 104.0 154.0 202.0
t3 4.0 8.0 12.0 15.0 168.0
r5 4.0 16.0 40.0 48.0 56.0
m5 10.0 10.2 10.3 10.5 10.5

RIを契約する

  1. RIを契約する

上記のデータから、今回はc5は24xlarge(正規化係数:192)、m5のxlarge(正規化係数:8)を契約することとしました。

AWSのコンソール画面、EC2サービスの画面から、「リザーブドインスタンスの購入」ボタンから購入します。


  1. RIの権利を売る

3年のRI契約の場合ほぼ半額程度の金額となるため、少し計画より利用サーバ数が少なくとも十分採算は取れますが、万が一計画したRIから大きく予定が崩れる場合、RIの残期間の権利を他者へ販売することも可能です。

参考:リザーブドインスタンスマーケットプレイスで販売する。