CloudFormation を使用して、事前に定義された時間にインスタンスを停止および開始するにはどうすればよいですか?

最終更新日: 2021 年 8 月 16 日

事前に設定した時間にインスタンスを停止および起動することで、Amazon Elastic Compute Cloud (Amazon EC2) の使用量を削減したいと考えています。

簡単な説明

AWS Instance Scheduler と自動化した AWS CloudFormation テンプレートを使用して、スケジュールに基づいたインスタンスを停止および開始できます。詳細については、「自動デプロイ」を参照してください。

重要: 暗号化された Amazon Elastic Block Store (Amazon EBS) を使用する EC2 インスタンスで Instance Scheduler を使用している場合、インスタンスは起動できません。インスタンスを起動するには、EBS ボリュームを暗号化または復号するためのキーポリシーを含むキーユーザーロールを、Instance Scheduler に付与する必要があります。キーユーザーロールがこのキーを使用できるよう、AWS Key Management Service (AWS KMS) キーにキーポリシーを追加する必要があります。

解決方法

開始する前に、Instance Scheduler コマンドラインインターフェイス (CLI) をセットアップします

Instance Scheduler テンプレートを使用して、CloudFormation スタックを作成する

スタックは AWS Lambda 関数、Amazon DynamoDB テーブル、Amazon CloudWatch Events のイベント、および Amazon CloudWatch カスタムメトリクスをデプロイします。

1.    AWS マネジメントコンソールを開きます。

2.    Instance Scheduler テンプレートで CloudFormation を開きます。あるいは、ステップ 1 に進みます。[Launch the instance scheduler stack] (インスタンススケジューラスタックの起動) ページに移動し、[Launch Solution] (ソリューションの起動) を選択します。

注: テンプレートはデフォルトでバージニア北部で起動されます。

3.    ナビゲーションバーで、テンプレートを使用して、スタックを起動する AWS リージョンを選択してから、[Next] (次へ) を選択します。

4.    [Stack name] に、「Ec2instanceScheduler」と入力します。

5.    [Frequency] で、スケジューラを実行する頻度を、分単位で選択します。例: 5 分

注: 頻度は、Amazon CloudWatch Events が Instance Scheduler の Lambda 関数を再度トリガーするまでの経過時間 (分) です。多数のインスタンスがある場合は、スロットリングを回避するためにできるだけ高い頻度を使用してください。ニーズに対して頻度が十分な高さでない場合は、後で [Frequency] (頻度) のプロパティを調整できます。

6.    [Enable CloudWatch Logs] で [Yes] を選択します。

7.    [Started tags] で、「state=started」と入力します。

8.    [Stopped tags] で、「state=stopped」と入力します。

9.    [次へ] を選択します。

10.    [Options] (オプション) のページで、[Next] (次へ) を選択します。

11.    設定を確認し、「I acknowledge that AWS CloudFormation might create IAM resources」を選択します。

12.    [作成] を選択します。

スケジュールに基づいてインスタンスを起動する期間を作成する

1.    期間を作成するには、Instance Scheduler CLI に接続してから、次のコマンドを実行します。

$ scheduler-cli create-period --stack Ec2instanceScheduler --region us-west-2 --name firstdayofmonth --begintime 06:00 --endtime 07:00 --monthdays 1

注: us-west-2 をお客様自身のリージョンに置き換えます。期間を作成するには、DynamoDB コンソールまたはカスタムリソースを使用することもできます。期間の詳細については、開始時刻と停止時刻を参照してください。

2.    DynamoDB コンソールを開きます。

3.    [Tables] をクリックしてから、設定テーブルを選択します。

注: Instance Scheduler テンプレートは、ステートと設定の 2 つの DynamoDB テーブルを自動的に作成します。ステートテーブルは、テンプレートによって停止および開始されたインスタンスのステートを格納します。設定テーブルでは、お客様の要件に合った期間とスケジュールを指定します。

4.    [Items] ビューを選択し、テーブルに firstdayofmonth の期間が表示されていることを確認します。

期間のスケジュールを作成する

1.    スケジュールを作成するには、Instance Scheduler CLI に接続し、次のコマンドを実行します。

$ scheduler-cli create-schedule --stack Ec2instanceScheduler --name dayone --region us-west-2 --periods firstdayofmonth --timezone UTC

2.    DynamoDB コンソールを開きます。

3.    [Tables] をクリックしてから、設定テーブルを選択します。

4.    [Items] ビューを選択し、dayone のスケジュールが設定テーブルに表示されていることを確認します。

スケジュールをタグ付けおよびテストする

Instance Scheduler で CloudFormation スタックを使用する場合は、Instance Scheduler の tagname パラメータを定義する必要があります。このパラメータのデフォルト値は Schedule です。スタックで tagname パラメータを使用して、Schedule の値を調べることができます。

注: Instance Scheduler は、インスタンスのタグを監視します。インスタンスタグキーが定義されたスケジューラタグと一致する場合、Instance Scheduler は、インスタンスタグ値に設定されているスケジュールを適用します。例えば、タグのキーが Schedule に設定され、値が firstdayofmonth に設定されている場合、firstdayofmonth スケジュールがインスタンスに適用されます。

次の手順では、停止したインスタンスで実行されている定義済みのスケジュールをテストします。設定テーブルには、定義済みの running という名前のスケジュールがあります。Instance Scheduler は、停止したインスタンスに running スケジュールを適用すると、インスタンスを起動します。

注: 事前に定義された running スケジュールをテストできるように、テストするインスタンスを停止します。

1.    Amazon EC2 コンソールを開きます。

2.    タグ付けする停止したインスタンスを選択します。

3.    [Tags] ビューを選択し、 [Add/Edit Tags] を選択します。

4.    [Create Tag] を選択します。

5.    [キー] に、「State」と入力します。

6.    [Value] に「running」と入力します。

7.    [Save] を選択します。

8.    Amazon EC2 コンソールを更新して、Lambda 関数がトリガーされるのを待ちます。

注意: Lambda 関数がトリガーされ、エラーなしで実行されると、テスト中のスケジュールに応じて、Instance Staterunning と表示されます。CloudWatch コンソールでは、 Lambda メトリクスの呼び出しやエラーをチェックできます。

9.    DynamoDB コンソールを開きます。

10.    [Tables] をクリックして、ステートテーブルを選択します。

11.    [Items] ビューを選択し、タグ付けされたインスタンスが起動することを確認します。

注: ステートデータはステートテーブルに保存されます。

重要: 追加費用は、使用している Lambda 関数の頻度と継続時間に基づいて課金されます。また、作成した DynamoDB テーブルもしくは CloudWatch Events ルールについても追加費用が課金されます。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?