Свяжите существующую роль 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