EventBridgeスケジューラーとSystems Managerオートメーションを用いたEC2/RDSインスタンスの自動停止設定

記事タイトルとURLをコピーする

こんにちは!
エンタープライズクラウド部ソリューションアーキテクト課の足達です。

本ブログでは、EC2やRDSの自動停止設定をAWSサービスのみで実装する方法についてご紹介します。

はじめに

私事ではありますが、最近、ANGEL Dojo 2025というものに参加させていただいていました。
いわゆる、ハッカソン的なもので、3ヶ月でアプリケーションの企画から開発までを行うというものでした。

実は、今回テーマに挙げている自動停止(起動)設定は、弊社が提供しているサービスの一つであるCloudAutomatorを使用することで、容易に実装することが可能です。
しかし、ANGEL Dojoで使用したアカウントは、CloudAutomatorを契約をしているものではなかったため、AWSサービスのみで自動停止設定を施す必要がありました。

複数のAWSサービスを組み合わせる箇所が少し複雑に感じましたので、今回はその解説も含めながら手順をご紹介させていただこうと思います。

今回実施すること

任意のタグが付いているEC2を毎日22時に自動停止する」これが今回実施する内容になります。
あくまで自動化設定の一例についての説明となりますが、自動起動設定やRDSの設定にも応用可能ですので、ぜひ最後までご覧ください。

自動停止設定に使用するAWSサービス

今回の設定に関わってくるサービスは、以下の3つです。

  • EventBridgeスケジューラー
  • Systems Managerオートメーション
  • IAMロール

一つ頭の片隅においていただきたいのは、この他にも、「EventBridgeからLambdaを呼び出す方法」 や「EventBridgeから直接EC2のAPIを呼び出す方法」など、さまざまなやり方が選択肢として存在するということです。
それぞれにメリットやデメリットはあるのですが、今回のようにインスタンス単体指定ではなく「タグ指定」で設定を実装したい場合には、こちらでご紹介する方法をおすすめします。

設定の全体像


こちらが、今回実施する設定の全体像となります。
少しややこしいポイントとして、Systems Managerオートメーション(以下、SSMオートメーション)があります。

SSMオートメーションの実態は「ドキュメント」と呼ばれる、自動化したい指示の塊です。
このドキュメントには、AWSによって元々用意されているものと、自分で作成するものが存在します。

AWSによって元々用意されているドキュメントの中には、既にEC2やRDSの自動停止、自動起動を行うためのものはあるのですが、これらは、インスタンスIDを指定して動作する(つまり単体のインスタンスのみに適用される)ものとなっており、タグ指定ができません。

そこで、ドキュメントを新たに一つ、自分で作成してあげる必要があります。
このドキュメントでは、「特定のタグが付いているEC2のインスタンスIDを使用して、AWS管理のEC2自動停止用オートメーションを呼び出す」という指示をします。
これによって、あとは対象のEC2にタグを指定するだけでオートメーション設定の対象とすることができるようになります。

あとの部分については、EventBridgeやSSMオートメーションに適切な権限をつけてあげたり、作成したオートメーション(ドキュメント)を任意の時間に呼び出すようにEventBridgeスケジューラーを設定してあげたりするだけとなっており、あまり難易度は高くないかと思いますので、ご安心ください。

設定方法

それでは、ここからは実際の設定方法を見ていきましょう。
設定は、以下のステップで実施します。

  1. IAMポリシー・IAMロールの作成
  2. SSMオートメーション用ドキュメントの作成
  3. EventBridgeスケジューラーの設定

1. IAMポリシー・IAMロールの作成


IAMロールは2種類作成します。
1つ目は、EventBridgeがSSMオートメーションを実行するためのロール、
2つ目は、SSMオートメーションがEC2・RDSを操作(起動/停止)するためのロールです。

EventBridge用IAMロール

まず、以下の内容でカスタマーマネージドポリシーを事前に作成します。
これは、SSMオートメーションを実行するための権限となります。
ポリシー名は任意の値を設定してください。

【許可ポリシー】

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ssm:StartAutomationExecution",
            "Resource": "*"
        }
    ]
}

次に、IAMロールを作成します。
カスタム信頼ポリシーとして、以下を設定します。

【信頼ポリシー】

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

そして、先ほど作成したポリシーをアタッチすれば1つ目は完成です。

SSMオートメーション用IAMロール

EC2の停止操作については、AWSマネージドポリシーのみで十分なため、事前のポリシー作成は不要です。
IAMロールを以下のように作成します。

カスタム信頼ポリシーとして、以下を設定します。(IAMロール作成時に「信頼されたエンティティを選択 > AWSのサービス > サービスまたはユースケース」で「Systems Manager」を指定することでも設定可能です)

【信頼ポリシー】

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ssm.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}


次に、以下のAWSマネージドポリシーをアタッチします。

  • AmazonSSMAutomationRole(SSMオートメーションがEC2を操作できるようにする権限)
  • ResourceGroupsandTagEditorReadOnlyAccess(タグを読み込むための権限)


