在 AWS CloudFormation 模板中,如何使用自己的 Id 标记 EC2 实例而不会出现循环引用错误?

Posted

技术标签:

【中文标题】在 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? 【发布时间】:2015-07-25 01:29:35 【问题描述】:

我在我的 CloudFormation 模板中指定了一个 EC2 实例,我想用它自己的 InstanceId 对其进行标记,如下所示:

"Resources": 
    "myInstance": 
        ...
        "Tags": [
             "Key": "instance.id", "Value":  "Ref": "myInstance"  ,
            ...
        ]
    

但是尝试从这个模板创建一个堆栈会生成一个AmazonCloudFormationException“资源之间的循环依赖:[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 完成同样的事情吗?非常感谢!

(cross-posted to the AWS Forums)

【问题讨论】:

这个标签的作用是什么? 【参考方案1】:

我不认为你可以。 CloudFormation 仅允许您在创建时标记资源,并且您想要的标记值在资源创建之前不存在。

但我不认为这一定是个问题。我能想到的标签的两个用例是查看实例并查看标签值,或者查找具有特定标签值的实例。您可以通过 instance-id 查看或查找,而无需包含它的标签。

【讨论】:

【参考方案2】:

您始终可以创建一个启动脚本,该脚本将在启动后更新实例的标签。您可以使用以下 (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。

【讨论】:

以上是关于在 AWS CloudFormation 模板中,如何使用自己的 Id 标记 EC2 实例而不会出现循环引用错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CloudFormation 模板中描述 AWS Lambda 函数测试事件?

如何在 AWS Cloudformation 模板文件中获取用户名?

如何使用 aws cloudformation 模板在 aws cognito 用户池中设置所需属性?

aws cloudformation 模板 sns sqs

在 AWS CloudFormation 模板中引用 !Ref DynamoDB 表名

使用CloudFormation模板更新AWS Athena工作组