如何在指定AWS账户通过CloudFormation创建自定义IAM托管策略
解决方案
1. 修复JSON参数类型问题
CloudFormation参数类型里没有Json这一选项,得把PolicyJson参数改成String类型,再用!DecodeJson函数把输入的JSON字符串解析成合法的JSON对象。另外你模板里的!RefPolicyJson是拼写错误,应该写成!Ref PolicyJson。
修改后的完整模板如下:
AWSTemplateFormatVersion: "2010-09-09" Description: "在指定账户创建自定义IAM托管策略" Parameters: PolicyName: Type: String Description: 自定义策略的名称 PolicyDescription: Type: String Description: 策略描述,创建后无法修改 PolicyJson: Type: String Description: 权限策略的JSON格式字符串,请确保语法正确 AccountID: Type: String Description: 要创建策略的目标AWS账户ID Resources: ManagedPolicy: Type: "AWS::IAM::ManagedPolicy" Properties: ManagedPolicyName: !Ref PolicyName Description: !Ref PolicyDescription Path: "/" PolicyDocument: !DecodeJson !Ref PolicyJson Outputs: PolicyARN: Description: 新创建的托管策略ARN Value: !Ref ManagedPolicy
2. 跨账户创建策略的实现方法
单CloudFormation栈无法直接切换到其他账户创建资源,得用CloudFormation StackSets来实现跨账户部署,具体步骤如下:
前置准备:目标账户配置角色
目标账户中必须创建AWSCloudFormationStackSetExecutionRole角色,这个角色需要满足两个条件:
- 允许主账户的实体扮演它
- 拥有创建、修改IAM托管策略的权限
角色信任策略示例(替换你的主账户ID为实际ID):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的主账户ID:root" }, "Action": "sts:AssumeRole" } ] }
角色权限策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:CreateManagedPolicy", "iam:DeleteManagedPolicy", "iam:UpdateManagedPolicy" ], "Resource": "*" } ] }
部署步骤
- 在主账户的CloudFormation控制台中,创建StackSet,选择上述修改后的模板。
- 配置StackSet时,指定目标账户ID(即参数中的
AccountID),同时填写策略名称、描述、权限JSON字符串等参数。 - 选择部署区域,提交后StackSet会自动在目标账户中扮演指定角色,完成托管策略的创建。
关键注意事项
- 输入
PolicyJson时,直接粘贴格式化后的合法JSON字符串即可,控制台会自动处理格式问题。 - 部署完成后,可在目标账户的IAM控制台查看新策略,也能通过StackSet的输出获取策略ARN。
内容的提问来源于stack exchange,提问作者Ahana26
相关产品推荐
相关产品推荐

