LambdaとCloudWatch Eventsでタグの付与と削除を定期実行する

ご機嫌いかがでしょうか、豊崎です。

LambdaとCloudWatch Eventsで定期的なオペレーションを実装する機会がありましたのでまとめたいと思います。

やりたいこと

EC2へ定期的にタグを付与および削除をおこないたい。

  • タグ
    • key : monitoring
    • value : true
  • 8:00に付与
  • 18:00に削除

今回はCloudWatch EventsとLambdaを利用して上記を実現しました。

やってみた

Lambda関数をつくる

Lambda関数を作っていきます。

Lambdaダッシュボードから、関数の作成>一から作成、を押して進んでいきます。

Lambda_Management_Console

トリガーの設定については後ほど行うので、そのまま次へ進みます。

Lambda_Management_Console

今回はpython3.6で作成を行います。

Lambda_Management_Console

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_Management_Console

CloudWatch_Management_Console

同様にタグ削除も確認。

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_Management_Console

CloudWatch_Management_Console

テスト的にスケジュールの設定を修正し実行。 CloudWatch Eventsからも問題なく付与、削除できました。

さいごに

定期的なオペレーションについてはLambda+Cloudwatch Eventsが便利ですね。

なお、上記スクリプトはサンプルとなりますので、本番環境への導入を行う場合はエラー発生時に対する検知や対応についても ご検討をお願いいたします。

誰かのお役に立てば幸いです。