AWS 조직의 모든 VM 이름, IP 및 FQDN을 가져오는 간단한 Python 코드

AWS 조직에서 AWS VM 이름, IP 주소 및 FQDN을 얻는 것은 간단해야 합니다. 하지만...

AWS는 AWS 조직 전체에서 모든 가상 머신 이름, IP 및 정규화된 도메인 이름의 통합 목록을 얻는 것을 터무니없이 어렵게 만들었습니다. 이를 수행하는 단일 명령이 없습니다. 모든 계정을 개별적으로 반복하여 각 계정 내에서 API를 호출해야 합니다. 까다로울 수 있습니다.

Python을 사용하여 간단하게 만들었습니다. 내가 어떻게했는지 알아 보려면 계속 읽으십시오.

배경: 사용자가 마스터 계정에서 개별 회원 계정으로 역할을 맡을 수 있도록 AWS 조직을 설정해야 합니다. 이에 대한 자세한 내용은 시작here을 참조하십시오.

프로그램 논리:
1) 프로그램에 관리 계정 ID를 입력합니다. 나중에 사용하겠습니다.

print("******************************************************************")
print("Welcome to the AWS Organization EC2 Name, IP and FQDN Report")
print("To get started, please enter the AWS Organization Main Account ID: ")
orgMainAccountID = input()


2) AWS Organization의 모든 계정 목록 가져오기

orgClient = boto3.client('organizations')
response = orgClient.list_accounts()


3) "response"변수에서 찾은 모든 계정을 반복합니다. 각 계정에 대해 AWS Security Token Service(STS)를 사용하여 임시 토큰을 생성하여 관리 계정에서 회원 계정에 액세스합니다. 단, 직접 액세스하기 때문에 관리 계정에 대한 임시 토큰을 생성하지 않습니다.

for account in response['Accounts']:


4) AWS STS를 사용하여 토큰 및 세션 생성

stsClient = boto3.client('sts')
roleArn = "arn:aws:iam::" + account['Id'] + ":role/OrganizationAccountAccessRole"
stsresponse = stsClient.assume_role(RoleArn=roleArn, RoleSessionName='newsession')
# Save the details from assumed role into vars
newsession_id = stsresponse["Credentials"]["AccessKeyId"]
newsession_key = stsresponse["Credentials"]["SecretAccessKey"]
newsession_token = stsresponse["Credentials"]["SessionToken"]


5) assume_role 변수를 사용하여 ec2client를 생성하여 가상 머신에서 정보를 가져오고 "response"변수에 저장합니다.

# Use the assumed session vars to create a new boto3 client with the assumed role creds
ec2Client = boto3.client('ec2', 
  region_name=region['RegionName'],
  aws_access_key_id=newsession_id, 
  aws_secret_access_key=newsession_key, 
  aws_session_token=newsession_token)
response = ec2Client.describe_instances()


6) 모든 응답을 반복하고 VM 이름, IP 및 FDQN을 가져옵니다.

for reservation in response["Reservations"]:
  for instance in reservation["Instances"]:
    try:
      if instance["State"]["Name"] == "running":
        print("Account Name:",account['Name']+",", "Region: 
        {}, Name: {}, Private IP: {}, Public IP: {}, FQDN: 
        {}".format( region['RegionName'],
        # get instance name from Tag Name
        [tag['Value'] for tag in instance['Tags'] if tag['Key'] == 'Name'][0], instance["PrivateIpAddress"],instance["PublicIpAddress"], instance["PublicDnsName"]))
     except KeyError as missing_key:
     # Used as missing_key for readability purposes only
       print(f"Trying to access a <dict> with a missing key {missing_key}") 


7) 1단계에서 입력한 관리 계정 ID로 돌아갑니다. 이 코드에는 관리 계정에 직접 액세스하므로 "역할 가정"을 시도하지 않도록 하는 조건이 포함되어 있습니다.

최종 메모. 전체 코드는 here에서 찾을 수 있습니다. 더 나은 오류 처리, 가독성 또는 실행 속도로 자유롭게 개선하십시오.

좋은 웹페이지 즐겨찾기