如何标记和命名由EC2竞价请求启动的EC2实例?


8

我有几个EC2竞价请求,可以在价格合适时启动EC2实例。我希望将生成的实例标记为Name和,Role以便我的配置管理工具知道它是哪种机器。

更新

我接受了Hyper Anthony的建议并将其实施-因为轮询将容易出错并且占用大量资源,所以我向AMI添加了一个启动脚本,该脚本在实例启动时会更新标签,这是我采取的步骤:

确保在您正在使用的任何AMI上安装Boto

pip install boto

将IAM角色分配给EC2实例

您正在启动的实例必须具有某种方式来访问有关竞价请求的信息。使用IAM角色,或者使访问密钥可用于您的实例。我对使用的IAM角色附加的策略是:

{
    "Statement": [
        {
            "Action": [
                "ec2:CreateTags",
                "ec2:DescribeTags",
                "ec2:DescribeInstances"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ],
            "Sid": "Stmt1432737176000"
        }
    ],
    "Version": "2012-10-17"
}

在启动时运行脚本以更新标签

def get_tags_from_spot_request():

    instance_id = boto.utils.get_instance_identity()['document']['instanceId']
    region = boto.utils.get_instance_identity()['document']['region']
    conn = boto.ec2.connect_to_region(region)
    inst = boto.ec2.instance.Instance(connection=conn)
    inst.id = instance_id
    inst.update()
    spot_id = inst.spot_instance_request_id
    tags = conn.get_all_tags(filters={'resource-type': 'spot-instances-request', 'resource-id': spot_id})
    for tag in tags:
        inst.add_tag(tag.name, tag.value)

Answers:


10

竞价型实例请求是一种EC2资源。AWS文档指出,可以标记这种类型的资源,但是不会将结果标记带到实际实例中:

您为竞价型实例请求创建的标签仅适用于请求。这些标记不会自动添加到竞价服务启动以满足请求的竞价型实例中。创建竞价型实例请求或竞价型实例启动后,您必须自己将标签添加到竞价型实例。

因此,您需要在实例启动后添加标签。您在这里有一些选择:

  • 在创建的实例上的用户数据脚本:编写一个使用命令行工具和EC2元数据服务的用户数据脚本,以允许该实例发现其实例ID并为其创建标签。您可以使用AWS CLI 创建标签来标记任何EC2资源。或者,您可以将其作为要使用的任何操作系统的启动脚本烘焙到AMI中。无论哪种情况,该实例都必须具有足够的权限才能为其自身创建EC2标签。
  • 监视您的竞价请求的外部实用程序:您可以使用一个AWS开发工具包(SDK)来监视您的竞价请求,并在实例创建后对其进行标记。AWS 在“如何标记您的竞价请求和实例”标题下提供了有关此主题的教程。不必太冗长,这只涉及轮询“ 描述竞价型实例请求”,直到创建的实例ID可用为止,然后调用“ 创建标签”


1

另一种可能性是使用Ansible作为您的配置管理工具。在ec2模块中,它允许您启动竞价型实例和普通的生命周期实例,可以添加“ instance_tags”属性来创建标签。一个简单的剧本是:


  - name: Provision Spot Instance
    hosts: localhost
    connection: local
    gather_facts: False
    tasks:
      - name: Launch the new Spot Instance
        local_action:
          module: ec2
          spot_price: 0.02
          group: testSG
          instance_type: m3.medium
          image: ami-12345
          wait: true
          instance_tags:
            Name: TagValueForName
            Foo: TagValueForFoo
          region: us-east-1
          keypair: mykeypair

有趣的是,我的抱怨是它只标记实例,而没有标记即期请求,这与您的问题相反。


如果该热点请求超时。竞价请求位于AWS内部,但是如果ansible在实例启动后不再可用以对其进行标记,会发生什么情况?根据剩余的剧本如何处理未标记的实例,是否可能导致“僵尸”实例?
t1m0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.