使用Python和OpenAPI将云上的安全组规则填写入Excel

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
轻量应用服务器 2vCPU 4GiB,适用于搭建Web应用/小程序
轻量应用服务器 2vCPU 4GiB,适用于搭建容器环境
简介: 本文介绍如何通过Python脚本自动化获取阿里云安全组及其规则信息,并将结果导出为Excel表格。相比CLI命令行方式,Python实现更高效、便捷,适用于需要批量处理和交付的场景。

我们知道使用CLI是可以列出安全组信息,但是仅仅可以列出安全组信息。而使用CLI列出安全组规则需要安全组的ID,不能列出全部安全组规则。所以想要将交付物(可交付成果)以表格清单的形式给客户,将会比较麻烦。这里我们使用python来实现。

# Check SecurityGroup
aliyun --profile CLI-exampleAK1 ecs DescribeSecurityGroups --output cols="VpcId,SecurityGroupId,SecurityGroupName,CreationTime" rows="SecurityGroups.SecurityGroup[]"

# Check SecurityGroup Rule
aliyun--profile CLI-exampleAK1 ecs DescribeSecurityGroupAttribute --SecurityGroupId sg-xxxxxxxxx

利用Python快速实现

首先需要去api.aliyun.com找到OpenAPI在线调试页面,然后找到DescribeSecurityGroupAttribute。
再使用SDK示例找到Python后直接下载Python项目

https://api.aliyun.com/api/Ecs/2014-05-26/DescribeSecurityGroupAttribute?params={
   %22RegionId%22:%22cn-beijing%22}

结果:

#################################################
# -*- coding: utf-8 -*-
import sys
import os
import pandas as pd
from typing import List
from alibabacloud_ecs20140526.client import Client as EcsClient
from alibabacloud_ecs20140526.models import DescribeSecurityGroupAttributeRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions

class Sample:
    @staticmethod
    def create_client() -> EcsClient:
        """
        使用AK&SK初始化账号Client
        @return: Client
        @throws Exception
        """
        config = Config(
            access_key_id='xxxxxxxxx',
            access_key_secret='xxxxxxxxxxx'
            # 这是让你在环境变量填写,而不写入代码里, 我懒,直接写到代码里。
            # access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
            # access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
        )
        config.endpoint = 'ecs.ap-southeast-1.aliyuncs.com'  # 根据实际区域进行修改
        return EcsClient(config)

    @staticmethod
    def read_security_group_ids_from_excel(file_path, sheet_name='Sheet1'):
        """
        从Excel文件中读取安全组ID
        @param file_path: Excel文件路径
        @param sheet_name: Excel工作表名称
        @return: 包含安全组ID的列表
        """
        df = pd.read_excel(file_path, sheet_name=sheet_name)
        security_group_ids = df['sgid'].tolist()  # 假设 'sgid' 是包含安全组ID的列
        return security_group_ids

    @staticmethod
    def extract_info_from_response(response):
        """
        从API响应中提取关键信息
        """
        permissions_info = []
        for permission in response.permissions.permission:
            permissions_info.append({
   
                #'SecurityGroupName': permission.security_group_name,
                'IpProtocol': permission.ip_protocol,
                'PortRange': permission.port_range,
                'SourceCidrIp': permission.source_cidr_ip,
                'SecurityGroupRuleId': permission.security_group_rule_id
            })
        return {
   
            'sgid': response.security_group_id,
            'SecurityGroupName': response.security_group_name,
            'InnerAccessPolicy': response.inner_access_policy,
            'Permissions': permissions_info
        }

    @staticmethod
    def write_to_excel(data: List[dict], file_path):
        """
        将数据列表写入Excel文件
        @param data: 数据列表,其中每个元素是一个字典
        @param file_path: Excel文件路径
        """
        df = pd.DataFrame(data)
        df.to_excel(file_path, index=False)

    @staticmethod
    def main(args: List[str]) -> None:
        client = Sample.create_client()
        excel_file_path = 'D:\\Projects\\sg-list-rule\\sg-list.xlsx'  # 替换为您的Excel文件路径
        security_group_ids = Sample.read_security_group_ids_from_excel(excel_file_path)

        processed_data = []  # 用于存储处理后的数据

        for sg_id in security_group_ids:
            request = DescribeSecurityGroupAttributeRequest(
                region_id='ap-southeast-1',  # 替换为您的区域ID
                security_group_id=sg_id
            )
            try:
                response = client.describe_security_group_attribute(request)
                response_body = response.body
                sg_info = Sample.extract_info_from_response(response_body)

                # 为每条权限规则添加行数据
                for permission in sg_info['Permissions']:
                    processed_data.append({
   
                        'sgid': sg_info['sgid'],
                        'SecurityGroupName': sg_info['SecurityGroupName'],
                        'InnerAccessPolicy': sg_info['InnerAccessPolicy'],
                        'IpProtocol': permission['IpProtocol'],
                        'PortRange': permission['PortRange'],
                        'SourceCidrIp': permission['SourceCidrIp'],
                        'SecurityGroupRuleId': permission['SecurityGroupRuleId']
                    })

            except Exception as error:
                print(f"Error while processing security group {sg_id}: {error}")

        # 准备DataFrame的列
        columns = ['sgid', 'SecurityGroupName','InnerAccessPolicy', 'IpProtocol', 'PortRange', 'SourceCidrIp', 'SecurityGroupRuleId']
        df = pd.DataFrame(processed_data, columns=columns)

        # 写入Excel文件
        output_file_path = 'D:\\Projects\\sg-list-rule\\updated_sg_info.xlsx'  # 输出文件名
        df.to_excel(output_file_path, index=False)
        print(f"Data has been successfully written to {output_file_path}")

