我有几个 EC2 Spot 请求会在价格合适时启动 EC2 实例。我希望生成的实例用 aName
和Role
标签标记,以便我的配置管理工具知道它是什么类型的机器。
更新:
我采纳了 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"
}
在启动时运行脚本以更新标签
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)
Spot 实例请求是一种 EC2 资源。AWS 文档指出,这种类型的资源可以被标记,但生成的标签不会转移到实际实例中:
因此,您需要在实例启动后添加标签。您在这里有一些选择:
现在,您可以在创建现场队列请求时向 SpotFleetLaunchSpecification 提供标签,这些标签将自动应用于该队列中的新实例。
http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotFleetLaunchSpecification.html
另一种可能性是使用 Ansible 作为您的配置管理工具。在 ec2 模块中,您可以启动现货和正常生命周期实例,您可以添加“instance_tags”属性来创建标签。一个简单的剧本是:
有趣的是,我的抱怨是它只标记实例而不标记现场请求,这与您的问题相反。