글
AWS EBS 네임태그 자동화 람다
IT/Python3
2020. 8. 17. 19:07
반응형
클라우드 개발자 앙몬드의 람다를 정리하다보니, 구 버전 파이썬 람다를 살펴
볼일이 요즘 많습니다.
쿠버네티스에 대한 파이썬 스크립트를 사용하다보니, 과거 보토스 (boto3) 에 대한 AWS API들을 살펴보고 있죠.
오늘은 그와 더불어, 제가 EC2 에 탑재된 EBS 볼륨의 태그 네이밍을 자동화하는 람다를 리뷰할 겸, 본 글을 올립니다.
해당 이슈는, 본 블로그의 하기 테마로 분류되어 있습니다.
devloper-angmond.tistory.com/10?category=867517
import boto3
import os
import sys
import uuid, json
from urllib.parse import unquote_plus
"""
EC2 인스턴스 네이밍을 이용한, EBS 네임태그 자동화 람다
@auth : 클라우드 개발자 앙몬드
@since : 2020-05-20
* 확인 이슈
(1) EC2 고정 인스턴스의 경우, 내 소유의 인스턴스로 판단하여, ec2.describe_instances() 결과로 포함되나,
ECS (도커스웜) / EKS (쿠버네티스) 로 스케일링아웃 (ASG그룹) 된 인스턴스들은,
결과가 포함되지 않는 이슈가 있어, 100% EBS 네임태그 자동화가 불가함.
(2) 상기 이슈에 대해서는 AWS 확인 필요
(3) 참조 레퍼런스
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.describe_instances
* ec2.describe_instances API 명세서 요약
Describes the specified instances or all of AWS account's instances.
If you specify one or more instance IDs, Amazon EC2 returns information for those instances.
If you do not specify instance IDs, Amazon EC2 returns information for all relevant instances.
If you specify an instance ID that is not valid, an error is returned.
If you specify an instance that you do not own, it is not included in the returned results.
...(이후 생략)
"""
# ebs-name-tagging-lambda
def lambda_handler(event, context):
# (0) ec2 클라이언트 오픈 & 현재 어카운트의 인스턴스 정보 get
list_ec2_instances = boto3.client('ec2').describe_instances(MaxResults=999)["Reservations"]
print("원본 개수 : " + str(len(list_ec2_instances)))
# 콘솔 상의 EC2 인스턴스 개수와, CLI / boto3-sdk 인스턴스 개수와 다르다면,
# 해당 어카운트의 인스턴스가 스케일 아웃된 사례가 존재하는 것으로 판단함.
# (1) ec2 클라이언트 오픈 & 현재 어카운트의 인스턴스 정보 get
list_dict_of_instances_for_ebs_naming = []
for instance in list_ec2_instances :
instance = instance["Instances"][0]
list_dict_of_instances_for_ebs_naming.append(
{
"InstanceId" : instance["InstanceId"], # 인스턴스의 ID
"Tags" : instance["Tags"], # 해당 인스턴스의 태그 전체 (Name 포함)
"EBS" : instance["BlockDeviceMappings"], # 해당 인스턴스에 붙은 EBS 정보
}
)
# (2) EC2 인스턴스에서 가져온 볼륨 정보를 통해, EBS 네임태그 생성.
# 볼륨에 접근하기 위해서는, client가 아니라 resource 레벨에서 접근해야합니다.
ec2 = boto3.resource('ec2')
for instance in list_dict_of_instances_for_ebs_naming :
# (a) 인스턴스의 네임 태그값을 추출한다.
instance_name = ""
for dict_tag in instance["Tags"] :
if dict_tag["Key"] == "Name" :
instance_name = dict_tag["Value"]
break
# (b) 2개 이상의 볼륨이, 한 인스턴스에 마운트된 경우도 있으므로,
# instance["EBS"] 에 대하여 루프를 태운다.
# 루프 안에서는 하기와 같은 작업을 실행한다.
# (b-1) a에서 추출한 인스턴스 이름을 이용하여, EBS 네임태그를 룰에 맞게 생성한다.
# (b-2) EBS 볼륨 id를 추출해, EBS 네임태그를 생성한다.
# (EBS 네임태그 예시) vol-ec2-prd-seoul-bo-01/dev/xvda
for ebs_info in instance["EBS"]:
#(b-1)
ebs_tag_name = "vol-" + instance_name + ebs_info["DeviceName"]
#(b-2)
tag = ec2.Volume(ebs_info["Ebs"]["VolumeId"]).create_tags(
Tags=[ { 'Key': 'Name', 'Value': ebs_tag_name } ]
)
반응형
'IT > Python3' 카테고리의 다른 글
파이썬 중복되는 공백 제거 및 스트링 재변환 (0) | 2020.10.14 |
---|---|
파이썬 날짜 비교 (0) | 2020.10.14 |
AWS ELB 네임태그 생성 자동화 스크립트 (0) | 2020.08.10 |
파이썬 (Python) 리스트 (3) - 리스트 슬라이싱과 역인덱스 (0) | 2020.05.18 |
파이썬 (Python) 리스트 (2) - 리스트 제어 함수 (0) | 2020.04.19 |