LambdaとCloudWatch Eventsでタグの付与と削除を定期実行する
ご機嫌いかがでしょうか、豊崎です。
LambdaとCloudWatch Eventsで定期的なオペレーションを実装する機会がありましたのでまとめたいと思います。
やりたいこと
EC2へ定期的にタグを付与および削除をおこないたい。
- タグ
- key : monitoring
- value : true
- 8:00に付与
- 18:00に削除
今回はCloudWatch EventsとLambdaを利用して上記を実現しました。
やってみた
Lambda関数をつくる
Lambda関数を作っていきます。
Lambdaダッシュボードから、関数の作成>一から作成、を押して進んでいきます。
トリガーの設定については後ほど行うので、そのまま次へ進みます。
今回はpython3.6で作成を行います。
Lambda関数のコードは以下となります。
import boto3 def lambda_handler(event,context): flag = event['tag_attach_detach'] ec2_id = event['ec2_id'] tag_key = event['tag_key'] tag_value = event['tag_value'] client = boto3.client('ec2') if flag == "Attach": for id in ec2_id: response = client.create_tags( Resources=[id], Tags=[{'Key': tag_key,'Value': tag_value}] ) else: for id in ec2_id: response = client.delete_tags( Resources=[id], Tags=[{'Key': tag_key,'Value': tag_value}] )
その他設定は以下です。
- Lambda 関数ハンドラおよびロール
- タグのアタッチ、デタッチが行える任意のロールを指定(別途作成してください)
- 詳細設定
- タイムアウトを1分へ変更
lambdaの作成が終わったら、アクション>テストイベントの設定を行います。
Lambda関数に渡すタグ付与時のjson
{ "tag_attach_detach": "Attach", "ec2_id": ["i-XXXXXXXXXXXXXXXX","i-XXXXXXXXXXXXXXXX"], "tag_key":"monitoring", "tag_value":"true" }
Lambdaの成功と、対象のEC2にタグ「key:monitoring,value:true」が付与されていることを確認できました。
同様にタグ削除も確認。
Lambda関数に渡すタグ削除時のjson
{ "tag_attach_detach": "Detach", #Attach以外ならなんでもよい。 "ec2_id": ["i-XXXXXXXXXXXXXXXX","i-XXXXXXXXXXXXXXXX"], "tag_key":"monitoring", "tag_value":"true" }
キャプチャは取っていないですが、問題なく動作することを確認しました。
CloudWatch Eventsをつくる
それでは上で作成したLambdaを実行するCloudWatch Eventsを作っていきます。 CloudWatchダッシュボード>イベント>ルールの作成を押して進んでいきます。
設定は以下です
JST 08:00にタグ付与
- イベントソース
- スケジュール
- Cron式 [0 23 * * ? *] #UTCで入力
- ターゲット
- lambda関数
- 入力の設定
- 定数(JSONテキスト) #テストで実行したタグ付与のJSONをコピペ
JST 18:00にタグ削除
- イベントソース
- スケジュール
- Cron式 [0 10 * * ? *] #UTCで入力
- ターゲット
- lambda関数
- 入力の設定
- 定数(JSONテキスト) #テストで実行したタグ削除のJSONをコピペ
以下はタグ付与時のキャプチャです。
テスト的にスケジュールの設定を修正し実行。 CloudWatch Eventsからも問題なく付与、削除できました。
さいごに
定期的なオペレーションについてはLambda+Cloudwatch Eventsが便利ですね。
なお、上記スクリプトはサンプルとなりますので、本番環境への導入を行う場合はエラー発生時に対する検知や対応についても ご検討をお願いいたします。
誰かのお役に立てば幸いです。