LoginSignup
3
1

More than 5 years have passed since last update.

RedShiftクラスタを夜間縮退し、コストカットする

Last updated at Posted at 2019-01-24

背景

  • 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秒程度に設定
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1