我可以使用Cloudformation创建一个引用现有策略的新角色吗?


10

目前,我有一个共享的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" } ]
        }
    },

“现有政策”是这里的重要组成部分。我试图找到现有政策的秘诀,以尝试和参考它,但是我有点卡住了。


通过向实例概要文件添加多个角色可以完成相同的解决方案,但是据我所读,有一个限制,即您只能为每个实例概要文件指定一个角色。
hughmcmanus 2014年

Answers:


12

src: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

4

您可以通过使用托管策略来实现。将要共享的已定义策略放在客户管理的策略中,然后将该已定义策略附加到要使用它的每个角色。您对托管策略的任何将来更改都将立即应用于附加了托管策略的所有角色。

您可以通过AWS :: IAM :: ManagedPolicy资源在CloudFormation中创建客户托管策略,也可以附加现有的托管策略。


3
您能展示如何在Cloudformation中吗?
lony

1

要扩展@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": [
        ...
      ]
    }
  }
}

-1

不可以,您目前不能在另一个角色中嵌入一个角色。我能想到的唯一选择是:

  • 使用AWS :: IAM :: InstanceProfile创建新的实例配置文件,并将现有的通用角色分配给它。
  • 在创建CloudFormation堆栈之前,运行一个脚本来复制通用角色。例如,它将创建一个新角色,列出现有通用角色的所有策略,然后在新角色中重新创建它们。然后,您可以将新角色分配给模板中的新AWS :: IAM :: InstanceProfile资源,并将其用于EC2实例或启动配置。

我最终做了与您的第二个建议类似的事情。我将通用角色中的策略移至cloudformation模板中,然后在需要创建时将其添加到新角色中。
hughmcmanus 2014年

尽管此答案在撰写时是正确的,但由于从那时起AWS引入了托管策略,您可以重用策略,因此答案更长。
markusk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.