如何在CloudFormation的资源属性中使用条件判断?
解决方案
你原来的写法不被CloudFormation支持的原因是:CloudFormation不允许直接在资源属性的数组内嵌入Condition字段,Condition仅可作用于整个资源,或通过内置条件函数在属性值层面做动态判断,以下是两种可实现需求的方案:
方法1:使用Fn::If内置函数直接动态生成ManagedPolicyArns数组
这种方法适合逻辑简单、仅需少量条件判断的场景,直接在IAM角色的属性内完成配置。
首先需要在模板的Conditions段定义你的判断条件,示例如下:
"Conditions": { "MyCondition": { // 这里替换为你自己的条件判断逻辑,示例为参数EnableEMRAccess等于true时触发 "Fn::Equals": [{"Ref": "EnableEMRAccess"}, "true"] } }
之后修改IAM角色的ManagedPolicyArns配置:
"MyRole": { "Type": "AWS::IAM::Role", "Properties": { "ManagedPolicyArns": { "Fn::If": [ "MyCondition", // 条件为真时返回的策略数组,可同时加入其他固定要绑定的策略 [ {"Ref": "EMRFullAccessManagedPolicy"}, "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess" ], // 条件为假时返回的策略数组,仅包含固定要绑定的策略 [ "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess" ] ] }, "RoleName": "myRole" // 剩余角色属性按需补充 } }
方法2:使用独立的AWS::IAM::ManagedPolicyAttachment资源绑定策略
这种方法逻辑更清晰,适合需要多个条件策略绑定的场景,不会出现数组拼接的冗余代码。
你可以将条件作用于整个策略绑定资源,条件为真时才会创建该绑定资源,自动将指定托管策略绑定到角色上,条件为假时不会创建该绑定:
// IAM角色本身不需要配置条件策略 "MyRole": { "Type": "AWS::IAM::Role", "Properties": { "ManagedPolicyArns": [ // 仅放固定需要绑定的策略即可 "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess" ], "RoleName": "myRole" // 剩余角色属性按需补充 } }, // 单独定义策略绑定资源,添加条件控制 "MyRoleEMRPolicyAttachment": { "Type": "AWS::IAM::ManagedPolicyAttachment", "Condition": "MyCondition", "Properties": { "Roles": [{"Ref": "MyRole"}], "PolicyArn": {"Ref": "EMRFullAccessManagedPolicy"} } }
内容的提问来源于stack exchange,提问作者Nadav Holtzman
相关产品推荐
相关产品推荐

