Amazon Redshiftの利用料金を半額にしよう!~自動シャットダウン/リストアのノウハウ公開~|AWSを使い倒せ

AUTHOR :   ギックス

Redshiftの起動時間を減らす シャットダウン&リストア・バッチプログラム

Amazonのビッグデータ専用のDBであるAmazon Redshift(以下、Redshift)は、自社でオンプレミスのサーバー環境を構築する場合に比べ、非常に安く利用できます。しかし、それなりのボリュームのDB(ds2.xlarge / 東京リージョン / 記憶容量2TB / 2015/07/27現在の場合)を1年間運用し続けた場合、約$10,000=約120万円の使用料が必要となります。オンプレミスに比べれば安いとはいえ、それなりの金額感になりますので、今回は、この使用料金を”ちょっとした技術”で半額以下にする方法をご紹介します。

尚、そもそも、クラウドとオンプレミスって何が違うの?という方は、コチラの関連記事をご参照ください。

使用料金を下げるためには使用する時だけ起動すればいい

Redshiftの標準の料金プランは「オンデマンド料金」になっているため、起動時間によって使用料金が請求されます。これを「リザーブドインスタンス」という年間契約で行うと約20%から最大76%まで使用料金を下げることができます。(参考:Redshiftの料金) しかし、70%以上、使用料金を下げるためには3年間のリザーブドインスタンス契約を行う必要があります。また、Redshiftの使用期間が1年に満たない場合は、リザーブドインスタンス契約の適用外になります。

そのため、3年未満のRedshiftの運用では、「オンデマンド料金体系のまま、使用する時だけRedshiftを起動する方法で利用料金を下げる」方法をお勧めします。しかし、このRedshiftの運用を行うためだけに、作業担当者が都度都度Redshiftの管理コンソールにログインし、シャットダウン作業たスナップショット(バックアップ)からのリストア作業を行うのは、”無駄作業”な印象が否めません。例えば、毎営業日、早朝(作業開始前)に15分、深夜(作業終了後)に15分の合計30分を費やすとすると、1週間で2.5時間、1ヶ月で10時間、1年間で120時間の工数が必要になります。そうすると、仮に料金が半分に減ったとしても、120万円×0.5=60万円をの削減効果を得るために、120時間の工数を投下するわけですから、担当者の時給が1,250円なら差し引き45万円の節減効果、2,500円/hなら30万円の節減効果になってしまいます。また、毎日同じ作業をルーチンで行うのは、モチベーションダウンにもつながりますし、作業漏れや人為的なミスも起こりやすくなりますから、できれば避けたいところです。

ということで、この作業を簡単なプログラムを使って、バッチで自動的に行うようにするのがオススメです。(弊社でも、実装し、導入しています)

このバッチを使用することで、業務時間のみRedshiftを起動して、平日夜と休日はRedshiftをシャットダウンしておくことができますから、使用時間は半分以下になります。そのため、Redshiftの使用料金も半分以下になります。

Redshiftのシャットダウン/リストアバッチの環境構築方法

Rubyの実行環境とAWS SDKのインストール

Redshiftのシャットダウンなどの操作を行うためには、AWS SDKと呼ばれる開発ツールキットのプログラム関数が必要になります。この関数は、Java言語、.NET、Python言語用などがあります。どの言語でもバッチは作成可能だと思いますが、今回は、その中でRuby言語用のAWS SDKを使用して、バッチを作成しました。もちろん、Ruby言語ですので、バッチを実行できるOSは、Windows以外にLinuxなどでも可能です。

Rubyの動作環境の構築方法(インストール)については、Rubyの公式ホームページ、または、インターネット上に著名なホームページが沢山ありますので、そちらをご参照ください。(Rubyのバージョンは最新の物で構いません) Rubyのインストールが完了すると「gem」とういコマンドが使えるようになります。この「gem」コマンドを使うことでインターネット上のRubyライブラリをインストールできます。今回は、AWS SDKのRubyライブラリをインストールしますので「gem install aws-sdk」とコマンドを実行すれば、AWS SDKをインストールできます。(Windowsの場合はコマンドプロンプトでgemコマンド実行)

AWS IAMでアクセスキーとシークレットキーを作成する

Redshiftを外部から操作するためには、Redshiftへのアクセスを許可されたユーザーのアクセスキーとシークレットキーが必要になります。ユーザーの作成は、AWSコンソールのIdentity and Access Management(IAM)から行うことができます。IAMのユーザー作成後、ポリシーのアタッチ(権限の付与)を行いますので「AmazonRedshiftFullAccess」などのRedshiftへの操作ができるポリシーを設定してください。

