目前我有一个共享的 S3 存储桶,它对不同实例的特定关键路径(即文件夹)具有特定访问权限。我已经能够使用我的新角色创建实例配置文件,并且测试限制对该文件夹的访问没有问题。
我的问题是,存在一个具有定义策略的现有通用角色,我也希望能够将其包含在每个堆栈的新角色中。
在 cloudformation 中,是否可以将一个角色中定义的策略包含在另一个角色中,而无需在新角色中重新定义策略文档?
类似下面的内容:
"AppTierS3AccessRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [ "ec2.amazonaws.com" ]
},
"Action": [ "sts:AssumeRole" ]
}
]
},
"Path": "/",
"Policies": [ { "Ref": "existing-policy" } ]
}
},
“现有政策”是这里的重要部分。我曾尝试找到现有政策的根源并尝试引用它,但我有点不知所措。
答案1
来源:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html
类型AWS::IAM::Role
现在有一个ManagedPolicyArns
字段,您可以在其中设置它。您只需获取 ARN(可从 IAM 控制台轻松获取)并将其放在该字段中。在下面的示例中,我创建了一个提供只读 ECR 访问权限的角色,以便我的映像可以从 ECR 中提取 docker 容器。
ecrRole:
Type: AWS::IAM::Role
Properties:
Path: "/"
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- sts:AssumeRole
答案2
您可以使用以下方法实现此目的托管政策。将您想要共享的已定义策略放入客户托管策略中,然后将该已定义策略附加到您想要使用它的每个角色。对托管策略的任何未来更改都将立即应用于附加了托管策略的所有角色。
您可以通过 CloudFormation 创建客户管理策略,AWS::IAM::管理策略资源,或者附加现有的托管策略。
答案3
扩展@markusk 关于“管理政策”的回答 - 是的。
例子:
"ManagedPolicy": {
"Type": "AWS::IAM::ManagedPolicy",
"Properties": {
"Description": "something descriptive",
"Groups": [ ... ref(s) for groups ... ],
"Roles: [{"Ref":"AppTierS3AccessRole"}],
"Users": [ ... ref(s) for users ... ],
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
...
]
}
}
}
答案4
不可以,目前您无法将一个角色嵌入另一个角色。我能想到的唯一替代方案是:
- 使用以下方式创建新的实例配置文件AWS::IAM::实例配置文件并为其分配现有的通用角色。
- 在创建 CloudFormation 堆栈之前,运行一个复制通用角色的脚本。例如,它会创建一个新角色,列出现有通用角色的所有策略,并在新角色中重新创建它们。然后,您可以将新角色分配给新角色AWS::IAM::实例配置文件模板中的资源并将其用于您的 EC2 实例或启动配置。