如何在我的新 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 模板的 AWS Lambda 的动态环境变量
如何使用 cloudformation 模板创建 cloudwatch 事件?