如何在AWS::IAM::Role策略语句中引用SAM Conditions?
问题分析与解决方法
你混淆了CloudFormation模板层面的Conditions和IAM策略内的Condition这两个完全不同的概念:
- CloudFormation的
Conditions是用来控制资源是否被部署的模板逻辑,只能在资源定义的Condition字段中引用(比如决定某个Lambda要不要创建)。 - IAM策略里的
Condition是权限规则的一部分,用来控制权限何时生效,必须遵循IAM策略的语法,不能直接引用CloudFormation的Conditions。
所以你直接在IAM策略里写Condition: TagsPolicy会导致IAM解析失败,因为它不认识这个CloudFormation层面的条件名称。
正确的写法
把IAM策略里的Condition逻辑直接展开,用IAM支持的语法来写:
DownloadBrokerageNotesStateMachineExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - !Sub states.${AWS::Region}.amazonaws.com Action: "sts:AssumeRole" Path: "/" Policies: - PolicyName: LambdaExecute PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "lambda:InvokeFunction" Resource: - !GetAtt RicoRobotAuthenticateFunction.Arn Condition: And: - StringEquals: "aws:ResourceTag/Joba:Product": !Ref Product - StringEquals: "aws:ResourceTag/Joba:Environment": !Ref Environment
关于SAM Validate的警告
W8001 Condition TagsPolicy not used是因为你定义的CloudFormation TagsPolicy条件没有在任何资源的Condition字段中被引用(比如Resource: ... Condition: !Condition TagsPolicy)。如果这个条件只是用来做IAM策略的逻辑,那可以直接删除模板里的Conditions部分;如果其他资源需要用到这个条件判断,保留即可,不影响部署。
内容的提问来源于stack exchange,提问作者JobaDiniz
相关产品推荐
相关产品推荐

