andreygubarev/arnmatch

GitHub: andreygubarev/arnmatch

arnmatch 是一个从 AWS 文档自动生成的 Python 库和 CLI,用于解析 AWS ARN 并映射到 CloudFormation、Tagging API 和 boto3 服务。

Stars: 0 | Forks: 0

# arnmatch — 自动生成的 Python AWS ARN 解析器 [![持续集成](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/9ec60aa549054846.svg)](https://github.com/andreygubarev/arnmatch/actions/workflows/ci.yml) [![PyPI](https://img.shields.io/pypi/v/arnmatch)](https://pypi.org/project/arnmatch/) [![Python 版本](https://img.shields.io/pypi/pyversions/arnmatch)](https://pypi.org/project/arnmatch/) [![许可证](https://img.shields.io/github/license/andreygubarev/arnmatch)](LICENSE) [![下载量](https://img.shields.io/pypi/dm/arnmatch)](https://pypi.org/project/arnmatch/) `arnmatch` 是一个零依赖的 Python 库和 CLI,用于将 AWS ARN (Amazon Resource Names)解析为结构化的资源数据。它能识别 AWS 服务、区域、账户、资源类型、资源 ID、CloudFormation 资源类型、 Resource Groups Tagging API 类型以及 boto3 SDK 服务名称。 大多数 ARN 解析器将 ARN 分割为六个顶级字段。`arnmatch` 更进一步: 其针对特定服务的匹配引擎是从 [《AWS 服务授权参考》](https://docs.aws.amazon.com/service-authorization/latest/reference/) 及相关 AWS 服务元数据生成的,因此它能够识别数千种真实的 AWS 资源格式,而不是依赖于一个小型的人工维护列表。 ## 为什么选择 arnmatch? | 功能 | arnmatch | | --- | --- | | 解析 AWS ARN 分区、服务、区域和账户 | 是 | | 识别特定服务的资源类型 | 是 | | 提取资源 ID 和资源名称 | 是 | | 将 ARN 映射到 CloudFormation 资源类型 | 是 | | 将 ARN 映射到 Resource Groups Tagging API 类型 | 是 | | 将 ARN 映射到 boto3 SDK 客户端名称 | 是 | | AWS 服务覆盖范围 | 350+ 个服务 | | ARN 资源模式覆盖范围 | 2,100+ 种模式 | | 解析时的运行时依赖 | 0 | ## 常见用例 - 构建 AWS 清单、CSPM、云安全和资产管理工具。 - 规范化不同 AWS API 返回的 ARN。 - 将发现的资源映射到 CloudFormation 资源类型。 - 确定哪个 boto3 客户端可以操作特定资源。 - 从 ARN 中提取 AWS 账户 ID、区域、资源 ID 和资源名称。 - 验证一个 ARN 是否属于已知的 AWS 服务/资源模式。 ## 安装说明 ``` pip install arnmatch ``` ## 快速开始 ### 命令行界面 ``` $ arnmatch "arn:aws:lambda:us-east-1:123456789012:function:my-function" aws_service: lambda aws_sdk_service: lambda aws_sdk_services: lambda aws_region: us-east-1 aws_account: 123456789012 resource_type: function resource_id: my-function resource_name: my-function cloudformation_resource: AWS::Lambda::Function tagging_resource: AWS::Lambda::Function ``` ### Python 库 ``` from arnmatch import arnmatch result = arnmatch("arn:aws:lambda:us-east-1:123456789012:function:my-function") result.aws_service # "lambda" result.aws_region # "us-east-1" result.aws_account # "123456789012" result.resource_type # "function" result.resource_id # "my-function" result.resource_name # "my-function" result.cloudformation_resource # "AWS::Lambda::Function" result.tagging_resource # "AWS::Lambda::Function" result.aws_sdk_service # "lambda" ``` ## 示例 ### 解析 AWS ARN ``` from arnmatch import arnmatch arn = "arn:aws:s3:::my-bucket" resource = arnmatch(arn) print(resource.aws_service) # s3 print(resource.resource_type) # bucket print(resource.resource_name) # my-bucket ``` ### 将 AWS ARN 映射到 CloudFormation 资源类型 ``` from arnmatch import arnmatch resource = arnmatch("arn:aws:lambda:us-east-1:123456789012:function:my-function") print(resource.cloudformation_resource) # AWS::Lambda::Function 函数 ``` ### 将 AWS ARN 映射到 Resource Groups Tagging API 类型 ``` from arnmatch import arnmatch resource = arnmatch("arn:aws:rds:us-east-1:123456789012:db:my-database") print(resource.tagging_resource) # AWS::RDS::DBInstance 数据库实例 ``` ### 从 AWS ARN 获取 boto3 客户端 ``` import boto3 from arnmatch import arnmatch resource = arnmatch("arn:aws:lambda:us-east-1:123456789012:function:my-function") session = boto3.Session(region_name=resource.aws_region) client = resource.client(session=session) # 需要 AWS 凭证及调用 Lambda GetFunction 的权限。 client.get_function(FunctionName=resource.resource_name) ``` 解析器本身没有运行时依赖。可选的 `client()` 辅助方法需要你的应用程序环境中安装了 `boto3`。当你需要控制区域、配置文件、凭据或其他会话设置时,传递一个 boto3 会话。 ### 提取账户、区域、资源 ID 和资源名称 ``` from arnmatch import arnmatch resource = arnmatch("arn:aws:iam::123456789012:role/Admin") print(resource.aws_account) # 123456789012 print(resource.aws_region) # "" for global IAM resources print(resource.resource_type) # iam-role print(resource.resource_id) # Admin print(resource.resource_name) # Admin ``` ## 工作原理 `arnmatch` 生成其解析器数据,而不是手动编写 ARN 定义。生成管道从以下来源收集和协调 AWS 资源元数据: 1. AWS 服务授权参考 ARN 模式 2. CloudFormation 资源规范 3. Resource Groups Tagging API 资源映射 4. botocore/boto3 服务元数据 5. 针对 AWS 文档边缘情况的项目覆盖规则 生成的输出被编译到 `src/arnmatch/arn_patterns.py` 中,使得运行时包能够进行快速的本地正则表达式匹配,无需网络调用且没有运行时依赖。 ``` AWS docs + service metadata ↓ codegen pipeline ↓ generated ARN regex patterns and mappings ↓ zero-dependency Python parser ``` ## 功能特性 - ARN 解析零运行时依赖 - 350+ 个 AWS 服务和 2,100+ 种生成的 ARN 资源模式 - 特定服务的资源类型检测 - 资源 ID 和资源名称提取 - CloudFormation 资源类型映射 - Resource Groups Tagging API 类型映射 - boto3 SDK 服务名称映射 - CLI 和 Python 库接口 - 解析过程中无网络调用 ## API 参考 ### `arnmatch(arn: str) -> ARN` 解析一个 ARN 字符串并返回结构化数据。 如果 ARN 格式无效、AWS 服务未知或没有特定服务模式匹配,则抛出 `ARNError`。 ### `ARN` 包含已解析 ARN 组件的数据类: | 字段 | 类型 | 描述 | | --- | --- | --- | | `aws_partition` | `str` | AWS 分区,如 `aws`、`aws-cn` 或 `aws-us-gov` | | `aws_service` | `str` | ARN 中的 AWS 服务名称 | | `aws_region` | `str` | AWS 区域;对于全局资源可能为空 | | `aws_account` | `str` | AWS 账户 ID;对于某些全局/公共资源可能为空 | | `resource_type` | `str` | 来自生成的 AWS 模式的规范资源类型 | | `resource_types` | `list[str]` | 此资源类型的所有已知别名 | | `attributes` | `dict[str, str]` | 从特定服务 ARN 模式捕获的属性 | | `aws_sdk_service` | `str \| None` | 资源服务的主要 boto3 客户端名称 | | `cloudformation_resource` | `str \| None` | CloudFormation 资源类型,如 `AWS::Lambda::Function` | | `tagging_resource` | `str \| None` | Resource Groups Tagging API 类型 | 属性: | 属性 | 描述 | | --- | --- | | `resource_id` | 资源标识符;优先选择以 `Id` 结尾的捕获属性,然后是 `Name`,最后是最后一个资源属性 | | `resource_name` | 资源名称;优先选择以 `Name` 结尾的捕获属性,如果不存在则回退到 `resource_id` | | `aws_sdk_services` | 映射到 AWS 服务的所有 boto3 客户端名称,例如对于 `elasticloadbalancing`,其值为 `['elb', 'elbv2']` | 方法: | 方法 | 描述 | | --- | --- | | `client(session=None)` | 返回资源服务的 boto3 客户端。传递一个可选的 `boto3.Session`,或使用默认会话。如果没有 SDK 映射存在,则抛出 `ValueError`。 | ### `ARNError` 当 ARN 解析失败时引发的异常。继承自 `ValueError`。 ## 开发指南 前置条件:[uv](https://github.com/astral-sh/uv) ``` make lint # Run ruff linter make test # Run pytest tests make check # Run lint and test make generate # Regenerate patterns from AWS docs make build # Build wheel and tarball make publish # Build and upload to PyPI ``` 重新生成 ARN 模式数据: ``` cd codegen make clean make ``` 然后将生成的模式复制到包中并构建: ``` make build ``` ## 贡献指南 欢迎提交错误报告、补充缺失的 ARN 模式、更正映射以及改进文档。 有关本地设置和贡献指南,请参见 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 安全说明 有关漏洞报告或安全敏感问题,请参见 [SECURITY.md](SECURITY.md)。 ## 许可证 `arnmatch` 根据 [Apache License 2.0](LICENSE) 许可。 ## 版本控制 `arnmatch` 使用 [CalVer](https://calver.org/) 格式 `YYYY.MM.MICRO`,例如 `2026.3.3`。
标签:API映射, ARN解析, AWS, boto3, CLI, CloudFormation, CSPM, DPI, Python, TinkerPop, WiFi技术, 云服务, 占用监测, 工具开发, 文档结构分析, 无后门, 漏洞利用检测, 结构化数据, 自动代码生成, 资产管理, 资源管理, 资源识别, 逆向工具, 零依赖