使用伪参数获取 AWS 值 - AWS CloudFormation

使用伪参数获取 AWS 值

伪参数是内置变量,用于提供对重要 AWS 环境信息的访问权限,例如可能因部署或环境的不同而发生变化的账户 ID、区域名称和堆栈详细信息等。

您可以使用伪参数代替硬编码值,以此确保模板更便于移植,更易于跨不同 AWS 账户和区域重复使用。

语法

您可以使用 Ref 内置函数或 Fn::Sub 内部函数来引用伪参数。

Ref

Ref 内置函数使用以下常规语法。有关更多信息,请参阅 Ref

JSON

{ "Ref" : "AWS::PseudoParameter" }

YAML

!Ref AWS::PseudoParameter

Fn::Sub

Fn::Sub 内置函数使用不同的格式,其中包括伪参数周围的 ${} 语法。有关更多信息,请参阅 Fn::Sub

JSON

{ "Fn::Sub" : "${AWS::PseudoParameter}" }

YAML

!Sub '${AWS::PseudoParameter}'

可用伪参数

AWS::AccountId

返回在其中创建堆栈的账户的 AWS 账户 ID,如 123456789012

此伪参数通常用于定义 IAM 角色、策略和其他涉及账户特定 ARN 的资源策略。

AWS::NotificationARNs

返回接收堆栈事件通知的 Amazon SNS 主题的 Amazon 资源名称(ARN)列表。在创建或更新堆栈时,您可以通过 AWS CLI 中的 --notification-arns 选项或通过控制台指定这些 ARN。

与返回单个值的其他伪参数不同,AWS::NotificationARNs 会返回 ARN 列表。要访问列表中的特定 ARN,使用 Fn::Select 内置函数。有关更多信息,请参阅 Fn::Select

AWS::NoValue

如果在 Fn::If 内部函数中指定为返回值,则删除相应的资源属性。有关更多信息,请参阅 Fn::If

如果需要创建只有在特定条件下才会被包含的条件资源属性,此伪参数特别有用。

AWS::Partition

返回资源所处的分区。对于标准 AWS 区域,分区是 aws。对于位于其他分区中的资源,则分区是 aws-partitionname。例如,中国(北京和宁夏)区域中的资源的分区为 aws-cn,AWS GovCloud(US-West)区域中的资源的分区为 aws-us-gov

分区是资源 ARN 的一部分。使用 AWS::Partition 可确保模板在不同的 AWS 分区中正常运行。

AWS::Region

返回代表在其中创建包容性资源的区域的字符串,如 us-west-2

这是最常用的伪参数之一,因为它能让模板适应不同的 AWS 区域,无需另行修改。

AWS::StackId

返回堆栈 ID(ARN),例如 arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123

AWS::StackName

返回堆栈名称,例如 teststack

堆栈名称通常用于创建唯一资源名称,方便轻松识别出相应堆栈。

AWS::URLSuffix

返回堆栈部署所在的 AWS 区域中的 AWS 域后缀。后缀通常为 amazonaws.com,但中国(北京)区域的后缀为 amazonaws.com.cn

在为 AWS 服务端点构建 URL 时,此参数特别有用。

示例

基本用法

以下示例创建了两个资源:一个 Amazon SNS 主题和一个向该主题发送通知的 CloudWatch 警报。它们使用 AWS::StackNameAWS::RegionAWS::AccountId 将堆栈名称、当前 AWS 区域和账户 ID 动态插入到资源名称、描述和 ARN 中。

JSON

{ "Resources": { "MyNotificationTopic": { "Type": "AWS::SNS::Topic", "Properties": { "DisplayName": { "Fn::Sub": "Notifications for ${AWS::StackName}" } } }, "CPUAlarm": { "Type": "AWS::CloudWatch::Alarm", "Properties": { "AlarmDescription": { "Fn::Sub": "Alarm for high CPU in ${AWS::Region}" }, "AlarmName": { "Fn::Sub": "${AWS::StackName}-HighCPUAlarm" }, "MetricName": "CPUUtilization", "Namespace": "AWS/EC2", "Statistic": "Average", "Period": 300, "EvaluationPeriods": 1, "Threshold": 80, "ComparisonOperator": "GreaterThanThreshold", "AlarmActions": [{ "Fn::Sub": "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}" }] } } } }

YAML

Resources: MyNotificationTopic: Type: AWS::SNS::Topic Properties: DisplayName: !Sub Notifications for ${AWS::StackName} CPUAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmDescription: !Sub Alarm for high CPU in ${AWS::Region} AlarmName: !Sub ${AWS::StackName}-HighCPUAlarm MetricName: CPUUtilization Namespace: AWS/EC2 Statistic: Average Period: 300 EvaluationPeriods: 1 Threshold: 80 ComparisonOperator: GreaterThanThreshold AlarmActions: - !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}

使用 AWS::NotificationARNs

以下示例配置了一个自动扩缩组来发送有关实例启动事件和启动错误的通知。该配置使用 AWS::NotificationARNs 伪参数,提供堆栈创建期间指定的 Amazon SNS 主题 ARN 的列表。Fn::Select 函数会从该列表中选择第一个 ARN。

JSON

"myASG": { "Type": "AWS::AutoScaling::AutoScalingGroup", "Properties": { "LaunchTemplate": { "LaunchTemplateId": { "Ref": "myLaunchTemplate" }, "Version": { "Fn::GetAtt": [ "myLaunchTemplate", "LatestVersionNumber" ] } }, "MaxSize": "1", "MinSize": "1", "VPCZoneIdentifier": [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ], "NotificationConfigurations" : [{ "TopicARN" : { "Fn::Select" : [ "0", { "Ref" : "AWS::NotificationARNs" } ] }, "NotificationTypes" : [ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR" ] }] } }

YAML

myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: LaunchTemplate: LaunchTemplateId: !Ref myLaunchTemplate Version: !GetAtt myLaunchTemplate.LatestVersionNumber MinSize: '1' MaxSize: '1' VPCZoneIdentifier: - subnetIdAz1 - subnetIdAz2 - subnetIdAz3 NotificationConfigurations: - TopicARN: Fn::Select: - '0' - Ref: AWS::NotificationARNs NotificationTypes: - autoscaling:EC2_INSTANCE_LAUNCH - autoscaling:EC2_INSTANCE_LAUNCH_ERROR

AWS::NoValue 条件属性

以下示例创建了一个 Amazon RDS 数据库实例,仅当提供了快照 ID 时,该数据库实例才会使用快照。如果 UseDBSnapshot 条件计算为 true,则 CloudFormation 对 DBSnapshotIdentifier 属性使用 DBSnapshotName 参数值。如果条件计算为 false,则 CloudFormation 删除 DBSnapshotIdentifier 属性。

JSON

"MyDB" : { "Type" : "AWS::RDS::DBInstance", "Properties" : { "AllocatedStorage" : "5", "DBInstanceClass" : "db.t2.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }

YAML

MyDB: Type: AWS::RDS::DBInstance Properties: AllocatedStorage: '5' DBInstanceClass: db.t2.small Engine: MySQL EngineVersion: '5.5' MasterUsername: Ref: DBUser MasterUserPassword: Ref: DBPassword DBParameterGroupName: Ref: MyRDSParamGroup DBSnapshotIdentifier: Fn::If: - UseDBSnapshot - Ref: DBSnapshotName - Ref: AWS::NoValue