[小ネタ]boto3を使用してCloudWatchEventsを操作する

boto3を使用してCloudWatchEventsを作成・変更・削除を行い、Lambda関数をtargetに追加します。
2020.05.22

こんにちは

最近、CloudWatchEvents(Events)を使う機会が増えすごく便利だなと気づいた下地です。

コンソール画面から設定することですぐ使用できるEventsですが、プログラム処理の途中で設定できたら良いなと思い調べるとboto3で出来ましたのでまとめたいと思います。

環境

以下の環境で作業を行います。

  • Mac: 10.15.4
  • Python: 3.7.0
  • boto3: 1.12.33

Eventsの作成

関数のimport

Events操作に必要な関数な関数をimportします。

import boto3
client = boto3.client('events')

作成

Events名と設定時間、Eventsの説明を入力しput_ruleを使用しEventsを作成します。

設定時間はRateまたはCronを指定出来ます。今回はCron方式で設定します(UTC時刻になりますので、作業時間から9時間前の時間を設定する必要があります)。

event_name = "events_from_boto3"
event_time = "cron(00 10 * * ? *)"
description = "make_from_boto3"
#Eventsを作成
response = client.put_rule(
                    Name=event_name,
                    ScheduleExpression= event_time,
                    EventPattern='',
                    State='DISABLED',
                    Description=description)

#作成されたEventsのArn
print(response['RuleArn'])
arn:aws:events:ap-northeast-1:************:rule/events_from_boto3

確認

コンソール画面より、作成したEvents(events_from_boto3)を確認します。この時点では、Eventsを作成しただけでTargetは設定されていません。

下記のようにdescribe_ruleを使用することでコードからも確認することもできます(作成後と同じArnが確認できます)。

response = client.describe_rule(Name=event_name)

print(response['Arn'])
arn:aws:events:ap-northeast-1:************:rule/events_from_boto3

Targetの追加・確認

Targetの追加

では次に作成したEventsにLambda関数をTargetに設定します。put_targetsを使用しtest_lambdaというlambda関数をTargetに設定します。

lambda_name = 'test_lambda'
lambda_arn = 'arn:aws:lambda:ap-northeast-1:************:function:test_lambda'

response = client.put_targets(
    Rule=event_name,
    Targets=[
        {
            'Id': lambda_name,
            'Arn':  lambda_arn
        }
    ]
)

Targetの確認

先ほど作成したEventsにlambda関数が追加されていることがわかります。

list_targets_by_ruleを使用し、コード上で確認することもできます。

#Targetの確認
response = client.list_targets_by_rule(Rule=event_name)
    
#結果
print(response['Targets'])
[{'Id': 'test_lambda',
  'Arn': 'arn:aws:lambda:ap-northeast-1:************:function:test_lambda'}]

設定時刻の変更

Events作成時に使用したput_ruleを使用して、設定時刻を変更できます。時間だけを指定しまうと他がnull値になるので変更時はすべてのパラメーターを設定する必要があります。

response = client.put_rule(
                    Name=event_name,
                    ScheduleExpression='cron(00 20 * * ? *)',
                    EventPattern='',
                    State='ENABLED',
                    Description=description
)

コンソール画面より設定時刻が変更されたことがわかります。

Events削除

最後に今回作成したEventsを削除します。削除の手順としてTargetをEventsから外す処理を行いEventsを削除をする必要があります。

#Targetのremove
response = client.remove_Targets(
    Rule=event_name,
    Ids=[lambda_name,]
)

#Eventsの削除
response = client.delete_rule(Name=event_name)

コンソール画面で作成したEvents名を入力しても「ルールがありません」と表示され削除されたことがわかります。

Targetの外す前にEvetnsを削除しようとすると下記の様なエラー文がでますので注意が必要です。

ClientError: An error occurred (ValidationException) when calling the DeleteRule operation: Rule can't be deleted since it has targets.

まとめ

Events機能をプログラムの途中で作成・削除が出来ると良いなと思い調べてみると出来ました。コードで作成から削除までできるのを知りさらに便利だなと実感しました。この記事がどなたかの助けになれば幸いです。

参考リンク