在没有参数化的情况下在 AWS CloudFormation 中引用 EC2 实例的名称标签

Referencing an EC2 instance's name tag in AWS CloudFormation without parameterization

我有一个 CloudFormation 堆栈,它创建一个 EC2 实例并给它一个名称标签。

我想创建一个 CloudWatch 警报,并在警报名称中引用 EC2 实例的名称 - 类似于 AlarmName: !Sub "Status Check Alarm - ${EC2InstanceName}"

!Ref 将允许我引用 CloudFormation 脚本的参数,但我不想参数化 EC2 实例名称 - 我不希望或不需要它是可定制的,我也不想希望用户能够为服务器选择自定义名称。

我尝试输出 EC2 实例名称,这样我就可以 !Ref,但是我遇到了 Invalid template resource property 'Outputs' 错误,所以我不知道我的方法是否有效:

EC2Instance:
  Properties: ...
  Type: AWS::EC2::Instance
  Outputs:
    EC2InstanceName:
      Description: The server's name.
      Value: !GetAtt EC2Instance.Tags.Name
      Export:
        Name: "EC2InstanceName"

如何在不在脚本顶层参数化名称的情况下引用 EC2 实例的名称?

编辑:

我最终还是使用了参数,所以我可以 !Ref 它们。我想您还可以设置一个“允许值”列表,其中仅包含一个与默认值匹配的值。它很蹩脚,但我想它有效。

Parameters:
  EC2InstanceName:
    Type: String
    Default: "web-server-blah"
    Description: The name of the EC2 instance.

您只能对文档中明确命名的属性使用 !GetAtt https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html 标签不在其中。

但是如果您为您的实例提供不同的标签,那么您甚至可以在不导出它的情况下引用它(前提是它是一个常量值)。

我明白你想做什么,但 AWS 不支持你想开箱即用的一切。我想象的一种实现方式——您可能不喜欢它——是通过宏或自定义资源(lambda 函数)。

不能用就用!Ref EC2Instance?我意识到它不会是友好的“名称”标签值,但它可能更有用,尤其是当您有相同“名称”的重复项时。它会让您的警报类似于“状态检查警报 - i-123456789”。

而如果您使用该名称,它可能更像是 10 个警报,内容为“状态检查警报 - WWWServer”,但现在是哪个 WWWServer?