如何在我的新 CloudFormation 模板中引用现有角色?

How can I reference an existing role in my new CloudFormation template?

在我的 AWS 账户中,我正在构建一个新的 Cloudformation 模板来创建新策略,我想将它们附加到账户中的几个现有角色。 以下是我一直试图引用它们的方式:

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Names of existing roles to which the restrictive policies need added",
    "Parameters": {
        "AdditionalExecutionRoleParameter": {
            "Type": "AWS::IAM::Role",
            "Default": "CloudOps"
        }
    },
    "Resources": { (and so on)

然后在新策略下方的部分中,我一直在尝试引用这些现有角色(在本例中为 "AdditionalExecutionRoleParameter")并使用 Roles 参数将策略附加到它们。但是,我在尝试部署 CloudFormation 模板时不断收到 "failed to retrieve external values" 错误...我尝试输入角色名称 "CloudOps" 作为参数 "Default",然后我我也尝试在那里输入角色 ARN……没有任何效果。

参数 type 字段不支持所有 AWS 资源类型。

完整列表位于 AWS-Specific Parameter Types。它包括,例如:

  • AWS::EC2::VPC::Id
  • 列表
  • AWS::SSM::参数::名称

此列表不包括 AWS::IAM::Role(或任何 IAM 资源)。

如果您只是尝试将新的 IAM 策略与现有的已命名 IAM 角色相关联,请注意 AWS::IAM::Policy 构造具有 Roles 属性 并且您应该提供应用策略的角色名称列表。它需要角色 names,而不是角色 ARNs,因此您不需要帐户 ID。

如果您确实需要帐户 ID,那么它可以作为伪参数使用,您可以从 "Ref" : "AWS::AccountId" 获取它,但我认为您在这里不需要它。

这里有一个 JSON 示例,说明如何创建新的 IAM 策略(允许 s3:Get*mybucket/* 上)并将其与现有的 IAM 角色相关联,您将其名称作为堆栈参数:

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Add policy to role test",
  "Parameters": {
    "TheRoleName": {
      "Type": "String",
      "Default": "CloudOps",
      "Description": "Name of role to associate policy with"
    }
  },
  "Resources": {
    "ThePolicy": {
      "Type": "AWS::IAM::Policy",
      "Properties": {
        "PolicyName": "s3-read",
        "PolicyDocument": {
          "Statement": {
            "Effect": "Allow",
            "Action": [
              "s3:Get*"
            ],
            "Resource": ["arn:aws:s3:::mybucket/*"]
          }
        },
        "Roles": [
          {
            "Ref": "TheRoleName"
          }
        ]
      }
    }
  }
}

嗯...我最终做的就是这么简单的事情,效果很好...

"Parameters": {
    "RoleNameRoleParameter": {
        "Type": "String",
        "Default": "RoleNameRole"