批量导出AWS所有auto scaling groups详细配置至Excel表格

批量导出AWS所有auto scaling groups详细配置至Excel表格

Deng YongJie's blog 30 2025-05-17

使用Python脚本导出

import json
import csv
import os
import subprocess
from typing import List, Dict
import re


# AWS凭证通过环境变量获取(避免硬编码)
# ACCESS_KEY = os.getenv('AWS_ACCESS_KEY_ID')
# SECRET_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
# REGION = 'ap-southeast-1'

# 设置访问密钥和区域
ACCESS_KEY = 'AKIARPNIBxxxx'
SECRET_KEY = 'NYt5Qw2RSj0/a5lDih7crQjXRxxxxxx'
REGION = 'ap-southeast-1'

def get_auto_scaling_groups():
    try:
        result = subprocess.run(
            [
                'aws', 'autoscaling', 'describe-auto-scaling-groups',
                '--region', REGION,
                '--output', 'json'
            ],
            env={
                **os.environ,
                'AWS_ACCESS_KEY_ID': ACCESS_KEY,
                'AWS_SECRET_ACCESS_KEY': SECRET_KEY
            },
            capture_output=True, text=True, check=True
        )
        return json.loads(result.stdout)['AutoScalingGroups']
    except subprocess.CalledProcessError as e:
        print(f"Error fetching Auto Scaling groups: {e}")
        return []

def extract_target_group_name(target_group_arn):
    """从ARN中提取目标组的名字"""
    match = re.search(r'targetgroup/([^/]+)/', target_group_arn)
    if match:
        return match.group(1)
    return ''

def format_field(field_value):
    """将字段值按逗号分隔并换行"""
    if not field_value:
        return ''
    items = field_value.split(',')
    return '\n'.join(item.strip() for item in items)

def extract_asg_details(asg):
    details = {
        'AutoScalingGroupName': asg.get('AutoScalingGroupName', ''),
        'LaunchConfigurationName': asg.get('LaunchConfigurationName', ''),
        'MinSize': str(asg.get('MinSize', '')),  # 确保数值类型转换为字符串
        'MaxSize': str(asg.get('MaxSize', '')),
        'DesiredCapacity': str(asg.get('DesiredCapacity', '')),
        'DefaultCooldown': str(asg.get('DefaultCooldown', '')),
        'AvailabilityZones': format_field(', '.join(asg.get('AvailabilityZones', [])),  # 格式化可用区
        'LoadBalancerNames': format_field(', '.join(asg.get('LoadBalancerNames', [])),  # 格式化负载均衡器名称
        'TargetGroupNames': format_field(', '.join([extract_target_group_name(tg) for tg in asg.get('TargetGroupARNs', [])])),  # 格式化目标组名称
        'HealthCheckType': asg.get('HealthCheckType', ''),
        'HealthCheckGracePeriod': str(asg.get('HealthCheckGracePeriod', '')),  # 确保数值类型转换为字符串
        'VPCZoneIdentifier': format_field(asg.get('VPCZoneIdentifier', '')),  # 格式化VPCZoneIdentifier
        'CreatedTime': asg.get('CreatedTime', '').split('.')[0],  # 去掉时间戳中的小数部分
    }
    return details

def write_to_csv(asg_data, filename='auto_scaling_groups_info.csv'):
    fields = ['AutoScalingGroupName', 'LaunchConfigurationName', 'MinSize', 'MaxSize', 'DesiredCapacity',
              'DefaultCooldown', 'AvailabilityZones', 'LoadBalancerNames', 'TargetGroupNames', 'HealthCheckType',
              'HealthCheckGracePeriod', 'VPCZoneIdentifier', 'CreatedTime']

    with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fields)
        writer.writeheader()
        for asg in asg_data:
            writer.writerow(extract_asg_details(asg))

    print(f"Auto Scaling组信息已成功提取并保存到 {filename} 文件中。")

if __name__ == "__main__":
    asg_data = get_auto_scaling_groups()
    if asg_data:
        write_to_csv(asg_data)

最终展示结果:

image-20250314111527690