Ref - AWS CloudFormation

Ref

内部函数 Ref 返回指定 参数 资源 的值。使用 AWS::LanguageExtensions 转换 转换时,您可以使用内置函数作为 Ref 和 Fn::GetAtt 的参数。

  • 它在您指定参数逻辑名称时返回参数值。

  • 在您指定资源的逻辑名称时,它会返回一个您一般用于引用该资源的值,如物理 ID

  • 当您指定内置函数时,它会返回该函数的输出。

当您在模板中声明资源且您需要通过名称指定另一个模板资源时,您可以使用 Ref 引用那个其他资源。一般情况下,Ref返回资源的名称。例如,AWS::AutoScaling::AutoScalingGroup 的引用返回该自动扩缩组资源的名称。

对于某些资源,会返回在资源环境中有另一种重要意义的标识符。例如,AWS::EC2::EIP 资源返回 IP 地址,AWS::EC2::Instance 返回实例 ID。

提示

您还可以使用 Ref 将值添加到 CloudFormation 模板的 Outputs 部分语法参考 消息中。

有关特定资源或属性的 Ref 返回值的更多信息,请参阅 资源和属性参考 中该资源或属性的文档。

声明

JSON

{ "Ref" : "logicalName" }
{ "Ref" : "IntrinsicFunction" }

YAML

完整函数名称的语法:

Ref: logicalName
Ref: IntrinsicFunction

短格式的语法:

!Ref logicalName
!Ref IntrinsicFunction

参数

logicalName

您想引用的资源或参数的逻辑名称。

IntrinsicFunction

解析为有效字符串的内置函数。其中应包含对参数或标识符的引用,不应包含资源逻辑标识符。

返回值

参数是 logicalName 时,返回的值是资源的物理 ID 或参数的值。

参数是 IntrinsicFunction 时,返回值是内置函数中的返回值

示例

示例

弹性 IP 地址的以下资源声明需要 EC2 实例的实例 ID,且使用 Ref 函数指定 MyEC2Instance 资源的实例 ID:

JSON

"MyEIP" : { "Type" : "AWS::EC2::EIP", "Properties" : { "InstanceId" : { "Ref" : "MyEC2Instance" } } }

YAML

MyEIP: Type: "AWS::EC2::EIP" Properties: InstanceId: !Ref MyEC2Instance

为多个阶段生成标识符的示例

此示例演示如何使用 Fn::Sub 内置函数替换不同阶段的标识符的值。然后,可以使用 RefFn::GetAtt 函数根据阶段的输入来引用适当的值。Fn::Sub 首先与 Fn::GetAtt 一起使用来获取相应的 Amazon SQS 队列的 ARN,以设置 Amazon CloudWatch 警报的维度。接下来,Fn::JoinRef 一起使用来创建 Stage 参数的逻辑 ID 字符串。

JSON

{ "AWSTemplateFormatVersion": "2010-09-09", "Transform": "AWS::LanguageExtensions", "Parameters": { "Stage": { "Type": "String", "Default": "Dev", "AllowedValues": [ "Dev", "Prod" ] } }, "Conditions": { "isProd": { "Fn::Equals": [ {"Ref": "Stage"}, "Prod" ] }, "isDev": { "Fn::Equals": [ {"Ref": "Stage"}, "Dev" ] } }, "Resources": { "DevQueue": { "Type": "AWS::SQS::Queue", "Condition": "isDev", "Properties": { "QueueName": {"Fn::Sub": "My${Stage}Queue"} } }, "ProdQueue": { "Type": "AWS::SQS::Queue", "Condition": "isProd", "Properties": { "QueueName": {"Fn::Sub": "My${Stage}Queue"} } }, "DevTopic": { "Condition": "isDev", "Type": "AWS::SNS::Topic" }, "ProdTopic": { "Condition": "isProd", "Type": "AWS::SNS::Topic" }, "MyAlarm": { "Type": "AWS::CloudWatch::Alarm", "Properties": { "AlarmDescription": "Alarm if queue depth grows beyond 10 messages", "Namespace": "AWS/SQS", "MetricName": "ApproximateNumberOfMessagesVisible", "Dimensions":[ { "Name": {"Fn::Sub": "${Stage}Queue"}, "Value": {"Fn::GetAtt": [{"Fn::Sub": "${Stage}Queue"}, "QueueName"]} } ], "Statistic": "Sum", "Period": 300, "EvaluationPeriods": 1, "Threshold": 10, "ComparisonOperator": "GreaterThanThreshold", "AlarmActions": [ { "Ref": {"Fn::Join": ["", [{"Ref": "Stage"}, "Topic"]]} } ] } } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Transform: 'AWS::LanguageExtensions' Parameters: Stage: Type: String Default: Dev AllowedValues: - Dev - Prod Conditions: isProd: !Equals - !Ref Stage - Prod isDev: !Equals - !Ref Stage - Dev Resources: DevQueue: Type: 'AWS::SQS::Queue' Condition: isDev Properties: QueueName: !Sub 'My${Stage}Queue' ProdQueue: Type: 'AWS::SQS::Queue' Condition: isProd Properties: QueueName: !Sub 'My${Stage}Queue' DevTopic: Condition: isDev Type: 'AWS::SNS::Topic' ProdTopic: Condition: isProd Type: 'AWS::SNS::Topic' MyAlarm: Type: 'AWS::CloudWatch::Alarm' Properties: AlarmDescription: Alarm if queue depth grows beyond 10 messages Namespace: AWS/SQS MetricName: ApproximateNumberOfMessagesVisible Dimensions: - Name: !Sub '${Stage}Queue' Value: !GetAtt - !Sub '${Stage}Queue' - QueueName Statistic: Sum Period: 300 EvaluationPeriods: 1 Threshold: 10 ComparisonOperator: GreaterThanThreshold AlarmActions: - !Ref 'Fn::Join': - '' - - !Ref Stage - Topic

示例在 Ref 函数中使用 Fn::Sub 内置函数

此示例演示了如何使用 Fn::Sub 内置函数替换 Ref 函数的值。然后,可以使用 RefFn::GetAtt 函数根据阶段的输入来引用适当的值。Fn::Sub 首先用来获取相应 Amazon SNS 主题的 ARN,以设置 Amazon CloudWatch 警报的维度。接下来,Fn::JoinRef 一起使用来创建 Stage 参数的逻辑 ID 字符串。

JSON

{ "AWSTemplateFormatVersion": "2010-09-09", "Transform": "AWS::LanguageExtensions", "Parameters": { "Stage": { "Type": "String", "Default": "Dev", "AllowedValues": [ "Dev", "Prod" ] } }, "Resources": { "TopicDev": { "Type": "AWS::SNS::Topic", "Properties": { "TopicName": "MyTopic" } } }, "Outputs": { "stageOutput": { "Value": { "Ref": { "Fn::Sub": "Topic${Stage}" } } } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Transform: 'AWS::LanguageExtensions' Parameters: Stage: Type: String Default: Dev AllowedValues: - Dev - Prod Resources: TopicDev: Type: 'AWS::SNS::Topic' Properties: TopicName: MyTopic Outputs: stageOutput: Value: !Ref 'Fn::Sub': 'Topic${Stage}'

支持的函数

Ref 函数中使用 AWS::LanguageExtensions 转换 转换时,您可以使用以下函数。