如何在AWS CloudFormation YAML模板中避免策略变量

5

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

然而,在使用替换变量时,例如${aws:username},CloudFormation会出现解析IAM策略变量的问题。以下是一个例子:

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个回答

11

在搜索一番后,我找到了以下Reddit帖子,提到了同样的问题:通过YAML模板创建无MFA无访问策略-替代问题

这个帖子的回复引用了以下AWS CloudFormation文档:过滤器视图:Fn::Sub,该文档指出:

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

这可用于转义策略变量。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接