
RDSとEC2を "順番に" 自動で起動・停止したい
RDSとEC2、AWSの3大サービス(筆者主観)のうちの2つだと思います。(あと1つはS3)
便利でたくさんのシステムでよく使われているため、開発用の環境としても使っているケースは多いのではないでしょうか。
Eventbridge Scheduler など強力なスケジューリングサービスも出てきて、日中のみ起動させるような仕組みも整ってきています。
ただ、一部のケースではまだ対応が難しいようなケースもあります。
例えば、RDSが起動している状態でないとEC2のプロセスがうまく立ち上がらないなどの理由から、RDSの起動完了を待ってからEC2を起動したいようなケースです。
このようなケースに対応するには、Step Functions と Lambda を使って順番に起動する方法があります。ただ、それなりにコードを書く必要があったり、管理が大変だったりとなかなかハードルが高いです。
今回は opswitch というサービスを使い、コードやリソースのセットアップを最小限にして、RDSとEC2を自動で起動する方法を紹介します。
opswitch とは
opswitch とは、クラスメソッドが開発・提供しているサービスです。
無料で使用できるサービスなので、AWSアカウントさえあればどなたでも簡単にご利用いただけます。
opswitch は AWS FTR を通過しており、AWS認定ソフトウェアとして AWS Partner Solutions Finder (PSF) に掲載されています。
無料のサービスですが、皆さんに安心してご利用いただけるよう取り組んでいます。
今回のゴール
RDSとEC2が、平日の朝・夜に順番通り起動・停止する処理を作ってみます。
全体の流れ
- opswitch にサインアップし、初期設定を行う
- タスクを作成する
- ジョブを作成する
- 動作を確認する
opswitch にサインアップする
まず、以下のページからサインアップし、画面の案内にしたがって必要な情報を入力していきます。
AWSアカウント連携
サインアップが完了すると、「初期設定」画面が表示されます。
「ユーザー属性情報 登録」はご自身の情報を入力してください。
「組織作成」は、opswitch 上でメンバーやタスクなどの管理するための単位である「組織」を作成します。
作成した組織は後から名前の変更が可能です。また、追加で作成することもできます。
部署名やプロジェクト名など、ご自身の組織と一致した名称がおすすめです。
サインアップ後、画面の案内に従って「ユーザー情報」「組織名」を入力していくと、以下の「AWSアカウント連携」の画面が表示されます。
この画面でopswitchとご利用中のAWSアカウントを連携する作業を行います。opswitch の画面上にも説明がありますが、この記事でも説明していきます。
まず、「IAM Roleを作成」ボタンを押します。
Cloud Formation の画面に移動するので、画面下部の「AWS CloudFormation によって IAMリソースが作成される場合があることを承認します。」にチェックを入れて「スタックの作成」をクリックします。
スタックによるIAMロール作成が完了すると、スタックの「出力」タブに AccountID
と IAMRoleName
の2つの値が出力されます。
この2つを、opswitchの画面にコピー&ペーストします。
最後に「アカウント名」を入力し、「作成」ボタンを押して連携作業は完了です。
タスクの作成
次に、タスクを作成します。
タスクとは、「どんな操作を」「どの対象に行うか」を定義するものです。
今回作成するタスクは、以下の合計4つのタスクです
- RDSインスタンスの起動タスク
- RDSインスタンスの停止タスク
- EC2インスタンスの起動タスク
- EC2インスタンスの停止タスク
どれも手順は同じなので、例として「RDSインスタンスの起動タスク」を作成します。
画面上部のメニューから「AWSタスク > RDS > DBインスタンスの起動・停止」を選択します。
画面右上の「作成」ボタンから、タスクを作成していきます。
以下のように項目を入力していきます。
「リージョン」では、操作したいインスタンスが存在するリージョンを選択してください。複数のリージョンを選択することも可能です。
「ターゲット」では、対象に付与されているタグを入力します。今回は例として opswitch-start-stop: true
のタグを使用します。
検証用のインスタンス database-1
に、以下のようにマネージドコンソール上からタグを付与しました。
opswitchの画面に戻り、虫眼鏡のアイコンをクリックしてインスタンスに過不足がないかの確認をしてみます。
正しく対象を識別できていることが確認できました。
また、「終了時のステータス」は「チェックする」に設定されていることを確認してください。
この設定により、処理の順番が保証されるようになります。 (今回では、起動の順番が保証されるようになります。)
これで「作成」を押すと、DBインスタンスを起動するタスクの作成が完了します。
同様に、停止タスクも作成しておきます。
起動タスクとは異なり、 「起動・停止」で「停止」を選択する点に注意してください。
これで、以下のようにDBインスタンスの起動タスクと停止タスクができました。
さらに、EC2インスタンスに対しても同様に起動・停止のタスクを作成しておきます。
画面上部のメニューから「AWSタスク > EC2 > EC2インスタンスの起動・停止」を選択し、以下のようにタスクを作成します。
ジョブの作成
最後に、ジョブを作成します。
opswitch でのジョブとは「どのタスクを」「どんなスケジュールで実行するか」を決めるものです。
ジョブにタスクを設定することで、初めて処理が実行されるようになります。
今回は、「起動ジョブ」と「停止ジョブ」の2つを作ります。
まずは「起動ジョブ」を作っていきましょう。
タスクと同様、メニューから「ジョブ」を選択し、画面右上の「作成」ボタンをクリックします。
次に、以下のように入力していきます。
スケジュールは、平日の朝8:30に実行されるようにしています。起動処理には全体で30分ほどかかると見込んで、9時には起動が完了しているようなイメージです。
オプションとして「日本の祝日はジョブの実行をスキップする」にチェックを入れています。もし祝日でも関係なく起動したい場合は、このチェックは入れないようにしてください。
また、 重要なポイントとして「タスク」の部分では上から順に「DBインスタンスの起動タスク」→「EC2インスタンスの起動タスク」としています。
opswitch では、この画面で設定した順番で上から実行されていきます。
今回の場合はDBの起動完了を待ってからEC2を起動したいので、DBインスタンスの起動が上に来るように設定しています。
同様に、今度は停止ジョブも作っていきます。
停止ジョブでは、タスクの順番を「EC2インスタンスの停止」→「RDSインスタンスの停止」の順番で設定してみました。
上記で作成を押すと、停止ジョブも完成です。
以上で、RDSとEC2が平日の朝・夜に順番通り起動・停止するような処理を設定することができました。
補足:EC2の起動処理が、RDSの起動処理まで待たれない場合
ジョブで正しくRDS→EC2の順番に設定されているのにEC2が先に起動してしまう場合、RDS起動タスクの「ステータスのチェック」が「チェックしない」と設定されている可能性があります。
「ステータスのチェック」とは、タスクの終了判定をいつ行うかを選択できるオプションです。
具体的には、以下のような違いがあります。
- 「チェックする」とした場合:起動が完了するまで次のタスクを実行しないようにします。
- 「チェックしない」として場合: "起動リクエスト" が正常に完了し、起動中に遷移したことが確認できた時点で、次のタスクの実行に移ります。
今回はRDSの起動を待ってからEC2の起動処理を行う必要があるため、このオプションが「チェックする」になっていることをご確認ください。
終わりに
以上で、Step Functions などのリソース作成を行わず、アカウントにはIAMロールを作成するだけで起動停止の処理が作成できました。
opswitch は他にも RDS for Aurora にも対応していたり、ECSの台数を変更などのタスクも提供しています。
色々なサービスの運用をかんたんに自動化できるので、この機会にぜひ使ってみてください!