在 AWS CloudFormation 模板中,如何使用自己的 ID 标记 EC2 实例而不会出现循环引用错误?
In an AWS CloudFormation template, how can I tag an EC2 instance with it's own Id without getting circular reference errors?
我在我的 CloudFormation 模板中指定了一个 EC2 实例,我想用它自己的 InstanceId 标记它,如下所示:
"Resources": {
"myInstance": {
...
"Tags": [
{ "Key": "instance.id", "Value": { "Ref": "myInstance" } },
...
]
}
}
但是尝试从此模板创建堆栈会生成 AmazonCloudFormationException
:"Circular dependency between resources: [myInstance]"
运行 个实例并使用 EC2 API 标记它们非常简单:
//this is C#, but that's not significant
var instance = ec2Client.RunInstances(...) ...;
var id = instance.InstanceId;
ec2Client.CreateTags(new CreateTagRequest
{
Resources = { id },
Tags = { new Tag { Key = "instance.id", Value = id } }
});
这种方法自然产生于这样一个事实,即实例标签不能作为 RunInstances
操作的一部分创建,因此 所有 标签,而不仅仅是自我标识符,必须在后续 API 操作中应用。
那么...我可以使用 CloudFormation 完成同样的事情吗?非常感谢!
我认为你做不到。 CloudFormation 只允许您在创建时标记资源,而您想要的标记值在资源创建之前不存在。
但我不认为这一定是个问题。我能想到的两个标签用例是查看一个实例并查看标签值,或者查找具有特定标签值的实例。您可以通过 instance-id 查看或查找,而无需包含它的标签。
您始终可以创建一个启动脚本,它会在启动后更新实例的标签。您可以使用以下 (AWS CLI):
aws ec2 create-tags --resources `wget -q -O - http://169.254.169.254/latest/meta-data/instance-id` --tags Key=id,Value=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
但是,如果您只想在应用程序中使用实例 ID,则可以使用 wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
来获取实例 ID。
我在我的 CloudFormation 模板中指定了一个 EC2 实例,我想用它自己的 InstanceId 标记它,如下所示:
"Resources": {
"myInstance": {
...
"Tags": [
{ "Key": "instance.id", "Value": { "Ref": "myInstance" } },
...
]
}
}
但是尝试从此模板创建堆栈会生成 AmazonCloudFormationException
:"Circular dependency between resources: [myInstance]"
运行 个实例并使用 EC2 API 标记它们非常简单:
//this is C#, but that's not significant
var instance = ec2Client.RunInstances(...) ...;
var id = instance.InstanceId;
ec2Client.CreateTags(new CreateTagRequest
{
Resources = { id },
Tags = { new Tag { Key = "instance.id", Value = id } }
});
这种方法自然产生于这样一个事实,即实例标签不能作为 RunInstances
操作的一部分创建,因此 所有 标签,而不仅仅是自我标识符,必须在后续 API 操作中应用。
那么...我可以使用 CloudFormation 完成同样的事情吗?非常感谢!
我认为你做不到。 CloudFormation 只允许您在创建时标记资源,而您想要的标记值在资源创建之前不存在。
但我不认为这一定是个问题。我能想到的两个标签用例是查看一个实例并查看标签值,或者查找具有特定标签值的实例。您可以通过 instance-id 查看或查找,而无需包含它的标签。
您始终可以创建一个启动脚本,它会在启动后更新实例的标签。您可以使用以下 (AWS CLI):
aws ec2 create-tags --resources `wget -q -O - http://169.254.169.254/latest/meta-data/instance-id` --tags Key=id,Value=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
但是,如果您只想在应用程序中使用实例 ID,则可以使用 wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
来获取实例 ID。