本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
選用的 Conditions
區段包含陳述式來定義在哪些情況下建立或設定實體。例如,您可以建立條件,然後將其與資源或輸出建立關聯,以便 CloudFormation 僅在條件為 true 時建立資源或輸出。同樣地,您可以將條件與 屬性建立關聯,以便 CloudFormation 只有在條件為 true 時,才會將屬性設定為特定值。如果條件為 false,CloudFormation 會將 屬性設定為您指定的不同值。
當您想要重複使用範本以在不同的內容中建立資源時 (例如測試環境與生產環境),可以使用條件。在範本中,您可以新增 EnvironmentType
輸入參數,此參數接受 prod
或 test
作為輸入。在生產環境中,您可以讓 Amazon EC2 執行個體包含特定功能;不過,在測試環境中,就要使用精簡的功能來節省資金。使用條件,即可針對每種環境類型定義要建立哪些資源和其設定方式。
條件的評估是根據預先定義的虛擬參數,或您在建立或更新堆疊時指定的輸入參數值。在每個條件中,您可以參考另一個條件、參數值或映射。定義所有條件之後,即可將它們與範本之 Resources
和 Outputs
區段中的資源及資源屬性建立關聯。
在堆疊建立或堆疊更新時, 會在建立任何資源之前 AWS CloudFormation 評估範本中的所有條件。會建立與 true 條件相關聯的資源。與 false 條件相關聯的資源會被忽略。CloudFormation 也會在每次堆疊更新時重新評估這些條件,然後再更新任何資源。會更新仍與 true 條件相關聯的資源。會刪除現在與 false 條件相關聯的資源。
重要
在更新堆疊期間,您無法自行更新條件。唯有涵蓋新增、修改或刪除資源等變更作業時,才能更新條件。
如何使用條件
根據您要依條件建立或設定的實體而定,您必須在以下範本區段中包含陳述式:
Parameters
區段-
定義您要讓條件評估的輸入。條件會根據這些輸入參數的值而評估為 true 或 false。如果您希望您的條件評估虛擬參數,您不需要在本節中定義虛擬參數;虛擬參數是由 CloudFormation 預先定義。如需這些虛擬參數的詳細資訊,請參閱虛擬參數參考。
Conditions
區段-
使用內建條件函數來定義條件。這些條件決定 CloudFormation 何時建立相關聯的資源。如需範例,請參閱範本範例。
Resources
和Outputs
區段-
將條件與您想要有條件建立的資源或輸出建立關聯。CloudFormation 會建立與 true 條件相關聯的實體,並忽略與 false 條件相關聯的實體。使用
Condition
索引鍵,以及要將其與資源或輸出建立關聯的條件邏輯 ID。若要有條件地指定屬性,請使用Fn::If
函數。如需範例,請參閱關聯條件。
語法
Conditions
區段由索引鍵名稱 Conditions
組成。每個條件宣告都會包含在您建立或更新堆疊時所評估的邏輯 ID 和內部函數。下列虛擬範本概述 Conditions
區段:
JSON
"Conditions" : {
"ConditionLogicalID
" : {Intrinsic function
}
}
YAML
Conditions:
ConditionLogicalID
:
Intrinsic function
條件內部函數
您可以使用下列內部函數來定義條件:
-
Fn::And
-
Fn::Equals
-
Fn::ForEach
-
Fn::If
-
Fn::Not
-
Fn::Or
如需每個條件函數的語法和資訊,請參閱條件函數。如需 的語法和資訊Fn::ForEach
,請參閱 Fn::ForEach。
注意
只有在範本的 Resources
區段和 Outputs
區段的中繼資料屬性、更新政策屬性和屬性值中,才支援 Fn::If
。
範例
簡單條件
下列範例範本包含 EnvType
輸入參數,您可以在其中指定 prod
以建立生產用的堆疊,或指定 test
以建立測試用的堆疊。對於生產環境,CloudFormation 會建立 Amazon EC2 執行個體,並將磁碟區連接至執行個體。對於測試環境,CloudFormation 只會建立 Amazon EC2 執行個體。
如果 CreateProdResources
參數等於 true
,則 EnvType
條件會評估為 prod
。在範例範本中,NewVolume
和 MountPoint
資源會與 CreateProdResources
條件建立關聯。因此,只有在 EnvType
參數等於 prod
時,才會建立資源。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
"EnvType": {
"Description": "Environment type.",
"Default": "test",
"Type": "String",
"AllowedValues": [
"prod",
"test"
],
"ConstraintDescription": "must specify prod or test."
}
},
"Conditions": {
"CreateProdResources": {
"Fn::Equals": [
{
"Ref": "EnvType"
},
"prod"
]
}
},
"Resources": {
"EC2Instance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"ImageId": "ami-0ff8a91507f77f867"
}
},
"MountPoint": {
"Type": "AWS::EC2::VolumeAttachment",
"Condition": "CreateProdResources",
"Properties": {
"InstanceId": {
"Ref": "EC2Instance"
},
"VolumeId": {
"Ref": "NewVolume"
},
"Device": "/dev/sdh"
}
},
"NewVolume": {
"Type": "AWS::EC2::Volume",
"Condition": "CreateProdResources",
"Properties": {
"Size": 100,
"AvailabilityZone": {
"Fn::GetAtt": [
"EC2Instance",
"AvailabilityZone"
]
}
}
}
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Parameters:
EnvType:
Description: Environment type.
Default: test
Type: String
AllowedValues:
- prod
- test
ConstraintDescription: must specify prod or test.
Conditions:
CreateProdResources: !Equals
- !Ref EnvType
- prod
Resources:
EC2Instance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: ami-0ff8a91507f77f867
MountPoint:
Type: 'AWS::EC2::VolumeAttachment'
Condition: CreateProdResources
Properties:
InstanceId: !Ref EC2Instance
VolumeId: !Ref NewVolume
Device: /dev/sdh
NewVolume:
Type: 'AWS::EC2::Volume'
Condition: CreateProdResources
Properties:
Size: 100
AvailabilityZone: !GetAtt
- EC2Instance
- AvailabilityZone
巢狀條件
下列範例範本會參考另一個條件中的條件。您可以建立一個會建立 S3 儲存貯體的堆疊。對於在生產環境中部署的堆疊,CloudFormation 會為 S3 儲存貯體建立政策。
JSON
{
"Parameters": {
"EnvType": {
"Type": "String",
"AllowedValues": [
"prod",
"test"
]
},
"BucketName": {
"Default": "",
"Type": "String"
}
},
"Conditions": {
"IsProduction": {
"Fn::Equals": [
{
"Ref": "EnvType"
},
"prod"
]
},
"CreateBucket": {
"Fn::Not": [
{
"Fn::Equals": [
{
"Ref": "BucketName"
},
""
]
}
]
},
"CreateBucketPolicy": {
"Fn::And": [
{
"Condition": "IsProduction"
},
{
"Condition": "CreateBucket"
}
]
}
},
"Resources": {
"Bucket": {
"Type": "AWS::S3::Bucket",
"Condition": "CreateBucket"
},
"Policy": {
"Type": "AWS::S3::BucketPolicy",
"Condition": "CreateBucketPolicy",
"Properties": {
"Bucket": {
"Ref": "Bucket"
},
"PolicyDocument": "..."
}
}
}
}
YAML
Parameters:
EnvType:
Type: String
AllowedValues:
- prod
- test
BucketName:
Default: ''
Type: String
Conditions:
IsProduction: !Equals
- !Ref EnvType
- prod
CreateBucket: !Not
- !Equals
- !Ref BucketName
- ''
CreateBucketPolicy: !And
- !Condition IsProduction
- !Condition CreateBucket
Resources:
Bucket:
Type: 'AWS::S3::Bucket'
Condition: CreateBucket
Policy:
Type: 'AWS::S3::BucketPolicy'
Condition: CreateBucketPolicy
Properties:
Bucket: !Ref BucketName
PolicyDocument: ...