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

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

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

6 ответов

Решение

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

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

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

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

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

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

Главное - вместо использования {"Ref": RoleName} и т. Д. Использовать фактическое имя роли.

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

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

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

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

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

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

для тех, кто использует шаблоны запуска, синтаксис немного отличается от ec2instance или конфигураций запуска.

ниже приведен пример yaml, в котором вы используете шаблоны запуска.

      LaunchTemplate:
  Properties:
    LaunchTemplateData:
      IamInstanceProfile:
        Name: !Ref ExistingInstanceProfileName

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

У меня есть сценарий cfn, который нуждается в доступе к ограниченному сегменту 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...
            ] ] } }

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

"Parameters" : {

    "RoleName" : {
        "Description" : "Role description",
        "Type" : "String",
        "Default" : "my-default-role",
        "ConstraintDescription" : "Must be a valid IAM Role"
    }
  }
      "Resources" : {
    "Instance" : {
      "Type" : "AWS::EC2::Instance",
       ...
      "Properties" : {
      "IamInstanceProfile" : "MyExistingRole",
    ...
  }
 } 
}

Это не сработало для меня. Получил ошибку в cloudformation. Невозможно назначить имя роли, где ожидается профиль экземпляра. У меня есть 2 разных стека: один создает роль IAM, а другой создает экземпляр EC2.

Я экспортировал RoleName из стека, создающего роль IAM, и в стеке EC2 сослался на него в ролях профиля экземпляра:

      InstanceProfile:
   Type: AWS::IAM::InstanceProfile
   Properties: 
     InstanceProfileName: !Sub ${EnvironmentName}-InstanceProfile
     Path: "/"
     Roles: 
       - Fn::ImportValue: !Sub ${EnvironmentName}-ServerRole

Просто введите имя существующей роли, созданной в консоли Amazon, в свойство IamInstanceProfile ресурса EC2.

      Resources:
  TestEC2Instace:
     Type: AWS::EC2::Instance
     InstanceType: t2.micro
     IamInstanceProfile: ExistingRoleName
     Tags:
       - Key: Name
         Value: Public Instance

        
Другие вопросы по тегам