【ノーコード】EventBridge SchedulerでSSMオートメーションを定期実行する

2023.11.09
【ノーコード】EventBridge SchedulerでSSMオートメーションを定期実行する
この記事をシェアする

この記事では、EventBridge SchedulerとSSMオートメーションを使って、EC2の再起動を自動化します。SSMオートメーションを使うことで、ノーコードで自動化が可能です。

はじめに

毎日、特定のタグが付いたEC2を再起動する……というようなメンテナンスを自動化したい場面はよくあります。こういったときに、メンテナンス処理をLambdaでコーディングしている方もいらっしゃるのではないでしょうか。

そのようなメンテナンス作業は、ぜひSSMオートメーションを使って、コードを書かずに自動化しましょう。

Systems Managerオートメーション(SSMオートメーション)とは

Systems Managerオートメーション(SSMオートメーション)は、Systems Managerの機能のひとつで、AWSリソースのメンテナンスを自動化するためのサービスです。

特に推したいポイントは、よくある運用操作が事前定義されていて、ノーコードで実行できるところです。たとえば、特定のタグが付いたEC2を再起動するとか、AMIを取得するとか、Lambdaで書けば数行だけど、数行のためにわざわざLambda作りたくないな……というときに便利だなと思っています。

EventBridge Schedulerとは

EventBridge Schedulerは、AWSサービスの定期実行に特化したスケジューラです。提供開始されたのが2022年11月で、比較的新しいサービスです。

従来のEventBridgeルールと似ているのですが、違う点のひとつとしてAWSサービスのAPIをそのまま叩けるので、シンプルかつフレキシブルな構成が可能です。

まとめ

EventBridge SchedulerとSSMオートメーションで、EC2の再起動を自動化できます。

作成するリソースは、IAMロールと、EventBridge Schedulerだけで、コードは記述せず、ノーコードで実現できました。

今回はメンテナンス作業の一例として、特定のタグが付いたEC2の再起動の方法を紹介しますが、他にもAMIの作成なども可能です。

構成

作成するリソースは下記の通り。

  • SSMオートメーション用のIAMロール
  • EventBridge Scheduler用のIAMロール
  • EventBridge Schedulerのスケジュール

SSMオートメーションのランブックについては、AWSマネージドな事前定義されたランブックを使用するので、構築は不要です。

手順

マネジメントコンソールで作成していきます。

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

まず、信頼ポリシーの設定です。AWSのサービスを選択し、Systems Managerを選択すると、必要な信頼ポリシーが自動生成されます。

次に、ポリシーの設定画面になりますが、今回は簡単のためにインラインポリシーを設定するので、ここでは一旦何も選択せず、次の画面に行きます。

次に、ロールの名前を「role-for-automation」にして、ロールを作成します。

作成後に、ロールにインラインポリシーを追加しましょう。ポリシーの名前はなんでもOKです。ここには、オートメーションの内容に応じた権限設定が必要です。EC2の再起動の場合、EC2の起動・停止・読み取り権限です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowRestartEc2Instance",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "*"
        }
    ]
}

EventBridge Scheduler用のIAMロール

まず、信頼ポリシーの設定です。カスタム信頼ポリシーを選択して、自分でJSONを記述します。内容はEventBridge Schedulerサービスを許可する権限です。

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

次のポリシー画面は、SSMオートメーション用のIAMロールと同様に何も選択せず、次の画面に行きます。

次に、ロールの名前を「role-for-scheduler」にして、ロールを作成します。

作成後に、ロールにインラインポリシーを追加しましょう。ポリシーの名前はなんでもOKです。内容は、上からオートメーションの実行権限、ロールの付与権限、タグ情報の読み取り権限です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowStartAutomationExecution",
            "Effect": "Allow",
            "Action": "ssm:StartAutomationExecution",
            "Resource": "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-RestartEC2Instance:$DEFAULT"
        },
        {
            "Sid": "AllowPassRole",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::<account-id>:role/role-for-automation"
        },
        {
            "Sid": "AllowReadTag",
            "Effect": "Allow",
            "Action": [
                "tag:getResources"
            ],
            "Resource": "*"
        }
    ]
}

EventBridge Schedulerのスケジュール

まず、スケジュールの名前と、時刻設定をします。名前はなんでもOKです。

時刻設定は、一回限りのスケジュールと定期的なスケジュールを選択でき、定期的なスケジュールの場合、cronベースとrateベースで選べます。今回は、cronベースで、1日1回00:00に実行してみましょう。

次に実行するAWS APIと入力ペイロードを選択、作成します。Systems ManagerのStartAutomationExecutionを選択します。

入力ペイロードは下記のように設定します。

{
  "DocumentName": "AWS-RestartEC2Instance",
  "DocumentVersion": "$DEFAULT",
  "Parameters": {
    "AutomationAssumeRole": [
      "arn:aws:iam::<account-id>:role/role-for-automation"
    ]
  },
  "TargetParameterName": "InstanceId",
  "Targets": [
    {
      "Key": "tag:autoRestart",
      "Values": [
        "restart"
      ]
    }
  ],
  "MaxErrors": "100%",
  "MaxConcurrency": "1"
}

DocumentNameとDocumentVersionには、実行するオートメーションランブックを設定します。

Parametersには、ランブックのパラメータを指定します。AWSが事前定義したランブックを使う場合、ランブックリファレンスでパラメータを確認できます。

今回は、パラメータのうち、InstanceIdをタグに応じて動的に設定します。これを実現するには、TargetParameterNameにInstanceIdを設定し、Targetsにタグのキーバリューを設定します。

上記の入力ペイロードのように書くと、autoRestartタグがrestartのインスタンスのインスタンスIDを、InstanceIdパラメータに動的に設定して、オートメーションを実行してくれます。

最後に、IAMロールの設定をして完了です。IAMロールには、先ほど作成したrole-for-schedulerを設定しましょう。

IAMロール以外の設定も色々ありますので、時間のある方はカスタマイズしましょう。

実行結果

EC2インスタンスを起動し、EC2インスタンスのautoRestartタグにrestartを設定し、スケジュールの実行時刻を待ちましょう。スケジュールの実行時刻になると、オートメーションが実行され、EC2が「実行中→停止中→保留中→実行中」と遷移するはずです。

また、Systems Managerのコンソールに行き、オートメーションページを開くと、画像のように実行履歴を確認できます。

他の方法と比較した利点

AWSで定期メンテナンスを実現する方法は他にもたくさんありますが、EventBridge Scheduler+SSM Automationの利点は次の3点だと私は思いました。

1. コーディングが不要

事前定義のランブックを使用すればロジックは一切考えなくてよいです。

さらに、本記事では取り上げないですが、独自定義のランブックも作成が可能です。独自定義の場合も、JSONやYAMLで宣言的に作業内容を記載できます。

2. 実行履歴

上記の実行結果で確認したように、SSMオートメーションは実行履歴をコンソールから確認できます。

3. タグでリソースの指定

EventEventBridge Schedulerでec2:RebootInstancesを直接実行するのに比べ、オートメーションで実行するとタグでインスタンスを指定できます。

さいごに

SSMオートメーションの事前定義ランブックはロジックの考慮不要でメンテナンスを楽にできそうだな……、EventBridge SchedulerはAWS APIを直接実行できるからいろいろ使えそうだな……と感じたので、この記事を書きました。

皆さんもぜひ試してみてください。

この記事をシェアする
著者:酒井亮太郎
シナモロール