AWS Systems Manager Change Calendar で AWS Lambda のスケジュール実行を制御しよう

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

こんにちは、マネージドサービス部テクニカルサポート課の坂口です。

AWS Systems Manager Change Calendar で AWS Lambda のスケジュール実行を制御する方法についてまとめました。

はじめに

AWS Lambdaをスケジュール実行させたい場合、Amazon EventBridge を使用すると思いますが、Amazon EventBridgeだけでは曜日の指定は出来るものの、祝日の指定が出来ないため困っていました。

今回は、AWS Systems Manager Change Calendar + Amazon EventBridge + AWS Step Functions を使用し、祝日を除いた平日に AWS Lambda を実行する方法について説明します。

構成図

Google カレンダーのエクスポート

AWS Systems Manager Change Calendar では、祝日の設定がなく手作業での追加が必要となるため、Google カレンダーの祝日情報のファイルを使用します。

  1. Google カレンダーの設定で、日本の祝日を選択し「iCal 形式の公開 URL」をコピーします。

  2. コピーした URL をブラウザにペーストすると、「basic.ics」というファイルが自動的にダウンロードされます。

  3. ダウンロードされた「basic.ics」をテキストエディタで開き、7行目の X-WR-TIMEZONE:UTCX-WR-TIMEZONE:Asia/Tokyo に変更し保存します。

AWS Systems Manager Change Calendar の作成

AWS Systems Manager Change Calendar とは、指定したアクション (Systems Manager Automation ランブックなど) が AWS アカウント で実行できるまたはできない日付と時刻の範囲(カレンダー)を設定できます。

docs.aws.amazon.com

  1. AWS マネジメントコンソールで、AWS Systems Manager Change Calendar を開き、「カレンダーを作成」を押下します。

  2. 「カレンダー名」を入力後、「Import calendar」を押下し「basic.ics」を選択します。

  3. 「カレンダーを作成」を押下します。

AWS Lambda 関数の作成

今回は、関数作成時のデフォルト状態のまま使用します。

  1. AWS マネジメントコンソールで AWS Lambda 関数を開き、「関数の作成」を押下します。

  2. 「関数名」を入力し、「関数の作成」を押下します。

IAM ポリシーの作成

後述する IAM ロールにアタッチするため、IAM ポリシーを事前に作成しておきます。

  1. AWS マネジメントコンソールで IAM ポリシーを開き、「ポリシーを作成」を押下します。

  2. 以下のポリシーを自身の環境に修正し、IAM ポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetCalendarState"
            ],
            "Resource": [
                "arn:aws:ssm:<AWS リージョン>:<AWS アカウント>:document/<カレンダー名>"
            ]
        }
    ]
}

IAM ロールの作成

AWS Step Functions ステートマシンで使用する IAM ロールを事前に作成しておきます。

  1. AWS マネジメントコンソールで IAM ロールを開き、「ロールを作成」を押下します。

  2. ユースケースのサービスに「Step Functions」を選択し、「次へ」を押下し続け IAM ロールを作成します。

  3. 作成した IAM ロールにて先ほど作成した IAM ポリシーをアタッチします。

AWS Step Functions ステートマシンの作成

  1. AWS マネジメントコンソールで AWS Step Functions ステートマシンを開き、「ステートマシンの作成」を押下します。

  2. 「コードでワークフローを記述」を選択します。

  3. 以下のコードを自身の環境に修正しコピーします。

{
  "Comment": "",
  "StartAt": "GetCalendarState",
  "States": {
    "GetCalendarState": {
      "Type": "Task",
      "Parameters": {
        "CalendarNames": [
          "Holiday-Calendar"
        ]
      },
      "Resource": "arn:aws:states:::aws-sdk:ssm:getCalendarState",
      "Next": "Choice"
    },
    "Choice": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.State",
          "StringEquals": "OPEN",
          "Next": "Lambda Invoke"
        }
      ],
      "Default": "Pass"
    },
    "Pass": {
      "Type": "Pass",
      "End": true
    },
    "Lambda Invoke": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "Payload.$": "$",
        "FunctionName": "arn:aws:lambda:<AWS リージョン>:<AWS アカウント>:function:<Lambda 関数名>:$LATEST"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "End": true
    }
  }
}
  1. 「定義」のコード欄にペーストし、「次へ」を押下します。

  2. 「ステートマシン名」を入力し、「既存のロールを選択する」を押下し、事前に作成したロールを選択します。

  3. 下にスクロールし、「ステートマシンの作成」を押下します。

Amazon EventBridge スケジューラの作成

  1. AWS マネジメントコンソールで Amazon EventBridge スケジューラを開き、「スケジュールを作成」を押下します。

  2. 「スケジュール名」を入力し、「定期的なスケジュール」を選択します。

  3. 「cron式」を入力し、「フレックスタイムウィンドウ」を「オフ」にします。 指定できる値は以下を参考にしてください。 docs.aws.amazon.com

  1. 「次へ」を押下します。

  2. 「Templated targets」を選択し、「AWS Step Functions StartExecution」を選択します。

  3. 「ステートマシン」を選択し、「次へ」を押下します。

  4. 「次へ」を押下します。

  5. 「スケジュールを作成」を押下します。

動作確認

Amazon EventBridge スケジューラ指定した時間にて、動作していることを確認します。

AWS マネジメントコンソールで AWS Step Functions ステートマシンを開き、作成したステートマシンを押下し、当該時間の「実行名」を押下します。

分岐で Lambda 関数を呼び出しているのが確認できます。

次は、作成した AWS Systems Manager Change Calendar に予定を入れることで、State を CLOSE にして Lambda 関数が実行されていないか確認します。

確認用に10:00-11:00で予定を入れました。

また、Amazon EventBridge スケジューラの時間は一時的に10:00に実行されるよう変更しております。

再度、AWS マネジメントコンソールで AWS Step Functions ステートマシンを開き、実行結果を確認します。

そのまま終了しているのが確認できます。

まとめ

AWS Systems Manager Change Calendar + Amazon EventBridge + AWS Step Functions を使用することで、スケジュール実行を制御することができます。

今回は AWS Lambda を実行しましたが、その他のAWS リソースも呼び出しが可能となります。 docs.aws.amazon.com

祝日カレンダーの手動インポートが必要なのがネックですが、是非、実際に試してみてください。

坂口 大樹 (記事一覧)

マネージドサービス部テクニカルサポート課

2023年3月にサーバーワークス入社。

スパイスカレーが好きです。