如何通过Boto3根据AWS资源ID获取对应服务名称?
如何用Boto3根据AWS资源ID获取对应服务名称
嘿,这个需求确实挺实用的!Boto3本身并没有提供直接的get_service_name方法,但我们可以通过两种方式来实现你想要的效果:
方案一:基于资源ID前缀的静态映射
AWS的大多数资源ID都有固定的前缀规律,我们可以提前维护一个前缀与服务名称的映射字典,快速匹配返回结果。
代码实现
import boto3 class AWSServiceClient: def __init__(self): # 维护常见资源前缀与服务名称的映射,可根据需求扩展 self.RESOURCE_PREFIX_MAP = { 'i-': 'EC2', 'subnet-': 'VPC', 'vpc-': 'VPC', 'sg-': 'EC2', 'db-': 'RDS', 'lambda-': 'Lambda', 'elasticbeanstalk-': 'Elastic Beanstalk' } def get_service_name(self, resource_id): for prefix, service in self.RESOURCE_PREFIX_MAP.items(): if resource_id.startswith(prefix): return service return 'Unknown Service' # 使用示例 client = AWSServiceClient() print(client.get_service_name("i-0ff8943bb6c0db21c")) # 输出 EC2 print(client.get_service_name("subnet-007c14e3ae140c9d9")) # 输出 VPC
优缺点
- ✅ 优点:无需调用AWS API,响应速度快,无需额外IAM权限
- ❌ 缺点:需要手动维护前缀映射,无法覆盖所有资源,部分资源前缀可能随AWS更新变化
方案二:调用AWS资源组标签API(更准确)
如果想要更准确、无需维护映射的方案,可以使用AWS的Resource Groups Tagging API,通过资源ID获取其ARN,再从ARN中解析出服务名称。
代码实现
import boto3 class AWSServiceClient: def __init__(self): self.tagging_client = boto3.client('resourcegroupstaggingapi') # 针对特殊需求的资源映射(比如subnet归属EC2但你期望返回VPC) self.SPECIAL_CASE_MAP = { 'subnet-': 'VPC' } def get_service_name(self, resource_id): # 先检查特殊需求映射 for prefix, service in self.SPECIAL_CASE_MAP.items(): if resource_id.startswith(prefix): return service # 调用Tagging API获取资源信息 try: response = self.tagging_client.get_resources(ResourceIds=[resource_id]) if response['ResourceTagMappingList']: resource_arn = response['ResourceTagMappingList'][0]['ResourceARN'] # ARN格式为 arn:aws:service:region:account-id:resource-type/resource-id service_name = resource_arn.split(':')[2] return service_name return 'Unknown Service' except Exception as e: print(f"获取资源信息失败: {str(e)}") return 'Unknown Service' # 使用示例 client = AWSServiceClient() print(client.get_service_name("i-0ff8943bb6c0db21c")) # 输出 EC2 print(client.get_service_name("subnet-007c14e3ae140c9d9")) # 输出 VPC
注意事项
- 需要确保你的IAM角色拥有
resource-groups:GetResources权限 - 部分旧版AWS资源可能不支持Tagging API,此时会返回
Unknown Service - 针对你特殊的需求(subnet返回VPC),我们通过
SPECIAL_CASE_MAP做了额外处理——因为subnet的ARN实际归属EC2服务
优缺点
- ✅ 优点:无需维护前缀映射,支持绝大多数AWS资源,结果更准确
- ❌ 缺点:需要调用AWS API,有一定网络延迟,依赖IAM权限
内容的提问来源于stack exchange,提问作者Claudio Saavedra
相关产品推荐
相关产品推荐

