You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

注意事项

  1. 需要确保你的IAM角色拥有resource-groups:GetResources权限
  2. 部分旧版AWS资源可能不支持Tagging API,此时会返回Unknown Service
  3. 针对你特殊的需求(subnet返回VPC),我们通过SPECIAL_CASE_MAP做了额外处理——因为subnet的ARN实际归属EC2服务

优缺点

  • ✅ 优点:无需维护前缀映射,支持绝大多数AWS资源,结果更准确
  • ❌ 缺点:需要调用AWS API,有一定网络延迟,依赖IAM权限

内容的提问来源于stack exchange,提问作者Claudio Saavedra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:37:44