CloudFormation で Instance Scheduler を使用して EC2インスタンスをスケジュールする方法を教えてください。

所要時間3分
0

AWS Instance Scheduler と AWS CloudFormation を使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスをスケジュールしたいと考えています。

簡単な説明

CloudFormation テンプレートを使用して、AWS Instance Schedulerデプロイを自動化します。

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

解決策

Instance Scheduler をインストールする

まだインストールしていない場合は、指示に従って Instance Scheduler のコマンドラインインターフェイス (CLI) をインストールします。

インストールが成功したことを確認するには、以下のコマンドを実行します。

$ scheduler-cli --version

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

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

  1. AWS マネジメントコンソールを開きます。
  2. Instance Scheduler テンプレートを使用して CloudFormation を開きます。または、「Step 1.Launch the instance scheduler hub stack」ページに移動し、[ソリューションを起動] を選択します。
    注: このテンプレートは、デフォルトで米国東部 (バージニア北部) リージョンで起動されます。
  3. ナビゲーションバーで、テンプレートを使用してスタックを起動する AWS リージョンを選択し、[次へ] を選択します。
  4. [スタック名] で、スタックに名前を付けます。
  5. [Instance Scheduler TagName] では、デフォルト値を [スケジュール] のままにすることも、カスタマイズすることもできます。
  6. [頻度] で、スケジューラを実行する頻度を分単位で選択します。たとえば、「5 分」などと選択できます。
    注: この頻度は、EventBridge が Instance Scheduler の Lambda 関数を再度開始するまでに経過する分単位の時間数です。多数のインスタンスがある場合は、スロットリングを回避するためにできるだけ高い頻度を使用してください。頻度がニーズに合わない場合は、後で [頻度] プロパティを調整できます。
  7. [CloudWatch メトリクスを有効にする][はい] を選択します。
  8. [CloudWatch ログを有効化][はい] を選択します。
  9. (オプション) [開始タグ] に、state=started と入力します。
  10. (オプション) [停止****タグ] に、state=stopped と入力します。
  11. クロスアカウントスケジューリングの場合は、クロスアカウントロールパラメータを指定します。セカンダリアカウントのすべてのロールの ARN をカンマ区切りで入力します。クロスアカウントスケジューリングを使用していない場合は、パラメータを空のままにします。
  12. その他のパラメータについては、必要に応じてスタックをカスタマイズします。
  13. [次へ] を選択します。
  14. [オプション] ページで [次へ] を選択します。
  15. 設定を確認し、[AWS CloudFormation が IAM リソースを作成する可能性があることを認めます] を選択します。
  16. [作成] を選択します。

期間を作成する

期間を作成するには、Instance Scheduler CLI、DynamoDB コンソール、またはカスタムリソースを使用できます。期間の詳細については、「Start and stop times」を参照してください。

以下の例は、次の条件でインスタンスを作成する方法を示しています。

  • 月曜日から金曜日の午前9時に開始し、午後5時に停止する
  • 土曜日の午前9時に開始し、午後12時に停止する