バッチプログラムの作成

Redshiftのクラスター(Redshiftの起動単位)には、「シャットダウン」というものは存在しません。そのため、クラスターを削除することで、シャットダウン運用を行います。しかし、ただ削除しただけでは、DBイメージ自体も削除されてしまいます。そのため、シャットダウン時にバックアップとしてSnapshotを作成します。これによって、リストア時に作成したSnapshotからRedshiftのクラスターを復元(リストア)できるようになります。

下記は、各バッチの詳細な処理内容です。

シャットダウンバッチの作成

シャットダウンバッチは、Redshiftのクラスターのバックアップと削除だけです。Redshiftのクラスターの削除は、Rubyの「delete_cluster」関数を使用します。この関数で同時にSnapshot名を指定できますので、1度にクラスターのバックアップと削除を行えます。この時、Snapshot名を「固定のSnapshot名 + タイムスタンプ文字列」とすることで、Snapshotの管理がしやすくなります。resshift_img1

リストアバッチの作成

リストアバッチは、Snapshotの一覧取得と最新のSnapshotからのリストアを行います。まず、初めに「Snapshotの一覧取得」ですが、Rubyの「describe_cluster_snapshots」関数を使用して、リストアするRedshiftのクラスター名からSnapshot一覧を取得します。次に、取得したSnapshot一覧から、最新のSnapshotを探し出し、Rubyの「restore_from_cluster_snapshot」関数を使用してRedshiftのクラスターをリストアします。

これでリストアバッチ自体は動作可能ですが、この状態ですとSnapshotが永遠に増え続けます。Snapshotの記憶領域も課金されますので、リストアバッチの処理で消しましょう。先の処理でSnapshot一覧を取得していますので、そこから”ある程度のSnapshot”を残し、古いSnapshotをRubyの「delete_cluster_snapshot」を使用して削除します。この”ある程度のSnapshot”を残すことにポイントがあります。例えばSnapshotを3つ(3日分)残す場合、3日前までDBのデータを戻せることになります。うっかりテーブルを削除してしまった場合などは、過去のSnapshotがあればデータ復旧が可能になるのです。resshift_img2

バッチの設定

最後に作成したRubyプログラムをバッチとして起動できるように設定します。

Rubyプログラムの実行は、「ruby」コマンドの後にRubyプログラムを指定すれば実行できます。例えば「c:/test」フォルダ内に「redshift_shutdown.rb」という名前でシャットダウンのRubyプログラムを保存した場合、「ruby c:/test/redshift_shutdown.rb」で実行できます。

また、Rubyプログラムは実行時に「引数」として情報を与えることができます。Redshiftのクラスター名、Snapshot名、AWSの接続情報などRedshiftのクラスターによって変わる情報について、「引数」として渡すことにより、1つのプログラムで複数のRedshiftのクラスターを操作できるようになります。更にシャットダウンバッチ、リストアバッチ共に共通する処理が含まれていますので、「引数」によって実行処理を切り分けた方が、1つのRubyプログラムで2種類の処理を制御できますので、開発効率が良いです。

このRubyプログラムをWindowsの場合はタスクスケジューラ、Linuxはcronなどに登録すれば自動的にプログラムを実行できるようになります。Windowsのタスクスケジューラの場合は、下記のように設定すればRedshiftのリストアバッチが設定できます。(「引数:r」を指定して、リストア処理に切り替えている例)redshift_shutdown

ここでリストアバッチの開始時間の設定ポイントがあります。それは、Redshiftの起動からリストア処理完了までの時間を考慮する必要がある事です。この、リストア処理時間は、実際の登録記憶容量に比例し、ノードの種類よって左右されますが、登録記憶容量1TBあたり2時間ほど掛かると見込んでリストアバッチの開始時間を設定することをお勧めします。

アイディアとちょっとの技術でAWS環境は改善できる

今回は、AWS SDKを使用して、Redsiftのバックアップとリストアの自動化を行いましたが、AWS SDKは、AWSコンソールで行える殆どの操作を行うことが可能です。プログラミングの技術は、必須になりますが、ちょっと開発経験があれば、比較的簡単にシステムを構築可能です。AWS SDKの開発環境構築は、基本的にお金は掛かりませんので、業務改善のためにAWS SDKにトライしてみては如何でしょうか?(ちょっとコードを書くだけで、数十万円単位のコスト削減が実現できるのは、魅力的ですよね!)

SERVICE