如何编写Python Lambda实现跨AWS账户统计指定名称运行EC2实例数量
跨AWS账户统计指定名称运行EC2实例的代码调整方案
前置依赖配置
你需要先完成IAM权限配置,才可以跨账户调用AWS资源接口:
- 在目标AWS账户中创建跨账户访问角色(示例命名为
CrossAccountEC2ReadOnlyRole),为其附加AmazonEC2ReadOnlyAccess系统权限策略 - 为该角色配置信任策略,允许你的Lambda函数所属的AWS账户的执行角色代入该角色
- 为Lambda的执行角色添加
sts:AssumeRole权限,允许其代入目标账户的上述跨账户角色
完整实现代码
import boto3 def lambda_handler(event, context): # 自定义配置项,按需修改 TARGET_ACCOUNT_ID = "123456789012" # 替换为目标AWS账户12位ID TARGET_ROLE_NAME = "CrossAccountEC2ReadOnlyRole" # 替换为目标账户的跨账户角色名 TARGET_INSTANCE_NAME = "your-specific-instance-name" # 替换为要统计的实例特定名称 REGIONS_TO_SCAN = ["us-east-1", "cn-north-1"] # 替换为需要扫描的区域列表 # 1. 调用STS服务获取目标账户临时凭证 sts_client = boto3.client('sts') assumed_role = sts_client.assume_role( # AWS中国区ARN前缀为arn:aws-cn,海外区为arn:aws,按需修改 RoleArn=f"arn:aws-cn:iam::{TARGET_ACCOUNT_ID}:role/{TARGET_ROLE_NAME}", RoleSessionName="cross-account-ec2-scan" ) credentials = assumed_role['Credentials'] total_count = 0 # 2. 遍历指定区域统计符合条件的实例 for region in REGIONS_TO_SCAN: # 用临时凭证初始化对应区域的EC2资源对象 ec2_resource = boto3.resource( 'ec2', region_name=region, aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'] ) # 过滤运行中、名称匹配的实例 filtered_instances = ec2_resource.instances.filter( Filters = [ {'Name': 'instance-state-name', 'Values': ['running']}, {'Name': 'tag:Name', 'Values': [TARGET_INSTANCE_NAME]} ] ) total_count += len(list(filtered_instances)) print(f"符合条件的EC2实例总数:{total_count}") return total_count
扩展说明
- 如果需要统计多个目标账户,新增账户ID列表做循环,重复执行角色代入+实例统计逻辑即可
- Lambda执行超时时间可根据扫描的账户、区域数量适当调大,避免执行中断
- 如果不需要限制实例名称,删除
tag:Name对应的过滤规则即可
内容的提问来源于stack exchange,提问作者Flo Flo
相关产品推荐
相关产品推荐

