将现有IAM角色与CloudFormation中的EC2实例相关联

时间:2013-12-02 13:04:42

标签: amazon-web-services amazon-cloudformation

如何在EC2实例中使用现有的IAM角色,而不是在我的CloudFormation模板中创建新角色?

例如,我在AWS Console中创建了一个角色,只想使用它。

5 个答案:

答案 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