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

所要時間3分
0

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

簡単な説明

CloudFormation テンプレートを使用して、AWS インスタンススケジューラデプロイを自動化します。

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

解決方法

インスタンススケジューラをインストールする

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

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

$ scheduler-cli --version

インスタンススケジューラテンプレートを使用して CloudFormation スタックを作成する

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

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

期間を作成する

期間を作成するには、インスタンススケジューラ CLI、DynamoDB コンソール、またはカスタムリソースを使用できます。期間の詳細については、「開始時刻と停止時刻」を参照してください。

以下は、次のようなインスタンスを作成する方法の例です。

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

この例では、期間を 2 つ作成する必要があります。シナリオに合わせて、適切な数の期間を作成します。

インスタンススケジューラ CLI を使用する

インスタンススケジューラ 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

注:****_stack_name をステップ 4 で選択したスタック名に、eu-west-1 を自身のリージョンに置き換えます。
DynamoDB コンソールを使用する

  1. DynamoDB コンソールを開きます。
  2. [テーブル] を選択し、構成テーブルを選択します。
    注: インスタンススケジューラテンプレートは、状態と構成の 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 テンプレートを使用してください。要件に合わせてテンプレートを編集してください。

スケジュールを作成する

スケジュールを作成するには、インスタンススケジューラ CLI、DynamoDB コンソール、またはカスタムリソースを使用することができます。

インスタンススケジューラ 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 スタックをインスタンススケジューラで使用する場合は、インスタンススケジューラの TagName パラメータを定義する必要があります。このパラメータのデフォルト値は Schedule です。

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

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

定義したスケジュールを使用する

カスタムスケジュールに加えて、構成テーブルで定義したスケジュールのいずれかを使用することもできます。たとえば、次の手順では、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 ルールに対して追加費用が請求される場合もあります。

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

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

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

  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年前
コメントはありません

関連するコンテンツ