如何在单个AWS账户创建策略并共享至多账户的IAM角色?
AWS跨账户IAM策略&角色共享实现方案
原模板问题修正
你提交的原有CloudFormation模板存在属性归属错误:
AssumeRolePolicyDocument、ManagedPolicyArns是AWS::IAM::Role资源的专属属性,不能写在AWS::IAM::Policy资源的配置中- 托管策略ARN拼写错误,官方
AmazonEC2ReadOnlyAccess策略名称少写了末尾的c
核心实现逻辑
针对你的需求,我们采用以下方案实现:
- 使用
CommaDelimitedList类型参数接收多环境(Prod/Dev/Sandbox)的12位AWS账号ID,支持手动录入 - 支持批量绑定AWS托管策略到创建的角色,也支持自定义策略跨账户共享给其他环境的角色使用
- 通过CloudFormation原生
Fn::ForEach循环能力,批量创建多个角色,无需重复编写资源块
完整可运行CloudFormation模板
AWSTemplateFormatVersion: '2010-09-09' Description: '跨账户共享IAM角色/策略' Metadata: Version: 1.0 Parameters: # 多角色名称列表,逗号分隔 RoleNames: Type: CommaDelimitedList Default: R_EC2-Describe-Instance,R_S3-ReadOnly Description: 要创建的IAM角色名称列表,多个用逗号分隔 # 中心账户ID MainAccountId: Type: String Default: 111111111111 MaxLength: 12 MinLength: 12 Description: 部署当前模板的中心AWS账户ID # 多环境账号列表,逗号分隔 EnvAccountIds: Type: CommaDelimitedList Default: 222222222222,333333333333,444444444444 Description: Prod/Dev/Sandbox环境的AWS账号ID列表,多个用逗号分隔 # AWS托管策略ARN列表,逗号分隔 ManagedPolicyArns: Type: CommaDelimitedList Default: arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess,arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess Description: 要绑定到角色的AWS托管策略ARN列表,多个用逗号分隔 # 转换能力声明,开启ForEach循环 Transform: AWS::LanguageExtensions Resources: # 批量创建多个IAM角色 Fn::ForEach::Roles: - RoleName: !Ref RoleNames - "${RoleName}": Type: AWS::IAM::Role Properties: RoleName: !Ref RoleName # 绑定AWS托管策略 ManagedPolicyArns: !Ref ManagedPolicyArns # 配置跨账户AssumeRole权限 AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: !Split [ ",", !Join [ ",root,arn:aws:iam::", [ "", !Join [ ",", !Ref EnvAccountIds ], ":root" ] ] ] Action: sts:AssumeRole # 可选:创建自定义共享策略,允许其他环境账户的角色附加该策略 SharedCustomPolicy: Type: AWS::IAM::ManagedPolicy Properties: ManagedPolicyName: CoreSVC-Common-Policy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - 'ec2:DescribeInstances' - 'ec2:DescribeVpcs' Resource: "*" # 配置策略共享权限,允许所有环境账户的角色附加该策略 PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - 'iam:AttachRolePolicy' - 'iam:DetachRolePolicy' Resource: !Split [ ",", !Join [ ",role/*,arn:aws:iam::", [ "", !Join [ ",", !Ref EnvAccountIds ], ":role/*" ] ] ]
使用说明
- 将模板部署到你作为中心节点的AWS账户中
- 部署时按需修改参数:
- 手动输入所有需要授权的Prod、Dev、Sandbox环境的12位AWS账号ID,多个用英文逗号分隔
- 调整需要绑定的AWS托管策略ARN列表,多个用英文逗号分隔
- 调整需要创建的角色名称列表,多个用英文逗号分隔
- 部署完成后,所有配置的环境账户的根身份、用户或角色都可以调用
sts:AssumeRole接口获取中心账户对应角色的访问权限 - 若使用可选的自定义共享策略,你可以将该策略的ARN提供给各个环境账户的管理员,直接附加到对应环境的角色上使用
内容的提问来源于stack exchange,提问作者T Paul Manohar
相关产品推荐
相关产品推荐

