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

c4u*_*elf 9 amazon-ec2 amazon-web-services

我有几个 EC2 Spot 请求,它们在价格合适时启动 EC2 实例。我希望生成的实例使用 aNameRoletag 进行标记,以便我的配置管理工具知道它是什么类型的机器。

更新

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

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

pip install boto

将 IAM 角色分配给 EC2 实例

您正在启动的实例必须有某种方式来访问有关 Spot 请求的信息。使用 IAM 角色或将访问密钥提供给您的实例。我附加到我使用的 IAM 角色的策略是:

{
    "Statement": [
        {
            "Action": [
                "ec2:CreateTags",
                "ec2:DescribeTags",
                "ec2:DescribeInstances"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ],
            "Sid": "Stmt1432737176000"
        }
    ],
    "Version": "2012-10-17"
}
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

Ant*_*ace 11

Spot 实例请求是一种 EC2 资源。AWS 文档指出,这种类型的资源可以被标记,但生成的标记不会转移到实际实例中:

您为 Spot 实例请求创建的标签仅适用于请求。这些标签不会自动添加到 Spot 服务为满足请求而启动的 Spot 实例。您必须在创建 Spot 实例请求时或在 Spot 实例启动后自行将标签添加到 Spot 实例。

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

  • 创建的实例上的用户数据脚本:编写一个用户数据脚本,该脚本使用命令行工具和EC2 元数据服务,以允许实例发现其实例 ID 并为自己创建标签。您可以使用 AWS CLI create-tags来标记您的任何 EC2 资源。或者,您可以将其作为您打算使用的任何操作系统的启动脚本烘焙到 AMI 中。在任一情况下,实例都必须具有足够的权限才能为自己创建 EC2 标签。
  • 监控您的 Spot 请求的外部实用程序:您可以使用 AWS 开发工具包之一来监控您的 Spot 请求并在实例创建后对其进行标记。AWS在“How to Tag Your Spot Requests and Instances”标题下有一个关于这个主题的教程。无需太冗长,这仅涉及轮询Describe Spot Instance Requests直到创建的 Instance Id 可用,然后调用Create Tags


小智 5

您现在可以在创建 Spot 队列请求时向 SpotFleetLaunchSpecification 提供标签,这些标签将自动应用于该队列中的新实例。

http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotFleetLaunchSpecification.html