AWS 리눅스 인스턴스의 경우 이미지 별로 디폴트 유저이름을 갖는다.
boto3 라이브러리를 이용하여,
.pem 파일로 ssh 접속하는 인스턴스 정보를 엑셀로 다운받는 스크립트를 작성했다.
리눅스 AMI 별로 Default Username을 갖는다.
AMI | Username |
Amazon Linux 2 / Amazon Linux AMI | ec2-user |
CentOS AMI | centos |
Debian AMI | admin |
Fedora AMI | ec2-user / fedora |
RHEL AMI | ec2-user / root |
SUSE AMI | ec2-user / root |
Ubuntu AMI | ubuntu |
내가 사용했던 RHEL(레드햇 계열)은 ec2-user가 디폴트였다.
fedora, suse는 사용 안 해봤지만 ec2-user를 디폴트로 가정하고 스크립트를 작성했다.
파이썬에서 엑셀을 사용하려면 'openpyxl'을 pip로 설치해야 한다.
import boto3
import re
from openpyxl import Workbook
def print_items(msg, arr):
print()
print("##### {0} #####".format(msg))
for i, e in enumerate(arr):
print(e)
def is_match_word(s, w):
p = r'{}'.format(w)
return bool(re.search(p, s, re.IGNORECASE))
def get_instance_name(instance):
name = None
tags = instance[0]['Tags']
if len(tags) > 0:
for i, e in enumerate(tags):
if e['Key'] == 'Name':
name = e['Value']
return name
def write_excel(items, path):
workbook = Workbook()
writer = workbook.active
writer.append(['Instance ID', 'Instance Name', 'Username', 'Key Name', 'Image Location'])
for i, e in enumerate(items):
writer.append(e)
workbook.save(path)
def get_username(img):
username = None
if is_match_word(img['PlatformDetails'], "Red Hat") or is_match_word(img['PlatformDetails'], "SUSE"):
username = "ec2-user"
elif img['PlatformDetails'] == 'Linux/UNIX':
if is_match_word(img['ImageLocation'], 'centos'):
username = "centos"
elif is_match_word(img['ImageLocation'], 'ubuntu'):
username = "ubuntu"
elif is_match_word(img['ImageLocation'], 'debian'):
username = "admin"
elif is_match_word(img['ImageLocation'], 'amazon'):
username = "ec2-user"
return username
class Instance:
def __init__(self, aws_access_key_id, aws_secret_access_key, region_name):
sess = boto3.Session(
# TODO: Supply your AWS credentials & specified region here
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name=region_name, # Or whatever region you want
)
self.__ec2 = sess.client('ec2')
self.__set_instance_groups(self.__ec2)
def __set_instance_groups(self, ec2):
self.__instance_groups = list(map(lambda i: i['Instances'], ec2.describe_instances()['Reservations']))
# print_items("Print all instance groups", self.__instance_groups)
def export_excel_info(self, file_path):
info_arr = []
for i, e in enumerate(self.__instance_groups):
try:
instance_name = get_instance_name(e)
img = self.__ec2.describe_images(ImageIds=[e[0]['ImageId']])['Images'][0]
username = get_username(img)
info = [e[0]["InstanceId"], instance_name, username, e[0]["KeyName"]]
if username is None:
info.append(img['ImageLocation'])
except IndexError:
info = [e[0]["InstanceId"], instance_name, username, e[0]["KeyName"]]
info_arr.append(info)
write_excel(info_arr, file_path)
if __name__ == '__main__':
file_path = ""
aws_access_key_id = ""
aws_secret_access_key = ""
region_name = ""
instance = Instance(aws_access_key_id, aws_secret_access_key, region_name)
instance.export_excel_info(file_path)
다운받은 엑셀에 Image Location 컬럼 값이 있는 경우,
커스텀 AMI(기존 인스턴스에서 생성한 이미지)이라서 디폴트 Username을 가져올 수 없다.
'[개발] Infrastructure > AWS' 카테고리의 다른 글
ECS 인스턴스 Docker에 컨테이너 안 올라갈 경우 (Feat. ECR, Jenkins, Gradle) - war 파일 (0) | 2021.09.07 |
---|---|
s3 bucket에서 사이즈가 가장 큰 file 찾기 (0) | 2021.08.12 |
사용 중인 모든 AWS 서비스를 확인하는 방법인 Tag Editor를 알아보자. (0) | 2021.07.30 |
미 사용 AWS EC2 보안 그룹은 어떻게 확인할까? (0) | 2021.07.28 |
boto3 라이브러리로 미 사용중인 AWS EBS를 알아보자. (0) | 2021.07.27 |