趣谈亚马逊云科技API

SDK
0
0
API是云的原子单位,我们在使用亚马逊云科技的服务时,时时刻刻都会直接或间接用到特定服务的API,API的作用不言而喻。查阅API文档始终是云的使用运维中,耗费非常大精力的一项工作,其实我们可以用程序化的方法将亚马逊云科技的API数据提出出来,帮助我们更好的了解这些API,提升使用亚马逊云科技服务的效率。 根据数据统计,亚马逊云科技共有29334个API,API中'List'开头的最多,有2200个,其次有1783个'Get' API,1682个’Del' API和1508个'Describe' API,拥有最多API的service是quicksight,有161个。 那么这些关于API的基础数据是如何获取的呢?原理很简单,这里用到了亚马逊云科技SDK for Python(boto3)中的get\_available\_services API和meta属性,其中meta属性在公开资料中鲜有提及。直接上代码: ``` import boto3 from collections import OrderedDict from prettytable import PrettyTable def list_services(): session = boto3.Session() return session.get_available_services() def get_input_structure(client, operation_name): operation_model = client.meta.service_model.operation_model(operation_name) input_shape = operation_model.input_shape if input_shape: input_structure = OrderedDict() for member_name, member_shape in input_shape.members.items(): try: is_required = member_name in input_shape.required except AttributeError: is_required = False input_structure[member_name] = { 'IsRequired': is_required, 'Type': member_shape.type_name } else: input_structure = None return input_structure def get_api_parameters(service_name): client = boto3.client(service_name) service_operations = client.meta.service_model.operation_names api_params = {} for operation_name in service_operations: input_structure = get_input_structure(client, operation_name) if input_structure: api_params[operation_name] = input_structure return api_params if api_params else None def print_parameters(service_name, api_params): if api_params is None: return for api_name, params in api_params.items(): print(f"\\nAPI: {api_name}") table = PrettyTable() table.field_names = ["Parameter Name", "IsRequired", "Type"] for param_name, param_info in params.items(): table.add_row([param_name, param_info['IsRequired'], param_info['Type']]) print(table) def save_to_dynamodb(service_name, api_params): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('aws_api_info') for api_name, params in api_params.items(): existing_item = table.get_item(Key={'service': service_name, 'api': api_name}) if 'Item' not in existing_item: item = { 'service': service_name, 'api': api_name, 'parameters': [] } for param_name, param_info in params.items(): param_data = { 'name': param_name, 'isRequired': param_info['IsRequired'], 'type': param_info['Type'] } item['parameters'].append(param_data) table.put_item(Item=item) def main(): services = list_services() for service in services: try: api_params = get_api_parameters(service) print(f"\\nService: {service}") print_parameters(service, api_params) save_to_dynamodb(service, api_params) except Exception as e: print(f"Unable to get API parameters for {service}: {e}") if __name__ == "__main__": main() ``` 以上代码从boto3中提取当前region所有可用的service,并从service client的meta属性中提取API和API的参数信息,打印输出并保存到Dynamodb中,其后就可以基于API数据库进行进一步的统计分析了。 ![image.png](https://dev-media.amazoncloud.cn/2938ae01aa8c426891a76f9f2e523f9c_image.png "image.png") 那么除了一些“没有用的知识”以外,这些提取出的API信息还有哪些实际用途呢?目前笔者设想到的场景有如下一些: 1. **IAM策略生成辅助工具**: 创建一个工具,用户可以根据服务和API数据选择他们需要的服务和操作。工具可以扫描调用SDK的代码,识别其中的API调用,自动创建IAM策略,允许访问所选服务的指定API。尤其是对于PassRole这种特殊权限,可以根据API参数名是否包含'Role'或'RoleArn'来判断相关API是否依赖PassRole权限。 2. **模板生成**: 使用服务和API数据创建IAM策略模板,这些模板可作为其他策略的基础。用户可以在这些模板的基础上进行修改,以满足特定需求。例如并没有现成可用的policy将所有Resource Groups and Tag Editor支持的资源类型的Tag编辑权限都整理好,100多个服务逐个查文档的话,是非常低效的。这时就可以利用扫描好的API信息自动取生成所需的Policy。 3. **自动SDK代码生成**:根据服务和API信息以及其参数,自动创建用于与这些服务和API交互的软件开发工具包(SDK)和客户端库。 4. **API测试和模拟**:使用服务和API信息生成API测试用例和模拟数据,以便在开发和测试阶段验证API行为。 5. **版本控制和迁移**:监控服务和API的版本变更,以便在API升级或弃用时进行平滑迁移。 以上就是服务和API数据的获取和可能的用途,希望可以帮助读者在API的海洋中发现规律和创造新的开发运维模式。
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