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

Posted

技术标签:

【中文标题】如何在我的新 CloudFormation 模板中引用现有角色?【英文标题】:How can I reference an existing role in my new CloudFormation template? 【发布时间】:2020-07-12 16:02:41 【问题描述】:

在我的 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 模板时,我不断收到“无法检索外部值”错误...我尝试输入角色名称“CloudOps”作为参数“默认”,并且我已经还尝试在那里输入角色 ARN ......没有任何效果。

【问题讨论】:

您能否提供显示的模板的相关部分,即您引用AdditionalExecutionRoleParameter 的方式和位置? 当然...我将它与其他角色一起引用:,“角色”:[“Ref”:“NewRoleNoProblem”,“Ref”:“AdditionalExecutionRoleParameter”]将策略附加到我在模板中创建的新角色没有问题;问题是如何附加到我的模板未创建的帐户中的现有角色 啊,我明白了。 @jarmod 已经指出了这个问题。可以使用String数据类型代替AWS::IAM::Role传递角色。 对不起,我应该提到我已经尝试过了......我在尝试部署时收到此错误:角色名称的指定值无效。它必须仅包含字母数字字符和/或以下字符:+=,.@_-(服务:AmazonIdentityManagement;状态代码:400;错误代码:ValidationError;请求 ID:f2958ace-4cf8-4079-a447-eb3fe3bbe8e0)我是什么d 输入的是角色 ARN,使用 * 作为帐户 ID,因此我可以部署到多个帐户。还有其他想法吗? 那可能是……谢谢您的建议!我对 CFT 非常熟悉,但对宏等不太熟悉,或者我如何使用我的模板以有用的方式实现它。我得调查一下。 【参考方案1】:

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

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

AWS::EC2::VPC::Id 列表<:ec2::vpc::id> AWS::SSM::参数::名称

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

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

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

这是一个 JSON 示例,说明如何创建新的 IAM 策略(允许 mybucket/* 上的 s3:Get*)并将其与现有 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"
          
        ]
      
    
  

【讨论】:

那么有没有其他方法可以引用我现有的角色并为其附加新策略?我很确定一定有办法做到这一点...我不可能是第一个通过 CloudFormation 创建新策略并希望将它们附加到现有角色的人... 例如,您应该能够使用AWS::IAM::Policy 创建一个策略,并将其Roles 属性设置为一个列表,其中包括要应用该策略的角色的名称。该名称可以来自参数。注意:我没有测试过这个确切的案例。 这就是我一直试图做的,但没有成功。 :) "String" 数据类型和 * 用于帐户 ID 的错误是由于帐户 ID 保留为 *,但我确实需要找到一种方法来创建不必调用帐户 ID 的参数,因为它会在不同的帐户中发生变化。 您可以在模板中的任何位置使用AWS::AccountId 作为伪参数,例如!Ref "AWS:: AccountId"!Sub 'arn:aws:ec2:$AWS::Region:$AWS::AccountId:vpc/$vpc'。但是,也就是说,该策略只需要一个角色名称,而不是 ARN,afaik。 我没有关注...我正在寻找如何在参数中使用它,而 Params 不支持诸如 !Sub 或 !Ref 之类的内在值(尽管我可以使用它在政策中引用它们)。 AWS::AccountId 在哪里适合以下内容? "AWSTemplateFormatVersion": "2010-09-09", "Description": "需要添加限制性策略的现有角色的名称", "Parameters": "AdditionalExecutionRoleParameter": "Type": "String", "默认值": "arn:aws:iam::aws*:role/CloudOperationsExecutionRole" 【参考方案2】:

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

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

【讨论】:

是的,当然,您始终可以显式提供参数值。我的回答与以下功能有关:a) 验证参数值是否属于特定资源类型,而不仅仅是字符串;b) 在 CloudFormation 控制台中为您提供所述资源类型的方便下拉列表。

以上是关于如何在我的新 CloudFormation 模板中引用现有角色?的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS CloudFormation 模板中,如何使用自己的 Id 标记 EC2 实例而不会出现循环引用错误?

如何在 Cloudformation 中编写基于资源的策略

使用 cloudformation 模板的 AWS Lambda 的动态环境变量

如何使用 cloudformation 模板创建 cloudwatch 事件?

AWS:使用 cloudformation 模板将 WAF 附加到 api 网关

在 CloudFormation 中将 Cognito 验证类型设置为链接