背景
- Redshiftは便利ですが、1度作ると原則24時間動き続けるので、利用料金がかさみます。
- 分析業務で人が利用する場合、日中はトランザクションが立て込むものの、夜間はあまり使われない。
- ElasticResizeの登場で、Classic時代に比べてリサイジングが高速になった。(数時間→10分程度)
この記事について
- 上記背景から、日中は8台、夜間は4台という具合に、クラスター台数を時間毎に変更したい。
- 自動運用できるようにCloudWatchのルールからクラスタ台数変更lambdaをCronでコールする。
- なお、夜間完全に停止して良い場合は、こちらの方法でSnapShot&停止・起動でも良いと思います。
この記事の注意点
- とりあえずの運用のために書いた雑な記事です。
- スクリプトでログ出力とか、型チェック、とかしていないです。
- 何かあればコメントください。
手順
1.lambdaでリサイズ関数を定義
- 下記のように、引数で受けたクラスタ名、クラスタサイズに変更
- 下記は変更予定がないので埋め込んじゃってます。
- region_name
- clusterType
- NodeType
- 私の環境だと,python3.7で動かしています。
import json
import boto3
def lambda_handler(event, context):
# TODO implement
name = event["Name"]
size = event["Size"]
cli = boto3.client('redshift',region_name='ap-northeast-1')
cli.resize_cluster(
ClusterIdentifier=name,
ClusterType='multi-node',
NodeType='dc2.large',
NumberOfNodes=size,
Classic=False
)
2.cloudwatchにて、cronで上記のlambdaをコールするように登録
- cronで、下記要領で、1のlambdaをコール
- 朝スケールアップ(4→8)
- 夜スケールダウン(8→4)
朝(スケールアップ時)
{
"Name": "Your cluster Name",
"Size": 8
}
夜(スケールダウン時)
{
"Name": "Your cluster Name",
"Size": 4
}
諸々注意点
RedShift
-
Elastic Resizeの制約がある。
- NodeTypeの変更はできない。(Classic Resizeが必要)
- single-node → multi-nodeの変更はできない。(Classic Resizeが必要)
- インスタンス数の変更は、1/2倍 or 2倍
- Elastic Resizeでは、VACUUMが実行されないのでたまに実行(直接的に関係ないか。。)
-
ディスク容量を考慮する。
- 利用しているディスク領域以下にはリサイズできないので、利用領域とリサイズ後の総容量を確認
lambda
- 実行権限の付与が必要(RedShiftの操作権限が必要です)
- タイムアウト時間は10~30秒程度に設定