AWS Lambdaで特定タグがついていないリソースを操作してみました
ご機嫌いかがでしょうか、豊崎です。
LambdaでAWSリソースを操作する際、タグがついていないリソースに対して操作を行いたいということがありました。 ここでは特定のタグがついていないEC2の停止を行ってみることにします。
はじめに
準備としてEC2を3台用意しました。
- demo01(タグあり key:AutoStop,value:false)
- demo02(タグなし)
- demo03(タグなし)
Lambdaを使ってAutoStopタグがついているEC2(demo01)以外を停止したいと思います。
demo01に設定したタグをAWSマネジメントコンソールで確認しました。
どのようにするか
全EC2をec2.describe_instances()で、タグつきのEC2をec2.describe_instances()+Filtersで取得します。 それぞれの結果からインスタンスIDをセット(集合)にして差集合演算をすることでタグなしのEC2を取得します。
やってみる
言語はPython3.6を使います。
import boto3 def lambda_handler(event,context): ec2 = boto3.client('ec2') # 全インスタンスのインスタンスIDを取得し集合にする no_tag = ec2.describe_instances() no_tag_set = set(ec2['InstanceId'] for resId in no_tag['Reservations'] for ec2 in resId['Instances']) # タグのついたインスタンスIDを取得し集合にする with_tag = ec2.describe_instances( Filters=[{ 'Name': 'tag:AutoStop', 'Values': ['false'] }] ) with_tag_set = set(ec2['InstanceId'] for resId in with_tag['Reservations'] for ec2 in resId['Instances']) # 全インスタンスとタグつきインスタンスとの差集合演算を行う set_target_instances = no_tag_set - with_tag_set # 演算結果をリストにする list_target_instances = list(set_target_instances) stopInstances = ec2.stop_instances( InstanceIds=list_target_instances ) response = { "StopInstances" : list_target_instances } return response
結果
期待した通りにEC2の停止が行われました。
さいごに
ここでは特定のタグがついていないリソースを対象にする方法をご紹介しました。 実際の環境では予期しないリソースに対する変更操作が発生する可能性等があるためタグベースでの操作を行うことをお勧めします。 誰かのお役に立てば幸いです。