web-dev-qa-db-fra.com

Associer un rôle IAM existant à une instance EC2 dans CloudFormation

Comment puis-je utiliser un rôle IAM existant pour une instance EC2, au lieu d'en créer un nouveau dans mon modèle CloudFormation?

Par exemple, j'ai créé un rôle dans AWS Console et je veux juste l'utiliser.

16
Bevan

Vous avez besoin d'un profil d'instance, d'un rôle et des informations d'instance (ou configuration de lancement) elle-même.

Votre profil d'instance ressemblerait à ceci:

"Resources" : {
  "InstanceProfile" : {
    "Type" : "AWS::IAM::InstanceProfile",
    "Properties" : {
      "Path" : "/",
      "Roles" : ["MyExistingRole"]
    }
  },

  "Instance" : {
    "Type" : "AWS::EC2::Instance",
    "Properties" : {
      "IamInstanceProfile" : {"Ref" : "InstanceProfile"}
      ...
    }
  }

En particulier - notez que la référence dans le profil d'instance est à un nom de rôle existant

Aussi - j'ai écrit sur les instances d'amorçage qui utilise des profils d'instance et des rôles pour s'assurer que nous ne persistons pas la sécurité.

L'essentiel est plutôt que d'utiliser le {"Ref": RoleName} etc., pour utiliser le nom réel du rôle.

25
Pete - MSFT

Vous pouvez utiliser un profil d'instance existant au lieu d'en créer un nouveau à partir de la pile. En fait, un peut déjà être créé pour vous - à partir de la documentation :

Si vous utilisez AWS Management Console pour créer un rôle pour Amazon EC2, la console crée automatiquement un profil d'instance et lui donne le même nom que le rôle.

Cela signifie que vous n'aurez peut-être pas à créer un AWS::IAM::InstanceProfile ressource dans la pile. Notez cependant que:

La console ne crée pas un profil d'instance pour un rôle qui n'est pas associé à Amazon EC2.

Dans ce cas, vous pouvez le faire manuellement depuis l'AWS CLI à l'aide de ces 2 commandes:

aws iam create-instance-profile --instance-profile-name MyExistingRole
aws iam add-role-to-instance-profile --instance-profile-name MyExistingRole --role-name MyExistingRole

Ensuite, à condition que vous ayez défini un rôle dans l'interface utilisateur nommé MyExistingRole, cela suffira:

"Resources" : {

  "Instance" : {
    "Type" : "AWS::EC2::Instance",
    ...
    "Properties" : {
      "IamInstanceProfile" : "MyExistingRole",
      ...
    }
  }
}
25

Qu'essayez-vous de faire avec le rôle IAM?

J'ai un script cfn qui a besoin d'accéder à un compartiment S3 restreint. Mon bloc d'instance ressemble à ceci - bucketName et RoleName sont les deux paramètres, avec des valeurs par défaut:

"Resources" : {
    "myInstance" : {
        "Type" : "AWS::EC2::Instance",

        "Metadata" : {
            "Comment1" : "My Instance stuff here",     

            "AWS::CloudFormation::Authentication": {
                "default" : {
                    "type": "s3",
                    "buckets": [ { "Ref" : "bucketName" } ],
                    "roleName": { "Ref" : "RoleName" }
                }
            },
...snip...

Modifier: j'inclus le rôle dans les propriétés lors de la création de l'instance:

        "Properties" : {
            "ImageId"             : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "64"] },
            "InstanceType"        : { "Ref" : "InstanceType" },
            "SecurityGroups"      : [ {"Ref" : "SecurityGroup"} ],
            "IamInstanceProfile"  : { "Ref" : "RoleName" },
            "KeyName"             : { "Ref" : "KeyName" },

            "BlockDeviceMappings" : [
                {
                    "DeviceName" : "/dev/sda1",
                    "Ebs" : { "VolumeSize" : "10" } 
                }
            ],

            "UserData"            : { "Fn::Base64" : { "Fn::Join" : ["", [
                "#!/bin/bash -v\n",
...snip...
            ] ] } }

Et le RoleName est défini dans ma section Paramètres:

"Parameters" : {

    "RoleName" : {
        "Description" : "Role description",
        "Type" : "String",
        "Default" : "my-default-role",
        "ConstraintDescription" : "Must be a valid IAM Role"
    }
  }
0
chris