Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
CloudFormation で Instance Scheduler を使用して EC2インスタンスをスケジュールする方法を教えてください。
AWS Instance Scheduler と AWS CloudFormation を使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスをスケジュールしたいと考えています。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
CloudFormation テンプレートを使用すると、AWS Instance Scheduler のデプロイを自動化できます。
注: 暗号化 Amazon Elastic Block Store (Amazon EBS) で EC2 インスタンスに Instance Scheduler を使用した場合、そのインスタンスは起動しません。キーユーザーロールがこのキーを使用するためには、キーポリシーを AWS Key Management Service (AWS KMS) キーに追加する必要があります。
Instance Scheduler をインストールする
Instance Scheduler をインストールします。次に、以下のコマンドを実行し、インストールが成功したことを確認します。
$ scheduler-cli --version
Instance Scheduler テンプレートを使用して CloudFormation スタックを作成する
AWS Lambda 関数、Amazon DynamoDB テーブル、Amazon EventBridge ルール、および Amazon CloudWatch カスタムメトリクスをデプロイするには、次の手順を実行します。
- AWS マネジメントコンソールを開きます。
- Instance Scheduler テンプレートを使用して CloudFormation コンソールを開きます。デフォルトでは、テンプレートは米国東部 (バージニア北部) リージョンで起動します。または、[ステップ 1.instance scheduler ハブスタックの起動] ページに移動し、[ソリューションを起動] を選択します。
テンプレートを使用してスタックを起動する AWS リージョンをナビゲーションバーから選択し、[次へ] を選択します。
[スタック名] でスタックに名前を入力します。
Instance Scheduler TagName でデフォルト値 Schedule を維持するか、カスタマイズします。
[頻度] では、スケジューラを実行する頻度を分単位で選択します。たとえば、「5 分」などと選択できます。
注: この頻度は、EventBridge が Instance Scheduler の Lambda 関数を再度開始するまでに経過する分単位の時間数です。多数のインスタンスがある場合は、スロットリングを回避するためにできるだけ高い頻度を使用してください。設定した頻度ではニーズを満たせない場合は、後で [頻度] プロパティを調整できます。
[CloudWatch メトリクスを有効化] で [はい] を選択します。
[CloudWatch ログを有効化] で [はい] を選択します。
(オプション) [Started タグ] に state=started と入力します。
(オプション) **[Stopped **タグ] に state=stopped と入力します。
クロスアカウントスケジュールを行う場合は、クロスアカウントロールのパラメータを指定します。セカンダリアカウントのすべてのロールの Amazon リソースネーム (ARN) を、カンマ区切りで入力します。クロスアカウントスケジュールを使用しない場合は、このパラメータを空のままにします。 - [次へ] を選択します。
- [オプション] ページで [次へ] を選択します。
- 設定を確認し、[AWS CloudFormation が IAM リソースを作成することを承諾します] を選択します。
- [作成] を選択します。
期間を作成する
期間の作成には、Instance Scheduler CLI、DynamoDB コンソール、またはカスタムリソースを使用できます。期間の詳細については、「開始時間と停止時間」を参照してください。
Instance Scheduler CLI を使用する
Instance Scheduler CLI に接続し、次の AWS CLI コマンド create-period を実行します。
$ scheduler-cli create-period --stack your_stack_name --region aa-example-1 --name mon-fri-9-5 --begintime 9:00 --endtime 16:59 --weekdays mon-fri $ scheduler-cli create-period --stack your_stack_name --region aa-example-1 --name sat-9-12 --begintime 9:00 --endtime 11:59 --weekdays sat
**注:**your_stack_name をステップ 2 で選択したスタック名に、aa-example-1 を該当するリージョンに置き換えてください。
DynamoDB コンソールを使用する
期間を作成するには、次の手順を実行します。
- DynamoDB コンソールを開きます。
- [テーブル] を選択し、設定テーブルを選択します。
注: Instance Scheduler テンプレートにより、2 つの DynamoDB テーブル (状態テーブル、設定テーブル) が自動で作成されます。状態テーブルには、テンプレートが停止、起動するインスタンスの状態が格納されます。設定テーブルでは、要件に応じて期間とスケジュールを指定できます。 - [テーブルアイテムの探索] を選択します。
- [項目を作成] を選択します。
- [JSON] ビューを選択し、次の JSON テンプレートを使用します。
注: 上記の JSON テンプレートで最初の期間を作成します。2 番目の期間にも、類似の JSON テンプレートを使用します。実際のケースに合わせて mon-fri-9-5 を期間名に、9:00 を開始時間に、16:59 を終了時間に置き換えてください。{ "type": { "S": "period" }, "name": { "S": "mon-fri-9-5" }, "begintime": { "S": "9:00" }, "endtime": { "S": "16:59" }, "weekdays": { "SS": [ "mon-fri" ] } }
スケジュールを作成する
スケジュールの作成には、Instance Scheduler CLI、DynamoDB コンソール、またはカスタムリソースを使用できます。
Instance Scheduler CLI を使用する
スケジュールを作成するには、次の CLI コマンド create-schedule を実行します。
$ scheduler-cli create-schedule --stack your_stack_name --name m-f9-5-sat9-12 --region aa-example-1 --periods mon-fri-9-5,sat-9-12 --timezone UTC
注: your_stack_name をスタック名に、aa-example-1 をリージョンに、mon-fri-9-5,sat-9-12 を実際のスケジュールに置き換えてください。
DynamoDB コンソールを使用する
スケジュールを作成するには、次の手順を実行します。
- DynamoDB コンソールを開きます。
- [テーブル] を選択し、設定テーブルを選択します。
- [テーブルアイテムの探索] を選択します。
- [項目を作成] を選択します。
- [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 はそのインスタンスを起動しません。詳細については、「スケジュールの定義」を参照してください。
事前定義スケジュールを使用する
カスタムスケジュールおよび、設定テーブルの事前定義スケジュールを併用することもできます。次の手順では、running という事前定義スケジュールをテストします。
- Amazon EC2 コンソールを開きます。
- タグ付けする停止中のインスタンスを選択します。
- [タグ] ビューを選択し、[タグの管理] を選択します。
- [タグを追加] を選択します。
- [キー] に「Schedule」と入力します。
- [値] に「running」と入力します。
- [保存] を選択します。
- Amazon EC2 コンソールを更新し、Lambda 関数が起動するまで待機します。
注: Lambda 関数が起動し、エラーが起こらず実行した場合は、[インスタンスの状態] は running と表示されます。表示内容は、テストするスケジュールによって異なります。CloudWatch コンソールで CloudWatch メトリクスを参照すると、Lambda 呼び出しおよびエラーの有無を確認できます。 - DynamoDB コンソールを開きます。
- [テーブル] を選択し、状態テーブルを選択します。
- [テーブルアイテムの探索] を選択し、タグ付けされたインスタンスが起動したことを確認します。
重要: 使用する Lambda 関数の頻度と期間に基づき、追加費用が発生する場合があります。作成した DynamoDB テーブルまたは EventBridge ルールに対しても、追加コストが発生する場合があります。
クロスアカウントスケジュール
Instance Scheduler を使用してセカンダリアカウントのインスタンスをスケジュールするには、CloudFormation テンプレート aws-instance-scheduler-remote をデプロイします。このテンプレートが作成するロールを使用すると、プライマリアカウントの Instance Scheduler がセカンダリアカウントのインスタンスを管理できます。
注: プライマリアカウントの Instance Scheduler スタックのパラメータとして、ロールの ARN を指定する必要があります。Instance Scheduler スタックを作成または更新するのに、正しいパラメータを指定したことを確認してください。
セカンダリアカウントでリモートスタックを起動するには、次の手順を実行します。
-
セカンダリアカウントで AWS マネジメントコンソールを開き、CloudFormation テンプレート aws-instance-scheduler-remote を起動します。後で使用するために、テンプレートをダウンロードしてもかまいません。
注: デフォルトでは、テンプレートは米国東部 (バージニア北部) リージョンで起動します。
-
テンプレートを使用してスタックを起動するリージョンをナビゲーションバーから選択し、[次へ] を選択します。
-
[テンプレートを選択] ページで正しいテンプレートを選択したかどうかを確認し、[次へ] を選択します。
-
[詳細を指定] ページで、リモートスタックに名前を割り当てます。
-
[パラメータ] でプライマリアカウントのパラメータを確認、変更します。プライマリアカウントのアカウント番号を入力します。
-
[次へ] を選択します。
-
[オプション] ページで [次へ] を選択します。
-
設定を確認し、[AWS CloudFormation が IAM リソースを作成することを承諾します] を選択します。
-
[作成] を選択します。
-
スタックの [出力] タブを選択し、CrossAccountRole の値をコピーします。
-
プライマリアカウントで CloudFormation スタックを選択し、[更新] を選択します。
-
[スタックの更新] ページで [現在のテンプレートを使用] を選択します。
-
[クロスアカウントロール] パラメータに CrossAccountRole 値を貼り付けます。
-
[次へ] を選択し、[AWS CloudFormation が IAM リソースを作成することを承諾します] を選択します。
-
[スタックの更新] を選択します。
- 言語
- 日本語

