Cloudformation puis-je créer un nouveau rôle référençant une politique existante?

10

Pour le moment, j'ai un compartiment S3 partagé qui a un accès spécifique à des chemins de clé particuliers (c'est-à-dire des dossiers) pour différentes instances. J'ai pu créer un profil d'instance avec mon nouveau rôle et ne tester aucun problème limitant l'accès à ce dossier.

Mon problème est qu'il existe un rôle générique existant avec des stratégies définies, que je souhaite également pouvoir inclure dans mon nouveau rôle pour chaque pile.

Dans Cloudformation, est-il possible d'inclure des politiques définies dans un rôle à inclure dans un autre rôle sans avoir à redéfinir le document de politique dans le nouveau rôle?

Quelque chose comme ceci:

"AppTierS3AccessRole": {
        "Type": "AWS::IAM::Role",
        "Properties": {
            "AssumeRolePolicyDocument": {
                "Statement": [
                    {
                        "Effect": "Allow",
                        "Principal": {
                            "Service": [ "ec2.amazonaws.com" ]
                        },
                        "Action": [ "sts:AssumeRole" ]
                    }
                ]
            },
            "Path": "/",
            "Policies": [ { "Ref": "existing-policy" } ]
        }
    },

La "politique existante" étant la partie importante ici. J'ai essayé de trouver l'arn de la politique existante pour essayer de la référencer mais je suis un peu coincé.

Hughmcmanus
la source
La même solution pourrait probablement être complétée en ajoutant plusieurs rôles aux profils d'instance, mais d'après ce que j'ai lu, il y a une limitation que vous ne pouvez spécifier qu'un seul rôle par profil d'instance.
hughmcmanus

Réponses:

12

src: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html

Les AWS::IAM::Roletypes ont maintenant un ManagedPolicyArnschamp où vous pouvez définir cela. Il vous suffit de saisir l'ARN (facile à saisir depuis la console IAM) et de le placer dans ce champ. Dans l'exemple ci-dessous, j'ai créé un rôle qui fournit un accès ECR en lecture seule afin que mon image puisse extraire des conteneurs Docker d'ECR.

  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
John Eikenberry
la source
4

Vous pouvez y parvenir en utilisant des stratégies gérées . Placez la stratégie définie que vous souhaitez partager dans une stratégie gérée par le client, puis associez cette stratégie définie à chaque rôle où vous souhaitez l'utiliser. Toute modification future de votre stratégie gérée sera immédiatement appliquée à tous les rôles auxquels la stratégie gérée est attachée.

Vous pouvez soit créer la stratégie gérée par le client dans CloudFormation, via une ressource AWS :: IAM :: ManagedPolicy , soit attacher une stratégie gérée existante.

Markusk
la source
3
Pouvez-vous montrer comment dans Cloudformation?
lony
1

Pour développer la réponse de @ markusk concernant les politiques gérées - oui, cela.

Exemple:

"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": [
        ...
      ]
    }
  }
}
Peter Mounce
la source
-1

Non, vous ne pouvez pas intégrer un rôle dans un autre pour le moment. Les seules alternatives auxquelles je peux penser sont:

  • Créez un nouveau profil d'instance avec AWS :: IAM :: InstanceProfile et affectez-lui le rôle générique existant.
  • Avant de créer votre pile CloudFormation, exécutez un script qui duplique le rôle générique. Par exemple, il crée un nouveau rôle, répertorie toutes les stratégies pour le rôle générique existant et les recrée dans le nouveau rôle. Ensuite, vous pouvez attribuer le nouveau rôle à une nouvelle ressource AWS :: IAM :: InstanceProfile dans votre modèle et l'utiliser pour vos instances EC2 ou lancer des configurations.
dialt0ne
la source
J'ai fini par faire quelque chose de similaire à votre deuxième suggestion. J'ai déplacé les stratégies du rôle générique dans le modèle de cloudformation, puis je les ai ajoutées au nouveau rôle s'il doit être créé.
hughmcmanus
Bien que cette réponse soit correcte lorsqu'elle est écrite, elle l'est plus longtemps, car AWS a introduit des stratégies gérées depuis lors, vous permettant de réutiliser des stratégies.
Markusk