如何在CloudFormation编写AWS IAM策略时添加环境判断条件
实现方案
下面是两种生产环境常用的实现方案,可根据你的权限复杂度选择:
方案1:单策略内用!If动态注入语句(推荐,适合逻辑简单的场景)
直接复用你已经定义的环境判断条件,在Statement数组内通过!If函数控制是否追加dev专属权限,修改后的模板示例如下:
Parameters: environment: Type: String Default: dev AllowedValues: - dev - prd Conditions: isDev: !Equals [ !Ref environment, dev] # 注意原模板这里的条件关键字是复数Conditions,单数会报错,记得修正 Resources: StandAlonePolicy: Type: AWS::IAM::Policy Properties: PolicyName: "s3-policy" PolicyDocument: Version: "2012-10-17" Statement: # 所有环境通用的权限语句 - Effect: Allow Resource: "*" Action: - "s3:Get*" # dev环境额外追加的权限语句 - !If - isDev - Effect: Allow Resource: "*" Action: - "s3:List*" # 替换为你实际需要的dev专属权限 - !Ref AWS::NoValue # 非dev环境时这条语句不会被生成
方案2:拆分独立的dev专属策略(适合dev权限逻辑复杂的场景)
把dev专属的权限单独做成一个Policy资源,给资源加上Condition: isDev配置,只有dev环境时这个资源才会被创建,prd环境自动忽略,后续维护权限更清晰:
Parameters: environment: Type: String Default: dev AllowedValues: - dev - prd Conditions: isDev: !Equals [ !Ref environment, dev] Resources: # 所有环境通用的基础策略 BaseS3Policy: Type: AWS::IAM::Policy Properties: PolicyName: "s3-base-policy" PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Resource: "*" Action: - "s3:Get*" # 仅dev环境生效的额外策略 DevS3Policy: Type: AWS::IAM::Policy Condition: isDev # 只有isDev为true时才会创建该资源 Properties: PolicyName: "s3-dev-policy" PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Resource: "*" Action: - "s3:List*" # 替换为你实际的dev专属权限
额外注意点
- 生产环境建议尽量缩小IAM权限的Resource范围,不要直接用
*,避免权限溢出 - 如果dev专属策略超过3条,优先选方案2拆分,后续迭代权限时不易误改通用配置
内容的提问来源于stack exchange,提问作者ozil
相关产品推荐
相关产品推荐

