使用boto3获取CloudFormation Stack资源ARN时报AttributeError错误
报错根因
你碰到的报错本质是混用了boto3的两类服务接口:
boto3.resource()返回的是高层封装的面向资源的服务对象,这类对象没有直接挂载list_stack_resources这类底层原始API的调用方法list_stack_resources是CloudFormation底层client接口提供的方法,不能直接在resource类型的服务实例上调用
可落地的实现方案
修正接口初始化逻辑
把原来的resource调用替换为标准client初始化写法:
import boto3 cf_client = boto3.client( 'cloudformation', aws_access_key_id='xxxxxxxx', aws_secret_access_key='xxxxxxxxxxxx' )
拉取目标栈的全量资源
用修正后的client实例调用API获取栈下所有资源信息:
resp = cf_client.list_stack_resources( StackName='ORG-ROLES' ) all_resources = resp['StackResourceSummaries']
你的目标栈仅包含9个资源,单次请求就能拿到全量结果,不需要处理分页逻辑。
提取目标资源的ARN
返回的资源列表中,每个条目的PhysicalResourceId字段,对CloudFormation支持的绝大多数资源类型来说,就是对应资源的正式ARN。你可以通过模板中定义的资源逻辑ID、资源类型做匹配,筛出需要的资源:
比如要找逻辑ID为OrgReadOnlyRole的资源对应的ARN,参考写法:
target_resource_id = 'OrgReadOnlyRole' for resource in all_resources: if resource['LogicalResourceId'] == target_resource_id: print(f"目标资源ARN:{resource['PhysicalResourceId']}")
补充提示
如果后续栈内资源总数超过100个,list_stack_resources接口会默认分页返回结果,需要通过返回值中的NextToken字段循环拉取,直到获取全量资源列表。
内容的提问来源于stack exchange,提问作者Dani Wol.
相关产品推荐
相关产品推荐