if __name__ == '__main__':
    Sample.main(sys.argv[1:])

源表格: sg-list.xlsx
1751698215024_AA8107F1-1FC2-430a-995B-2A3C19519527.png

目标表格:updated_sg_info.xlsx
5326bb8519e554f6dfaf5f97ce34da6c.png

相关文章
|
3月前
|
人工智能 运维 NoSQL
机器一宕机就靠“拍脑袋”?试试知识图谱,排故快准狠!
机器一宕机就靠“拍脑袋”?试试知识图谱,排故快准狠!
232 8
|
12月前
|
Dart Android开发
鸿蒙Flutter实战:05-使用第三方插件
在鸿蒙Flutter开发中,使用原生功能需借助插件。可自编原生ArkTS代码或采用第三方插件。自编代码通过PlatformView或MethodChannel实现;第三方插件需确保适配鸿蒙,否则须配置替代插件或自行开发。
378 1
鸿蒙Flutter实战:05-使用第三方插件
|
SQL 前端开发 Java
安装部署--impala 服务启动、关闭 | 学习笔记
快速学习 安装部署--impala 服务启动、关闭
1238 0
安装部署--impala 服务启动、关闭 | 学习笔记
|
3月前
|
JSON 数据可视化 计算机视觉
大语言模型也可以进行图像分割:使用Gemini实现工业异物检测完整代码示例
本文将通过一个实际应用场景——工业传送带异物检测,详细介绍如何利用Gemini的图像分割能力构建完整的解决方案。
140 2
大语言模型也可以进行图像分割:使用Gemini实现工业异物检测完整代码示例
|
3月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
211 3
|
4月前
|
存储 监控 NoSQL
在阿里云上构建高性能PHP应用:最佳实践指南
本文档从四个核心方面阐述了系统设计与优化的全面方案:**架构设计原则**包括分层架构(Web/逻辑/数据分离)与无状态设计(Redis会话存储、OSS文件管理);**核心服务选型**推荐高性价比的ECS、高性能Redis企业版及PolarDB数据库等;**性能优化技巧**涵盖代码层面(OPcache、Swoole框架)、数据库优化(复合索引、分库分表)以及进阶容器化和函数计算策略;**监控体系搭建**则通过云监控、ARMS应用监控、日志服务SLS等工具,确保系统稳定高效运行。
136 10
|
4月前
|
人工智能 运维 网络协议
别只盯着ChatGPT!大模型也能帮你抓网络“鬼”
别只盯着ChatGPT!大模型也能帮你抓网络“鬼”
174 4
|
3月前
|
弹性计算 运维 安全
使用资源目录管理操作旗下账户的概念验证CLI
在多账号云环境中,通过资源目录与角色扮演实现跨账号资源控制是一种常见架构。本文介绍如何使用阿里云CLI通过临时凭证实现主账号、成员账号间的角色切换,并操作目标账号资源。同时提供Python代码示例,演示如何通过STS获取临时凭证并访问ECS资源,适用于企业多账号统一管理和运维场景。
|
3月前
|
C++ Windows
解决win10无法更新问题,错误码0x80070422
Windows系统更新时出现错误代码0x80070422,通常因Windows Update服务未启动或相关服务异常。解决方法包括:启动Windows Update服务、关闭网络地址转换、使用第三方工具如DirectX Repair增强版一键修复、运行系统文件检查工具(sfc /scannow)或安装Windows修复专家,全面修复DLL缺失、系统文件损坏等问题,适用于多种Windows系统版本。
310 7
|
3月前
|
NoSQL 安全 Redis
Docker Compose :从入门到企业级部署
Docker Compose 是用于定义和运行多容器应用的工具,支持服务、网络和卷三大核心要素。通过简洁的 YAML 文件,可实现应用的快速部署与管理,适用于开发、测试及生产环境。
214 1