※RDSの停止を行いたい場合は、以下のカスタマーマネージドポリシーを作成のうえ、アタッチしてください。 (「AmazonSSMAutomationRole」にはRDSを操作する権限は含まれていないため、必要なアクションを許可するポリシーを別途作成・アタッチする必要があります。また、以下はあくまでDBを停止する場合の例のため、起動やその他の操作を行いたい場合は、用途に応じたアクションを設定してください。)

【許可ポリシー】

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "rds:StopDBInstance",
                "rds:DescribeDBInstances"
            ],
            "Resource": "*"
        }
    ]
}

こちらでIAMロールの作成は完了です。

2. SSMオートメーション用ドキュメントの作成


SSMオートメーションを実行するためのSSMドキュメントを新規で作成していきます。

まず、Systems Managerコンソールへ移動します。
画面左のナビゲーションペインより、「ドキュメント」を選択してください。

「ドキュメントの作成」をクリックすると、選択肢が表示されますので、「オートメーション」を選択します。

最初に表示される画面では、自動化したい動作を視覚的に定義できるのですが、今回は既に実装したいコードを用意しているため、画面上部から「コード」を選択していきます。

以下の内容を入力し「ランブックを作成」を選択すれば完了です。

※左上の「NewRunbook」となっている箇所はドキュメント名となりますので、任意の値に変更してください。
※「<SSMオートメーション用IAMロールのARN>」には、先ほど作成したSSMオートメーション用IAMロールのARNを記載してください。

【SSMドキュメント】

description: Stop EC2 instances
schemaVersion: '0.3'
assumeRole: <SSMオートメーション用IAMロールのARN>
mainSteps:
  - name: StopEC2Instances
    action: aws:executeAwsApi
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StopEC2Instance
      TargetParameterName: InstanceId
      Targets:
        - Key: 'tag:Automation-Stop'
          Values:
            - 'ON'

全体の流れでも軽く触れましたが、SSMオートメーションでは「AWS-StopEC2Instance」というEC2を停止させるためのドキュメントが既に用意されています。
上記で作成しているドキュメントは、その「AWS-StopEC2Instance」を呼び出して実行するというものになっています。
「Targets」にて、EC2に付与する任意のタグ情報を記載することで、「そのタグが付与されているEC2のInstanceIDを用いてAWS-StopEC2Instanceを実行する」というような挙動になります。

タグについては、今回例として「Key=Automation-Stop, Value=ON」としていますが、お好みの値に変更いただいて問題ありません。

「DocumentName」の箇所に呼び出したいSSMドキュメントを記載しているだけなので、「AWS Systems Manager > ドキュメント > Amazonが所有」より任意のドキュメント名を探して記載いただければ、EC2の起動や再起動、RDSの操作にも応用が可能です。

3. EventBridgeスケジューラーの設定


最後にEventBridgeスケジューラーを設定して、上記のSSMオートメーションを任意のスケジュールで実行できるようにします。

まず、EventBridgeコンソールへ移動します。
画面左のナビゲーションペインより、「スケジュール」を選択してください。(余談ですが、検索バーから直接「Amazon EventBridge Scheduler」コンソールへ遷移することも可能です)

「スケジュールを作成」を選択します。

任意のスケジュール名を指定のうえ、スケジュールパターンは以下のように設定し、「次へ」を選択します。

  • 頻度:定期的なスケジュール
  • タイムゾーン:(UTC+09:00) Asia/Tokyo
  • スケジュールの種類:cronベースのスケジュール
  • cron式:cron( 0 22 ? * * * )
  • フレックスタイムウィンドウ:15分


※cron式の詳細な指定方法については、以下の公式ドキュメントをご参照ください。

https://docs.aws.amazon.com/ja_jp/EventBridge/latest/userguide/eb-scheduled-rule-pattern.htmldocs.aws.amazon.com

ターゲットの選択では、「すべてのAPI」より「Systems Manager > StartAutomationExecution」を選択し、「StartAutomationExecution」にて以下を設定のうえ、「次へ」を選択してください。

{
  "DocumentName": "<手順2で作成したドキュメント名>"
}


設定では、任意の設定を指定することができます。
今回は、基本デフォルトのままとし、「アクセス許可」の部分のみ手順1で作成した「EventBridge用IAMロール」を選択するようにします。

最後に確認画面が表示されるので、「スケジュールを作成」を選択すればすべての工程が完了です。

さいごに

いかがだったでしょうか?

冒頭で申し上げたとおり、弊社が提供しているCloudAutomatorでは、上記のような自動化設定を簡単かつ統一されたUI操作で実装することができます。
また、インスタンスの自動起動/停止だけでなく、さまざまな運用タスク自動化ができるものとなっておりますので、ご興味のある方はぜひ以下のサイトにも足を運んでみてください。
とはいえ、「サクッと手持ちの環境で実装したい」というような場合には上記の方法は大変有効かと思いますので、ぜひ参考にしていただけますと幸いです!

cloudautomator.com

足達 巧 (記事一覧)

エンタープライズクラウド部・ソリューションアーキテクト課
23年新卒入社 / AWS認定13冠