如何在AWS CloudFormation YAML模板中转义策略变量

时间:2018-04-06 09:22:48

标签: amazon-web-services yaml amazon-cloudformation amazon-iam

我一直在尝试以YAML格式编写一些AWS CloudFormation模板。

我一直遇到CloudFormation尝试解析IAM策略变量(例如${aws:username})和替换的问题。一个例子如下:

CommonUserGroup:
  Type: AWS::IAM::Group
  Properties:
    GroupName: Common
    Path: /project/
    Policies:
      - PolicyName: ClusterPolicy
        PolicyDocument:
          Version: 2012-10-17
          Statement:
            - Effect: Allow
              Action: "iam:GetAccountPasswordPolicy"
              Resource: "*"
            - Effect: Allow
              Action: "iam:ChangePassword"
              Resource: !Sub 'arn:aws:iam::${AWS::AccountId}:user/${aws:username}'

当使用CloudFormation模板尝试创建堆栈时,会返回以下错误:

Template validation error: Template format error: Unresolved resource dependencies [aws:username] in the Resources block of the template

如果我手动指定用户名,而不是使用策略变量,例如:

'arn:aws:iam::${AWS::AccountId}:user/bob'

然后错误就消失了。

有没有办法可以逃避政策变量,以便CloudFormation不会尝试将它们作为模板的一部分进行解析?

1 个答案:

答案 0 :(得分:5)

经过一番搜索,我发现了以下Reddit帖子,其中提到了同样的问题:Creating No MFA No Access policy via YAML template - substitution issues

对此线程的回复引用了以下AWS CloudFormation文档:Filter View: Fn::Sub,其中声明:

  

要从字面上书写一个美元符号和花括号($ {}),请在打开的花括号后面添加一个感叹号(!),例如$ {!Literal}。 AWS CloudFormation将此文本解析为$ {Literal}。

这可用于转义政策变量。

因此,在我的问题示例中,${aws:username}可以在YAML中转义为${!aws:username}