子账户Lambda借助管理账户角色获取联系人信息权限问题
1. 让管理账户(Account_002)有权访问其他账户的联系人信息
AWS的account:GetContactInformationAPI默认仅允许账户自身或组织根账户调用,组织管理账户无法直接跨账户获取其他账户的联系人信息,需通过以下步骤配置授权:
步骤1:在每个目标账户(Account_000、Account_001)创建IAM角色
在每个需要被获取联系人信息的账户中,创建一个IAM角色(比如命名为AllowManagementAccountAccessContactInfo),配置:- 信任策略:允许管理账户(Account_002)的ARN扮演该角色,示例信任策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Account_002_ID:root" }, "Action": "sts:AssumeRole" } ] } - 权限策略:授予
account:GetContactInformation权限,示例权限策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "account:GetContactInformation", "Resource": "*" } ] }
- 信任策略:允许管理账户(Account_002)的ARN扮演该角色,示例信任策略:
步骤2:给管理账户的跨账户角色添加
sts:AssumeRole权限
更新Account_002中现有跨账户角色的权限策略,添加允许扮演上述目标账户角色的权限:{ "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::Account_000_ID:role/AllowManagementAccountAccessContactInfo", "arn:aws:iam::Account_001_ID:role/AllowManagementAccountAccessContactInfo" ] }步骤3:调整调用逻辑
管理账户在获取联系人信息时,需要先通过sts:AssumeRole切换到目标账户的角色,再调用account:GetContactInformationAPI。
2. 让Account_001的Lambda函数有权获取其他账户的联系人信息
基于上述管理账户的配置,只需扩展Lambda的权限和执行逻辑即可:
步骤1:确保管理账户的跨账户角色已配置好
sts:AssumeRole权限
确认Account_002中的跨账户角色已经具备扮演目标账户(Account_000、Account_001)联系人访问角色的权限(参考问题1的步骤2)。步骤2:Lambda函数调整执行逻辑
Lambda函数的执行流程需要修改为:- 先扮演Account_002中的跨账户角色,获取组织内所有账户的基础信息(标签、账户ID、加入类型等)。
- 针对每个目标账户(除根账户外),调用
sts:AssumeRole切换到该账户的AllowManagementAccountAccessContactInfo角色。 - 使用切换后的角色凭证调用
account:GetContactInformation获取联系人信息。
可选优化:直接授权Lambda角色
如果不想通过管理账户中转,也可以在目标账户(Account_000)中创建允许Account_001的Lambda执行角色扮演的IAM角色,直接授予account:GetContactInformation权限,同时给Lambda执行角色添加sts:AssumeRole权限来扮演该角色。不过这种方式在多账户场景下维护成本较高,推荐通过管理账户统一管控。
内容的提问来源于stack exchange,提问作者imported

