hero_picture
Cover Image for EventBridgeで第nX曜日の翌日に処理させたい場合

EventBridgeで第nX曜日の翌日に処理させたい場合

こんにちは、クラウドソリューション事業部の石垣です。初のブログ投稿となります。今年は折にふれ、アウトプットの機会を増やしていこうと思っています。

今回はEventBridgeからのスケジュール実行で、例えば第2火曜日の翌日に実行させたい等、第nX曜日の翌日等で設定したい場合の設定について書いていきます。

EventBridgeとは

EventBridgeというのは、AWSのドキュメントによると「Amazon EventBridge は、アプリケーションをさまざまなソースからのデータに接続するために使用できるサーバーレスのイベントバスサービス」です。

つまり何かというと、イベントを契機に処理を実行させるためのサービスということになるかと思います。どういう場合に使用するかというと「イベント駆動型の処理に対して、イベントを検知してそれを他のサービスの実行契機とする」もしくは「スケジュール実行のキックをする」という主に2種類の使用があります。

今回は後者のスケジュール実行についてです。

考え方

「第2火曜日の翌日」という設定をするとしましょう。そのものズバリなスケジュール設定をすることはできません。ですので、第2火曜日の翌日とは何かについてちょっと考える必要があります。

第2火曜日の翌日が必ずしも第2水曜とはならないことに注意する必要があります。

上記に注意しながら、「第2火曜日の翌日」の条件を考えると、以下であることがわかります。あくまで火曜日を基準に考えなければいけない点がポイントかと思います。

  • 第2火曜日の翌日とは、第2火曜日と第3火曜日の間の水曜日のことである。

設定方針

第2火曜日の翌日の条件「第2火曜日の翌日とは、第2火曜日と第3火曜日の間の水曜日のことである」に素直にしたがって設定方針は以下とします。

メインルール

  • 毎週水曜日に処理を実行するようにルールを作成する。

サブルール1

  • メインルールを有効化する処理を作成して、第2火曜日に実行する。

サブルール2

  • メインルールを無効化する処理を作成して、第3火曜日に実行する。

設定

本稿の主旨は考え方と設定方針で記載した部分ですが、一応設定方法も記載しておきます。

サブルールで使用する処理の作成

まず、メインルールを有効化・無効化する処理を作成します。

Systems ManagerのドキュメントにはAWSで用意されているものもありますが、今回は調べたところ、そのものズバリ使用できそうなものはありませんでした。ない場合は、カスタムドキュメントを作成しましょう。

以下のドキュメントを作成します。

※AWSで用意されたドキュメントの「AWS-DisableEventBridgeRule」を参考に作成しています。

有効化のためのルール(EnableEventBridgeRuleとしておきます)

1description: |-
2  Document name -  EnableEventBridgeRule
3
4  ## What does this document do?
5  The  EnableEventBridgeRule Automation document enables the rule in EventBridge
6schemaVersion: '0.3'
7parameters:
8  RuleName:
9    type: String
10    description: '(Required) Name of the EventBridge rule'
11  EventBusName:
12    type: String
13    description: '(Optional) Name of the event bus. If not specified, uses `default` event bus. '
14    default: 'default'
15  AutomationAssumeRole:
16    type: String
17    description: '(Optional) The Amazon Resource Name (ARN) of the role that allows SSM Automation to perform the actions on your behalf.'
18    default: ''
19    allowedPattern: '^arn:aws(-cn|-us-gov)?:iam::\d{12}:role\/[\w+=,.@_\/-]+|^$'
20assumeRole: '{{AutomationAssumeRole}}'
21mainSteps:
22  - name: EnableEventBridgeRule
23    action: 'aws:executeAwsApi'
24    inputs:
25      Service: events
26      Api: enable_rule
27      Name: '{{RuleName}}'
28      EventBusName: '{{EventBusName}}'
29    description: Eables a rule in EventBridge
30  - name: checkEnableRule
31    action: 'aws:waitForAwsResourceProperty'
32    inputs:
33      Service: events
34      DesiredValues:
35        - ENABLED
36      PropertySelector: State
37      Api: describe_rule
38      Name: '{{RuleName}}'
39      EventBusName: '{{EventBusName}}'
40    timeoutSeconds: 300

無効化のためのルール(DisableEventBridgeRuleとしておきます)

