LoginSignup
5
3

More than 5 years have passed since last update.

redshiftの停止・再起動スクリプトを作ってみた

Last updated at Posted at 2019-04-01

redshiftの料金を節約したい

redshiftは大量データを高速で集計できるため、非常に重宝。
が、いかんせんお値段が結構(DC2ノードで2.6万円/月ほど)する。
手っ取り早い削減方法はリザーブドインスタンスの契約だが、1年間~の契約のため
様々な事情でオンデマンド契約にせざるを得ないケースが考えられる。
例)
・1年間も使うっけ?
・3年契約だと7割引だけど、そんなに長期間契約できない!

停止→再起動のスクリプトを書いてみた

オンデマンドの場合、稼働時間で料金発生するなら、
必要な時だけ稼働させれば良いじゃない!ってことで、
Bashスクリプトを作成。

スクリプト


#!/bin/bash


######### 使い方 ###########################################################
#
# 1. 最後のスナップショットからクラスタを復元するとき $ bash redshift_start start
# 2. クラスタを停止するとき(スナップショットを取得後)$ bash redshift_start stop
# 3. クラスタのステータスを確認するとき             $ bash redshift_start status
#
############################################################################


########## ↓設定パラメーター一覧 ###############################################
#####
###
##
#

##### デフォルトリージョン
export AWS_DEFAULT_REGION=ap-northeast-1

#### Redshiftクラスタ名
REDSHIFT_IDENTIFIER=your_redshift_cluster

#### PORT番号
PORT=5439

#### ゾーン(アベイラビティゾーン)
AZ=ap-northeast-1a

#### クラスターサブネットグループ
REDSHIFT_CLUSTER_SUBNET_GROUP=your-protect-var-redshiftsubnet

#### パラメーターグループ名
REDSHIFT_CLUSTER_PARAMETER_GROUP=your_redshift_cluster

#### セキュリティグループID # セキュリティグループ名で指定する場合は、不要
VPC_SECURITY_GROUP_IDS=sg-xxxxxxxx

#### セキュリティグループ名 # セキュリティグループIDで指定する場合は、不要
CLUSTER_SECURITY_GROUPS=your-sec-redshift

#### 自動スナップショットの保持期間 停止・削除を終えた場合の措置
AUTOMATED_SNAPSHOT_RETENTION_RERIOD=4

#### 手動スナップショットの保持期間
MANUAL_SNAPSHOT_RETENTION_RERIOD=4

#### メンテナンスウィンドウの時間 UTC基準
MAINTENANCE_WINDOW=sat:18:00-sat:18:30

#### RedshiftのIAM_ROLE
IAM_ROLES=arn:aws:iam::xxxxxxxx:role/role-xxxxxxxx

#
##
###
######
########## ↑設定パラメーター一覧 ###############################################


############### 直接記述するパラメーター ##############################
####
#### バージョンUPグレード : 許可         --allow-version-upgrade
#### パブリックアクセス可能か:いいえ       --no-publicly-accessible
#### 拡張されたVPCルーティング可能か:いいえ --no-enhanced-vpc-routing
####
#######################################################################


######## ここから関数本体 ############################################
######## 下記では、セキュリティグループID(VPC_SECURITY_GROUP_IDS)で指定しているため、セキュリティグループ名は指定していない

function redshift_status() {
  aws redshift describe-clusters \
    --cluster-identifier ${REDSHIFT_IDENTIFIER} \
    --query "Clusters[].{ClusterIdentifier:ClusterIdentifier,ClusterStatus:ClusterStatus,RestoreStatus:RestoreStatus.Status}" \
    --output table
}

case $1 in
  start)
    LAST_REDSHIFT_SNAPSHOT=$(aws redshift describe-cluster-snapshots \
      --snapshot-type manual \
      --query "reverse(sort_by(Snapshots,&SnapshotCreateTime))[?ClusterIdentifier==\`${REDSHIFT_IDENTIFIER}\`]|[0].[SnapshotIdentifier]" \
      --output text)

    aws redshift restore-from-cluster-snapshot \
      --cluster-identifier ${REDSHIFT_IDENTIFIER} \
      --snapshot-identifier ${LAST_REDSHIFT_SNAPSHOT} \
      --port ${PORT} \
      --availability-zone ${AZ} \
      --allow-version-upgrade \
      --cluster-subnet-group-name ${REDSHIFT_CLUSTER_SUBNET_GROUP} \
      --no-publicly-accessible \
      --cluster-parameter-group-name ${REDSHIFT_CLUSTER_PARAMETER_GROUP} \
      --automated-snapshot-retention-period ${AUTOMATED_SNAPSHOT_RETENTION_RERIOD} \
      --manual-snapshot-retention-period ${MANUAL_SNAPSHOT_RETENTION_RERIOD} \
      --vpc-security-group-ids ${VPC_SECURITY_GROUP_IDS} \
      --preferred-maintenance-window ${MAINTENANCE_WINDOW} \
      --no-enhanced-vpc-routing \
      --iam-roles ${IAM_ROLES} 
    redshift_status
    ;;

  stop)
    REDSHIFT_SNAPSHOT_NAME=${REDSHIFT_IDENTIFIER}-$(date +'%Y%m%d-%H%M%S')
    aws redshift delete-cluster \
      --cluster-identifier ${REDSHIFT_IDENTIFIER} \
      --no-skip-final-cluster-snapshot \
      --final-cluster-snapshot-retention-period ${MANUAL_SNAPSHOT_RETENTION_RERIOD} \
      --final-cluster-snapshot-identifier ${REDSHIFT_SNAPSHOT_NAME}
    redshift_status
    ;;

  status)
    redshift_status
    ;;
  *)
    echo "Usage: $0 {start|stop|status}"
    ;;
esac

注意点

  • AWS CLIは、最新版を確認するほうがよい
    • 上記スクリプトはVer 1.16.109で作成
    • 参考サイト(AWS CLI Command Refrence)で、オプション内容を確認
    • 場合によってはCLIのUPDATEが必要
  • クラスター復元時、マニュアルスナップショットの期限設定オプションが効かない
    • 対象のオプションは、manual-snapshot-retention-period <value>
    • valueに-1以外の数値を設定しても、復元後クラスタの手動スナップショット保持期間が-1に
    • AWSに問い合わせたところ、不具合とのこと(2019年2月時点)
    • 現状では、対策は2つ
      • modify-cluster-snapshotを利用して変更
      • delete-clusterのオプションで、最終スナップショットの保持期間を指定
        ※上記スクリプトではこちらを利用

参考サイト

5
3
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
5
3