Связать существующую роль IAM с экземпляром EC2 в CloudFormation

Как я могу использовать существующую роль IAM для экземпляра EC2, а не создавать новую в моем шаблоне CloudFormation?

Например, я создал роль в AWS Console и просто хочу ее использовать.

Ответ 1

Вам нужен профиль экземпляра, роль и информация об экземпляре (или настройка запуска).

Профиль вашего экземпляра будет выглядеть следующим образом:

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

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

В частности - обратите внимание, что ссылка в профиле экземпляра относится к существующему RoleName

Также - Я написал об экземплярах начальной загрузки, в которых используются профили и роли экземпляра, чтобы гарантировать, что мы не сохраняем безопасность.

Главное, а не использовать { "Ref": RoleName} и т.д., чтобы использовать фактическое имя роли.

Ответ 2

Вы можете использовать существующий экземпляр InstanceProfile вместо создания нового изнутри стека. На самом деле, вы уже можете создать для себя - от документы:

Если вы используете консоль управления AWS для создания роли для Amazon EC2, консоль автоматически создает профиль экземпляра и дает ему то же имя, что и роль.

Это означает, что вам необязательно создавать ресурс AWS::IAM::InstanceProfile в стеке. Однако обратите внимание, что также:

Консоль не создает профиль экземпляра для роли, не связанной с Amazon EC2.

В этом случае вы можете сделать это вручную из AWS CLI, используя следующие две команды:

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

Затем, если вы определили роль в пользовательском интерфейсе с именем MyExistingRole, этого будет достаточно:

"Resources" : {

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

Ответ 3

Что вы пытаетесь сделать с ролью IAM?

У меня есть cfn script, которому нужен доступ к ограниченному ведро S3. Мой блок экземпляра выглядит так: bucketName и RoleName являются параметрами со значениями по умолчанию:

"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...

Изменить: я включаю роль как часть свойств при создании экземпляра:

        "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...
            ] ] } }

И имя роли определено в разделе "Параметры":

"Parameters" : {

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