[小ネタ]boto3を使用してCloudWatchEventsを操作する
こんにちは
最近、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機能をプログラムの途中で作成・削除が出来ると良いなと思い調べてみると出来ました。コードで作成から削除までできるのを知りさらに便利だなと実感しました。この記事がどなたかの助けになれば幸いです。