如何通过AWS账户名称编程获取对应的AWS账户ID
结论
完全可以通过编程方式凭借AWS账户名称反向查询对应账户ID,你提到的所有账户都归属于同一AWS组织的前提,刚好是实现这个查询的核心基础——只要你使用的操作身份拥有AWS Organizations的读取权限(至少包含organizations:ListAccounts权限),不需要额外工具就能完成查询,API、CLI、Terraform三种方式均支持。
具体实现方式
1. AWS CLI 实现
这是最轻量的查询方式,直接调用Organizations的列表接口加JMESPath过滤就能直接输出结果:
- 全组织范围查询指定名称的账户ID:
# 将<目标账户名称>替换为你要查找的实际账户名 aws organizations list-accounts --query "Accounts[?Name=='<目标账户名称>'].Id" --output text
- 如果只需要在特定OU下查找,避免全组织遍历,可以指定OU父节点ID查询:
# 将<目标OU-ID>替换为实际的OU标识符,<目标账户名称>替换为待查账户名 aws organizations list-accounts-for-parent --parent-id <目标OU-ID> --query "Accounts[?Name=='<目标账户名称>'].Id" --output text
注意:如果组织内账户数量较多,接口返回结果会被分页截断,执行时加上
--paginate参数,或在代码逻辑中处理NextToken翻页参数即可拿到全量结果。
2. 原生API实现
对应CLI调用的两个原生接口即可实现自定义代码查询:
- 全组织范围查询调用
ListAccounts接口,遍历返回结构中的Accounts数组,匹配Name字段等于目标账户名的条目,对应的Id字段就是要找的账户ID - 指定OU范围查询调用
ListAccountsForParent接口,入参传入目标OU的ID作为ParentId,后续的匹配逻辑和全组织查询一致
两个接口单页最多返回20条账户记录,代码实现时记得处理分页逻辑,避免遗漏结果。
3. Terraform 实现
直接依托AWS官方Provider的Organizations相关数据源就能完成查询,不需要自定义外部脚本:
- 全组织范围匹配的写法:
# 拉取当前组织的全量信息 data "aws_organizations_organization" "current" {} locals { # 替换<目标账户名称>为实际待查账户名,即可得到对应ID target_account_id = one([ for acc in data.aws_organizations_organization.current.accounts : acc.id if acc.name == "<目标账户名称>" ]) }
- 指定OU范围匹配的写法:
# 拉取指定OU下的所有子账户 data "aws_organizations_children" "target_ou_accounts" { parent_id = "<目标OU-ID>" child_type = "ACCOUNT" } locals { # 构建账户名到ID的映射表,直接按名称索引即可 account_name_id_map = { for child in data.aws_organizations_children.target_ou_accounts.children : child.name => child.id } target_account_id = local.account_name_id_map["<目标账户名称>"] }
注意事项:如果你的AWS组织内存在重名账户,上述方式会返回多个匹配结果,建议提前保证组织内账户名唯一,或额外通过账户邮箱、自定义标签等维度做二次校验,避免获取到错误的账户ID。
内容的提问来源于stack exchange,提问作者Comfortably Numb
相关产品推荐
相关产品推荐

