如何在 IAM 策略文档中使用 AWS CloudFormation 伪参数

问题描述

我正在使用 AWS CloudFormation(基于 YAML)来部署 IAM 角色。应允许此角色部署其他 CloudFormation 资源,并将其作为受信任实体部署到的 AWS 账户的根。 我正在尝试使用内置伪参数 AWS::AccountId 提供帐户 ID: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html#cfn-pseudo-param-accountid .

这是我按照官方文档尝试过的:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html(仅显示我的 CFN 模板的 resources 部分):

Resources:
  IAMRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action: ["sts:AssumeRole"]
            Effect: Allow
            Principal:
              Service: [cloudformation.amazonaws.com]
              AWS: arn:aws:iam::AWS::AccountId:root  # <-- ERROR HERE !

由于 CloudFormation 堆栈中的 MalformedPolicyDocument(在 AWS 管理控制台中的 Invalid principal 下)导致 Events 错误

Invalid principal in policy: "AWS":"arn:aws:iam::AWS::AccountId:root" (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument

我尝试改变 AWS Principal 值的语法:

  • 带引号和不带引号
  • 带和不带方括号

校长的错误在哪里,如何改正?

解决方法

我们需要对 AWS::Region、AWS::AccountId、AWS::StackName 等变量使用 Intrinsic functions !Sub

AWS: !Sub arn:aws:iam::${AWS::AccountId}:root