如何在EC2实例中使用现有的IAM角色,而不是在我的CloudFormation模板中创建新角色?
例如,我在AWS Console中创建了一个角色,只想使用它。
答案 0 :(得分:24)
您可以使用现有的InstanceProfile,而不是从堆栈中创建新的InstanceProfile。事实上,可能已经为您创建了一个 - 来自the docs:
如果您使用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",
...
}
}
}
答案 1 :(得分:21)
您需要实例配置文件,角色和实例信息(或启动配置)本身。
您的实例配置文件如下所示:
"Resources" : {
"InstanceProfile" : {
"Type" : "AWS::IAM::InstanceProfile",
"Properties" : {
"Path" : "/",
"Roles" : ["MyExistingRole"]
}
},
"Instance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"IamInstanceProfile" : {"Ref" : "InstanceProfile"}
...
}
}
特别注意 - 实例配置文件中的引用是现有的RoleName
此外 - I've written about bootstrapping instances使用实例配置文件和角色来确保我们不会保持安全。
关键是使用{“Ref”:RoleName}等来使用角色的实际名称。
答案 2 :(得分:0)
你想用IAM角色做什么?
我有一个需要访问受限制的S3存储桶的cfn脚本。我的实例块看起来像这样 - 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"
}
}
答案 3 :(得分:0)
只需将在 Amazon 控制台中创建的现有角色名称输入到 EC2 资源 IamInstanceProfile 属性即可。
Resources:
TestEC2Instace:
Type: AWS::EC2::Instance
InstanceType: t2.micro
IamInstanceProfile: ExistingRoleName
Tags:
- Key: Name
Value: Public Instance
答案 4 :(得分:0)
对于那些使用启动模板的人来说,与 ec2instance 或启动配置相比,语法略有不同。
以下是您使用启动模板的 yaml 示例。
LaunchTemplate:
Properties:
LaunchTemplateData:
IamInstanceProfile:
Name: !Ref ExistingInstanceProfileName