CloudFormation で Instance Scheduler を使用して EC2 インスタンスをスケジュールするにはどうすればよいですか?
最終更新日: 2022 年 10 月 28 日
AWS CloudFormation で AWS Instance Scheduler を使用して、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのスケジュールを設定したいと考えています。
簡単な説明
CloudFormation テンプレートを使用して AWS Instance Scheduler のデプロイを自動化します。
注: 現在、アジアパシフィック (ジャカルタ) およびアジアパシフィック (大阪) の AWS リージョンではテンプレートを使用できません。
重要: 暗号化された Amazon Elastic Block Store (Amazon EBS) を使用する EC2 インスタンスで Instance Scheduler を使用している場合、インスタンスは起動できません。インスタンスを起動するには、EBS ボリュームを暗号化または復号するためのキーポリシーを含むキーユーザーロールを、Instance Scheduler に付与する必要があります。キーユーザーロールがこのキーを使用できるよう、AWS Key Management Service (AWS KMS) キーにキーポリシーを追加する必要があります。
解決方法
Instance Scheduler コマンドラインインターフェイス (CLI) をインストールします。
インストールが成功したことを確認するには、次のコマンドを実行します。
$ scheduler-cli --version
Instance Scheduler テンプレートを使用して CloudFormation スタックを作成する
スタックは、AWS Lambda 関数、Amazon DynamoDB テーブル、Amazon EventBridge ルール、および Amazon CloudWatch カスタムメトリクスをデプロイします。
- AWS マネジメントコンソールを開きます。
- Instance Scheduler テンプレートで CloudFormation を開きます。または、[Step 1.Launch the instance scheduler stack] (ステップ 1. インスタンススケジューラスタックを起動する) ページに移動し、[Launch Solution] (ソリューションを起動) を選択します。
注: テンプレートは、デフォルトで米国東部 (バージニア北部) リージョンで起動されます。 - ナビゲーションバーで、テンプレートを使用して、スタックを起動する AWS リージョンを選択してから、[Next] (次へ) を選択します。
- [Stack name] (スタック名) で、スタックに名前を付けます。
- [Instance Scheduler TagName] で、デフォルトの値を [Schedule] (スケジュール) のままにすることも、カスタマイズすることもできます。
- [Frequency] (頻度) で、スケジューラを実行する頻度を、分単位で選択します。例えば、5 分を選択できます。
注意: 頻度は、EventBridge が Instance Scheduler の Lambda 関数を再度開始するまでに経過する分数です。多数のインスタンスがある場合は、スロットリングを回避するためにできるだけ高い頻度を使用してください。ニーズに対して頻度が十分な高さでない場合は、後で [Frequency] (頻度) のプロパティを調整できます。 - [Enable CloudWatch Logs] (CloudWatch Logs を有効化) で、[Yes] (はい) を選択します。
- [Started] (開始済み) タグで、state=started と入力します。
- [Stopped] (停止済み) タグで、state=stopped と入力します。
- クロスアカウントスケジューリングで、[Cross-account roles] (クロスアカウントロール) パラメータを指定します。セカンダリアカウントのすべてのロールの ARN をカンマ区切りで入力します。クロスアカウントスケジューリングを使用していない場合は、パラメータを空白のままにします。
- その他のパラメータについては、必要に応じてスタックをカスタマイズします。
- [Next] (次へ) を選択します。
- [Options] (オプション) のページで、[Next] (次へ) を選択します。
- 設定を確認し、[I acknowledge that AWS CloudFormation might create IAM resources] (私は、AWS CloudFormation が IAM リソースを作成する可能性があることを認めます) を選択します。
- [Create] (作成) を選択します。
期間を作成する
期間を作成するには、Instance Scheduler CLI、DynamoDB コンソール、またはカスタムリソースを使用できます。期間の詳細については、「Start and stop times」(開始時刻と停止時刻) を参照してください。
以下の例は、次の条件でインスタンスを作成する方法を示しています。
- 月曜日から金曜日の午前 9 時に起動し、午後 5 時に停止する
- 土曜日の午前 9 時に起動し、正午に停止する
この例では、2 つの期間を作成する必要があります。独自のシナリオでは、適切な数の期間を作成します。
Instance Scheduler CLI を使用する
Instance Scheduler CLI に接続してから、次のコマンドを実行します。
$ scheduler-cli create-period --stack your_stack_name --region eu-west-1 --name mon-fri-9-5 --begintime 9:00 --endtime 16:59 --weekdays mon-fri
$ scheduler-cli create-period --stack your_stack_name --region eu-west-1 --name sat-9-12 --begintime 9:00 --endtime 11:59 --weekdays sat
注: your_stack_name をステップ 4 で選択したスタック名に置き換え、eu-west-1 をご自身のリージョンに置き換えます。
DynamoDB コンソールを使用する
- DynamoDB コンソールを開きます。
- [Tables] (テーブル) を選択してから、設定テーブルを選択します。
注: Instance Scheduler テンプレートは、ステートと設定の 2 つの DynamoDB テーブルを自動的に作成します。ステートテーブルには、テンプレートが停止および開始するインスタンスの状態が格納されます。設定テーブルでは、お客様の要件に合った期間とスケジュールを指定できます。 - [Explore Table Items] (テーブルの項目を探索) を選択します。
- [Create Item] (項目を作成) を選択します。
- JSON ビューを選択し、次の javascript object notation (JSON) テンプレートを使用します。
{
"type": {
"S": "period"
},
"name": {
"S": "mon-fri-9-5"
},
"begintime": {
"S": "9:00"
},
"endtime": {
"S": "16:59"
},
"weekdays": {
"SS": [
"mon-fri"
]
}
}
注意: 前述の JSON テンプレートは、最初の期間を作成します。2 番目の期間には、類似の JSON テンプレートを使用します。要件に合わせてテンプレートを編集してください。
スケジュールを作成する
スケジュールを作成するには、Instance Scheduler CLI、DynamoDB コンソール、またはカスタムリソースを使用できます。
Instance Scheduler CLI を使用する
次のコマンドを実行します。
$ scheduler-cli create-schedule --stack your_stack_name --name m-f9-5-sat9-12 --region eu-west-1 --periods mon-fri-9-5,sat-9-12 --timezone UTC
DynamoDB コンソールを使用する
- DynamoDB コンソールを開きます。
- [Tables] (テーブル) を選択してから、設定テーブルを選択します。
- [Explore Table Items] (テーブルの項目を探索) を選択します。
- [Create Item] (項目を作成) を選択します。
- [JSON] ビューを選択し、次の JSON テンプレートを使用します。
{
"type": {
"S": "schedule"
},
"name": {
"S": "m-f9-5-sat9-12"
},
"timezone": {
"S": "UTC"
},
"periods": {
"SS": [
"mon-fri-9-5"
]
}
}
インスタンスにタグを付け、スケジュールをテストする
Instance Scheduler で CloudFormation スタックを使用する場合は、Instance Scheduler TagName パラメータを定義する必要があります。このパラメータのデフォルト値は Schedule です。
Instance Scheduler は、インスタンスのタグをモニタリングします。インスタンスタグキーが定義されたスケジューラタグと一致する場合、Instance Scheduler は、インスタンスタグ値に設定されているスケジュールを適用します。例えば、タグのキーが [Schedule] (スケジュール) に設定され、値が m-f9-5-sat9-12 に設定されているとします。この例では、インスタンスは月曜日から金曜日の午前 9 時に起動し、午後 5 時に停止します。また、インスタンスは土曜日の午前 9 時に起動し、正午に停止します。
注: タグのキーと値では大文字と小文字が区別されます。Instance Scheduler は、実行中のインスタンスが実行期間外に手動で起動された場合、そのインスタンスを停止しません。また、Instance Scheduler は、実行期間中にインスタンスが手動で停止された場合、スケジュールが強制されない限り、インスタンスを起動しません。詳細については、「Schedule definitions」(スケジュールの定義) を参照してください。
定義済みスケジュールの使用
カスタムスケジュールのほかに、設定テーブルの定義済みスケジュールを使用することもできます。例えば、次の手順では、running という名前の事前定義されたスケジュールをテストします。
- Amazon EC2 コンソールを開きます。
- タグ付けする停止したインスタンスを選択します。
- [Tags] (タグ) ビューを選択し、[Manage Tags] (タグを管理) を選択します。
- [Add Tag] (タグを追加) を選択します。
- [Key] (キー) で、Schedule を入力します。
- [Value] (値) で、running を入力します。
- [Save] (保存) を選択します。
- Amazon EC2 コンソールを更新して、Lambda 関数が開始されるのを待ちます。
注: Lambda 関数が開始され、エラーなしで実行されると、テスト中のスケジュールに応じて、Instance State が running と表示されます。CloudWatch コンソールでは、 Lambda メトリクスの呼び出しやエラーをチェックできます。 - DynamoDB コンソールを開きます。
- [Tables] (テーブル) を選択して、ステートテーブルを選択します。
- [Explore Table Items] (テーブルの項目を探索) を選択し、タグ付けされたインスタンスが起動されていることを確認します。
注: ステートデータはステートテーブルに保存されます。
重要: 追加費用は、使用している Lambda 関数の頻度と継続時間に基づいて課金されます。また、作成した DynamoDB テーブルもしくは EventBridge ルールについても追加費用が課金されます。
クロスアカウントスケジューリングの場合: セカンダリアカウントでリモートスタックを起動する
Instance Scheduler を使用してセカンダリアカウントのインスタンスをスケジュールするには、aws-instance-scheduler-remote CloudFormation テンプレートをデプロイします。このテンプレートは、プライマリアカウントの Instance Scheduler がセカンダリアカウントのインスタンスを管理できるようにするロールを作成します。
注: プライマリアカウントの Instance Scheduler スタックのパラメータとして、ロールの ARN を指定する必要があります。Instance Scheduler スタックを正しいパラメータで作成または更新してください。
- セカンダリアカウントの AWS マネジメントコンソールを開き、aws-instance-scheduler-remote CloudFormation テンプレートを起動します。また、今後使用するためにテンプレートをダウンロードすることもできます。
注: テンプレートは、デフォルトで米国東部 (バージニア北部) リージョンで起動されます。 - ナビゲーションバーで、テンプレートを使用して、スタックを起動する AWS リージョンを選択してから、[Next] (次へ) を選択します。
- [Select Template] (テンプレートを選択) ページで、正しいテンプレートを選択したことを確認し、[Next] (次へ) を選択します。
- [Specify Details] (詳細を指定) ページで、リモートスタックに名前を割り当てます。
- [Parameters] (パラメータ) で、[Primary account] (プライマリアカウント) のパラメータを確認して変更します。プライマリアカウントのアカウント番号を入力します。
- [Next] (次へ) を選択します。
- [Options] (オプション) のページで、[Next] (次へ) を選択します。
- 設定を確認し、[I acknowledge that AWS CloudFormation might create IAM resources] (私は、AWS CloudFormation が IAM リソースを作成する可能性があることを認めます) を選択します。
- [Create] (作成) を選択します。
- スタックの [Outputs] (出力) タブを選択し、[CrossAccountRole] の値をコピーします。
- プライマリアカウントから CloudFormation スタックを選択し、[Update] (更新) を選択します。
- [Update stack] (スタックを更新) ページで、[Use current template] (現在のテンプレートを使用) を選択します。
- [Cross-account roles] (クロスアカウントロール) パラメータで、[CrossAccountRole] の値を貼り付けます。
- [Next] (次へ) を選択し、[I acknowledge that AWS CloudFormation might create IAM resources] (私は、AWS CloudFormation が IAM リソースを作成する可能性があることを認めます) を選択します。
- [Update Stack] (スタックを更新) を選択します。