使用虛擬參數取得 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 Resource Name (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 (美國西部) 區域的資源分割區為 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

下列範例設定 Auto Scaling 群組,以便在執行個體啟動事件及啟動錯誤時傳送通知。此設定使用 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 會對 DBSnapshotName 屬性使用 DBSnapshotIdentifier 參數值。若條件評估為 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