data engineering

aws boto3 set ebs tag in auto scaling group ec2

qkqhxla1 2020. 11. 11. 14:59

현재 autoscaling group(asg)으로 많은 인스턴스를 만들어 쓰고 있다. 근데 aws를 써보면 알겠지만 asg를 만들때 tag를 설정할수 있는데, 이 설정해놓은 태그가 asg내부의 ec2들에는 동일하게 설정이 된다. 그런데 각각의 ec2가 ebs를 가지고 있는데, 이 ebs 들에는 asg에서 설정한 태그가 붙질 않는다.(aws버그인듯.. 당연히 같이 붙어야하는거 아닌가)


aws자원 관리를 위해서 기본적으로 설정해야하는 tag들이 있는데, ebs들은 자동적으로 아무 태그도 들어가지 않으면서 null로 들어감으로써 ebs자원 관리가 되질 않는다는 요청이 왔다.

ec2들이 자주 생성되고 삭제되고 하는 구조여서 한번만 수동으로 tag를 설정할게 아니라 매번 자동으로 태그를 설정해줄 스크립트를 짤 필요성을 느꼈다.


참고

https://www.capitalone.com/tech/cloud/python-boto3-automate-aws-instance-tags/


https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html


아래는 어느정도 성공하고 난 뒤의 테스트 코드를 올린다.

# -*- coding: utf-8 -*-

import boto3


class AwsManager:
    def __init__(self):
        self.access_key, = 'access_key', #'self.get_temporary_aws_key()
        self.secret_access_key = 'secret_access_key'
        self.token = 'token'
        self.region = 'ap-northeast-2'

    def set_ebs_tag_in_asg(self, asg_group):
        asg_client = boto3.client('autoscaling', verify=False,
                                  aws_access_key_id=self.access_key,
                                  aws_secret_access_key=self.secret_access_key,
                                  aws_session_token=self.token,
                                  region_name=self.region)

        ec2 = boto3.client('ec2',
                           aws_access_key_id=self.access_key,
                           aws_secret_access_key=self.secret_access_key,
                           aws_session_token=self.token,
                           region_name=self.region)

        asg_info = asg_client.describe_auto_scaling_groups(AutoScalingGroupNames=[asg_group])  # 오토스케일링 그룹명으로 인스턴스 정보를 가져온다.
        instance_id_list = [each_instance_info['InstanceId'] for each_instance_info in
                            asg_info['AutoScalingGroups'][0]['Instances']]  # instance id들을 가져온다.

        print instance_id_list
        instance_info_list = ec2.describe_instances(InstanceIds=instance_id_list)  # instance id들로 instance들의 정보를 가져온다.
        block_device_info_list = map(lambda x: x['Instances'][0]['BlockDeviceMappings'], instance_info_list['Reservations'])  # block device정보를 가져온다.
        block_device_info_list = [v for sublist in block_device_info_list for v in sublist]  # list flatten

        block_device_id_list = map(lambda x: x['Ebs']['VolumeId'], block_device_info_list)  # ebs들의 volumeid 만 가져온다.
        ec2.create_tags(Resources=block_device_id_list, Tags=[{'Key': 'owner', 'Value': 'qkqhxla'}])  # owner:qkqhxla 으로 태그를 설정해준다.


if __name__ == '__main__':
    awsmanager = AwsManager()
    asg_group_name = '오토스케일링 그룹명'
    instance_id_list = awsmanager.set_ebs_tag_in_asg(asg_group_name)
    # print block_info

+ 나중에 안 사실인데 launch configuration말고 launch template으로 템플릿으로 만들면 볼륨까지 자동으로 태깅이 된다.