カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

Redshiftクラスタの一時停止と再開をスケジュールで実施する

以前の記事でRedshiftのクラスターの一時停止と再開とマネジメントコンソールから手動で実行しました。
今度はスケジュールで実行するように設定してみます。

前回の記事↓↓
capybara-engineer.hatenablog.com

実施作業

準備

Redshiftクラスター作成

まずはスケジュール設定するためのRedshiftクラスターを作成します。
f:id:live-your-life-dd18:20200703140420p:plain

作成方法は過去記事に書いてあるので割愛します。
capybara-engineer.hatenablog.com

IAMロール作成

以前の記事でも少し書いたかもしれませんが、クラスターの一時停止と再開をスケジュール設定するとき、ユーザの代わりにRedshiftにアクセスして操作するIAMロールを指定する必要があります。

以下のドキュメントを参照しながらIAMロールを作成していきます。
docs.aws.amazon.com

IAMのコンソールからロールの作成を実行し、以下の流れでユースケースを選択します。
f:id:live-your-life-dd18:20200703141044p:plain

この手順だとデフォルトでFullAccessポリシーが設定されます。
内容を確認して、ロールを作成します。
f:id:live-your-life-dd18:20200703141208p:plain

ロールが作成できていることを確認します。
f:id:live-your-life-dd18:20200703141358p:plain

それでは早速設定...といきたいところですが、現状だとredshiftのschedulerへの信頼関係は設定されていても、redshiftへの信頼関係は設定されていないため、IAMロールの信頼関係を以下のように修正します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "scheduler.redshift.amazonaws.com",
          "redshift.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

無事に修正できたらIAMロールの設定は完了です。

Redshiftのスケジュール設定

準備ができたら実際にスケジュールを設定していきます。

一時停止する方法は3種類ありますが、今回はスケジュールで設定するので、一番右を選択します。
f:id:live-your-life-dd18:20200703141942p:plain

次に
①スケジュール名
②スケジュールの説明
③開始日
④終了日
の4項目を設定します。
終了日を設定しないと永続的に実行されてしまうので、期間指定でやりたい場合は忘れずに設定しましょう。
f:id:live-your-life-dd18:20200703145546p:plain

※補足
開始日と終了日ですが、この作業をしている当日(7/3)には設定できないようで、翌日(7/4)から設定することが可能でした。
f:id:live-your-life-dd18:20200703142252p:plain


スケジュールの設定方法としてエディタでの設定かCRON構文での設定かの2種類があります。

  • エディタ

f:id:live-your-life-dd18:20200703142755p:plain

  • CRON構文

f:id:live-your-life-dd18:20200703142824p:plain

エディタでの設定では実行間隔として「月、週、日」の3つがあり、以下のように設定が可能です。

月 → 指定した日付or指定した曜日に停止・再開する(時間も指定可)
週 → 毎週指定した曜日に停止・再開する(時間も指定可)
日 → 毎日指定した時間に停止・再開する

ただ、エディタの設定だと平日朝9時に再開し、夕方18時に一時停止する、といった柔軟な設定ができないため、そのような設定をしたい場合は、CRON構文での設定が必須になってきます。

以下に月曜~金曜まで朝9時開始夕方18時停止する設定したCRON構文を載せておきます。
※時間はUTCでの計算になるため注意が必要
f:id:live-your-life-dd18:20200703143954p:plain


<2020/7/7追記>
resumeのCRON構文が間違っていました。
正しくは本記事の下部途中に記載しています。


最後にIAMロールを設定してスケジュール設定を完了します。
f:id:live-your-life-dd18:20200703144118p:plain

うまく設定できるとコンソールに以下のようなメッセージが出力されます。
※特に画面遷移などはしません
f:id:live-your-life-dd18:20200703144207p:plain

スケジュール設定確認

これで設定ができたのか確認します。
Redshiftコンソールからクラスターを選択します。
f:id:live-your-life-dd18:20200703144405p:plain

スケジュールタブから一時停止と再開のスケジュールが設定されていることが確認出来ました。
f:id:live-your-life-dd18:20200703145214p:plain

次の呼び出しは以下のように設定されており、
上が一時停止時間(UTC表示なので日本時間だと7/6(月)18:00)、
下が再開(UTC表示なので日本時間だと7/6(月)9:00)
される想定です。
f:id:live-your-life-dd18:20200703145116p:plain

一時停止→再開の順で表示されているので少しわかりづらいですが、想定通り設定はできていそうです。

実行確認

後日結果をRedshiftのイベントから確認したところ、7/5 0:00(UTC)にresumeが実行され、7/6 9:00にpauseが実行されていることから、日本時間の7/5 9:00~7/6 18:00で起動していたようです。
f:id:live-your-life-dd18:20200707125511p:plain


resumeのスケジュール設定が間違っていました。
UTCJSTの計算はわかりにくいですね。。

正しくは以下になります。
UTC月曜0時→JST月曜9時に実行されるので、以下を設定することで平日日中帯のみ起動することが可能になります。

0 0 ? * SUN-THU *
↓
0 0 ? * MON-FRI *


感想及び所感

時刻の計算でミスがありましたが、概ねやりたいことは実施することができました。
コンピュートノードだけでも停止できるとコストが大分削減できると思うので、是非やってみてください。