この例では、期間を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 コンソールを使用する

  1. DynamoDB コンソールを開きます。
  2. [テーブル] を選択し、設定テーブルを選択します。
    注: Instance Scheduler テンプレートは、ステートと設定の2つの DynamoDB テーブルを自動的に作成します。ステートテーブルには、テンプレートが停止および開始するインスタンスの状態が格納されます。設定テーブルでは、要件に合わせて期間とスケジュールを指定できます。
  3. [テーブルアイテムの検索] を選択します。
  4. [項目を作成] を選択します。
  5. [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 コンソールを使用する

  1. DynamoDB コンソールを開きます。
  2. [テーブル] を選択し、設定テーブルを選択します。
  3. [テーブルアイテムの検索] を選択します。
  4. [項目を****作成] を選択します。
  5. [JSON] ビューを選択し、次の JSON テンプレートを使用します。
{  
  "type": {  
    "S": "schedule"  
  },  
  "name": {  
    "S": "m-f9-5-sat9-12"  
  },  
  "timezone": {  
    "S": "UTC"  
  },  
  "periods": {  
    "SS": \[  
      "mon-fri-9-5"  
    \]  
  }  
}

インスタンスにタグを付けてスケジュールをテストする

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

Instance Scheduler はインスタンス上のタグを監視します。インスタンスタグキーが、定義されたスケジューラタグと一致する場合、Instance Scheduler はインスタンスタグ値に設定されているスケジュールを適用します。たとえば、タグのキースケジュールに設定され、m-f9-5-sat9-12 に設定されているとします。この例では、インスタンスは月曜日から金曜日の午前9時に開始し、午後5時に停止します。また、インスタンスは土曜日の午前9時に開始し、正午に停止します。

注: タグのキーは大文字と小文字が区別されます。Instance Scheduler は、実行期間外に手動でインスタンスを起動したとしても、実行中のインスタンスを停止することはありません。また、実行期間中にインスタンスが手動で停止された場合、スケジュールが強制的に適用されない限り、Instance Scheduler はインスタンスを起動しません。詳細については、「Schedule definitions」を参照してください。

定義済みスケジュールを使用する

カスタムスケジュールに加えて、設定テーブルの定義済みスケジュールを使用することもできます。例として、次の手順で running という名前の定義済みスケジュールをテストします。

  1. Amazon EC2コンソールを開きます。
  2. タグ付けする停止中のインスタンスを選択します。
  3. [タグ] ビューを選択し、[タグの管理] を選択します。
  4. [タグを追加] を選択します。
  5. [キー] に「Schedule」と入力します。
  6. [値] に「running」と入力します。
  7. [保存] を選択します。
  8. Amazon EC2コンソールを更新し、Lambda 関数が開始されるのを待ちます。
    注: Lambda 関数が開始され、エラーなく実行されると、テストしているスケジュールに応じて [インスタンスの状態] には「実行中」と表示されます。CloudWatch コンソールで、呼び出しとエラーの Lambda メトリクスを確認できます。
  9. DynamoDB コンソールを開きます。
  10. [テーブル] を選択し、ステートテーブルを選択します。
  11. [テーブルアイテムの探索] を選択し、タグ付けされたインスタンスが起動していることを確認します。ステートデータはステートテーブルに格納されます。
    重要: 使用している Lambda 関数の頻度と期間に基づいて追加費用が請求される場合があります。また、作成した DynamoDB テーブルまたは EventBridge ルールに対して追加費用が請求される場合もあります。

クロスアカウントスケジューリングの場合: セカンダリアカウントでリモートスタックを起動する

Instance Scheduler を使用してセカンダリアカウントのインスタンスをスケジュールするには、aws-instance-scheduler-remote CloudFormation テンプレートをデプロイします。このテンプレートは、プライマリアカウントの Instance Scheduler がセカンダリアカウントのインスタンスを管理できるようにするロールを作成します。

注: プライマリアカウントの Instance Scheduler スタックのパラメータとして、ロールの ARN を指定する必要があります。Instance Scheduler スタックを正しいパラメータで作成または更新してください。

  1. セカンダリアカウントの AWS マネジメントコンソールを開き、aws-instance-scheduler-remote CloudFormation テンプレートを起動します。後で使用するためにテンプレートをダウンロードすることもできます。
    注: このテンプレートは、デフォルトで米国東部 (バージニア北部) リージョンで起動されます。
  2. ナビゲーションバーで、テンプレートを使用してスタックを起動する AWS リージョンを選択し、[次へ] を選択します。
  3. [テンプレートを選択] ページで、正しいテンプレートが選択されているかを確認し、[次へ] を選択します。
  4. [詳細を指定] ページで、リモートスタックに名前を割り当てます。
  5. [パラメータ] で、[プライマリアカウント] パラメータを確認して変更します。プライマリアカウントのアカウント番号を入力します。
  6. [次へ] を選択します。
  7. [オプション] ページで [次へ] を選択します。
  8. 設定を確認し、[AWS CloudFormation が IAM リソースを作成する可能性があることを認めます] を選択します。
  9. [作成] を選択します。
  10. スタックの [出力] タブを選択し、CrossAccountRole の値をコピーします。
  11. プライマリアカウントから CloudFormation スタックを選択し、[更新] を選択します。
  12. [スタックの更新] ページで、[現在のテンプレートの使用] を選択します。
  13. [クロスアカウントロール] パラメータに、CrossAccountRole 値を貼り付けます。
  14. [次へ] を選択し、[AWS CloudFormation が IAM リソースを作成する可能性があることを認めます] を選択します。
  15. [スタックの更新] を選択します。
AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