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



我一直在尝试以 YAML 格式编写许多 AWS 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 就不会尝试将它们作为模板的一部分进行解析?

经过一番搜索,我遇到了以下Reddit帖子,其中提到了同样的问题:通过YAML模板创建无MFA无访问权限策略 - 替换问题

对此线程的回复引用了以下 AWS CloudFormation 文档:筛选器视图:Fn::Sub,其中指出:

要按字面意思书写美元符号和大括号 (${}(,请在左大括号后添加一个感叹号 (!(,例如 ${!文字}。AWS CloudFormation 将此文本解析为 ${Literal}。

这可用于转义策略变量。

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

相关内容

  • 没有找到相关文章

最新更新