AWS Lambdaで特定タグがついていないリソースを操作してみました

2017.06.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

LambdaでAWSリソースを操作する際、タグがついていないリソースに対して操作を行いたいということがありました。 ここでは特定のタグがついていないEC2の停止を行ってみることにします。

はじめに

準備としてEC2を3台用意しました。

  • demo01(タグあり key:AutoStop,value:false)
  • demo02(タグなし)
  • demo03(タグなし)

Lambdaを使ってAutoStopタグがついているEC2(demo01)以外を停止したいと思います。

demo01に設定したタグをAWSマネジメントコンソールで確認しました。

lambda01

どのようにするか

全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の停止が行われました。

lambda02

さいごに

ここでは特定のタグがついていないリソースを対象にする方法をご紹介しました。 実際の環境では予期しないリソースに対する変更操作が発生する可能性等があるためタグベースでの操作を行うことをお勧めします。 誰かのお役に立てば幸いです。