1description: |-
2  Document name -  DisableEventBridgeRule
3
4  ## What does this document do?
5  The  DisableEventBridgeRule Automation document disables the rule in EventBridge
6schemaVersion: '0.3'
7parameters:
8  RuleName:
9    type: String
10    description: '(Required) Name of the EventBridge rule'
11  EventBusName:
12    type: String
13    description: '(Optional) Name of the event bus. If not specified, uses `default` event bus. '
14    default: 'default'
15  AutomationAssumeRole:
16    type: String
17    description: '(Optional) The Amazon Resource Name (ARN) of the role that allows SSM Automation to perform the actions on your behalf.'
18    default: ''
19    allowedPattern: '^arn:aws(-cn|-us-gov)?:iam::\d{12}:role\/[\w+=,.@_\/-]+|^$'
20assumeRole: '{{AutomationAssumeRole}}'
21mainSteps:
22  - name: DisableEventBridgeRule
23    action: 'aws:executeAwsApi'
24    inputs:
25      Service: events
26      Api: disable_rule
27      Name: '{{RuleName}}'
28      EventBusName: '{{EventBusName}}'
29    description: Disables a rule in EventBridge
30  - name: checkDisableRule
31    action: 'aws:waitForAwsResourceProperty'
32    inputs:
33      Service: events
34      DesiredValues:
35        - DISABLED
36      PropertySelector: State
37      Api: describe_rule
38      Name: '{{RuleName}}'
39      EventBusName: '{{EventBusName}}'
40    timeoutSeconds: 300

IAMロールの作成

上記のドキュメントを実行するAutomation用のIAMロールと、EventBridgeからSSM Automationを実行するEventBridge用のIAMロールとが必要になります。

Automation用のIAMロール(SSMAutomationRoleとします)

信頼関係

1{
2    "Version": "2012-10-17",
3    "Statement": [
4        {
5            "Effect": "Allow",
6            "Principal": {
7                "Service": [
8                    "ec2.amazonaws.com",
9                    "ssm.amazonaws.com"
10                ]
11            },
12            "Action": "sts:AssumeRole"
13        }
14    ]
15}

権限(IAMポリシー)

1{
2    "Version": "2012-10-17",
3    "Statement": [
4        {
5            "Sid": "VisualEditor0",
6            "Effect": "Allow",
7            "Action": [
8                "events:DescribeRule",
9                "events:EnableRule",
10                "events:DisableRule"
11            ],
12            "Resource": "*"
13        }
14    ]
15}

EventBridge用のIAMロール(EventBridgeforSSMAutomationRoleとします)

信頼関係

1{
2    "Version": "2012-10-17",
3    "Statement": [
4        {
5            "Effect": "Allow",
6            "Principal": {
7                "Service": "events.amazonaws.com"
8            },
9            "Action": "sts:AssumeRole"
10        }
11    ]
12}

権限(ポリシー)

1{
2    "Version": "2012-10-17",
3    "Statement": [
4        {
5            "Action": "ssm:StartAutomationExecution",
6            "Effect": "Allow",
7            "Resource": [
8                "arn:aws:ssm:ap-northeast-1:*:automation-definition/EnableEventBridgeRule:$DEFAULT",
9                "arn:aws:ssm:ap-northeast-1:*:automation-definition/DisableEventBridgeRule:$DEFAULT"
10            ]
11        },
12        {
13            "Effect": "Allow",
14            "Action": [
15                "iam:PassRole"
16            ],
17            "Resource": "上記で作成したSSMAutomationRoleのARN",
18            "Condition": {
19                "StringLikeIfExists": {
20                    "iam:PassedToService": "ssm.amazonaws.com"
21                }
22            }
23        }
24    ]
25}

EventBridge設定

メインルールの設定

メインルールのスケジュール設定は毎週水曜日です。通常時は無効にしておきます。実行したい処理をメインルールのターゲットに設定します。

※時間は任意です。以下の画像では3:00UTC(12:00JST)としました。

サブルール1の設定

第2火曜日に実行するメインルールの有効化処理のためのルールです。スケジュールパターンは以下とします。Tue#2が第2火曜日です。

ターゲットで以下の設定とします。

1ターゲットタイプ:AWSのサービス
2ターゲットを選択:System Managerオートメーション
3ドキュメント:EnableEventBridgeRule
4ドキュメントバージョン:デフォルト
5自動化パラメータを設定:定数(以下に記載)
6ロール:EventBridgeforSSMAutomationRole

パラメータとして指定する定数は以下の内容となります。

1{
2  "EventBusName": ["default"],
3  "RuleName": ["メインルールのRuleName"],
4  "AutomationAssumeRole": ["ssmAutomationRoleのARN"]
5}

サブルール2の設定

同様にサブルール2も設定します。サブルール1の設定との変更点は以下の通りです。

  • スケジュールの曜日指定が第3火曜日「Tue#3」
  • ターゲットで指定するドキュメントが「DisableEventBridgeRule」

まとめ

EventBridgeのスケジュール設定について、一癖ある場合の指定方法について記載しました。

これを使えば、第2火曜日の翌日に公開されるWindowsアップデートなんかの際に使えるのではないかと思っています。