본문 바로가기
[개발] Infrastructure/AWS

About accessing AWS instances ssh using .pem

by Devsong26 2021. 8. 6.

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을 가져올 수 없다.