本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Resources
區段是 CloudFormation 範本中必要的頂層區段。它會宣告您希望 CloudFormation 佈建和設定作為堆疊一部分 AWS 的資源。
語法
Resources
本節使用以下語法:
JSON
"Resources" : {
"LogicalResourceName1
" : {
"Type" : "AWS::ServiceName::ResourceType
",
"Properties" : {
"PropertyName1" : "PropertyValue1"
,
...
}
},
"LogicalResourceName2
" : {
"Type" : "AWS::ServiceName::ResourceType
",
"Properties" : {
"PropertyName1" : "PropertyValue1"
,
...
}
}
}
YAML
Resources:
LogicalResourceName1
:
Type: AWS::ServiceName::ResourceType
Properties:
PropertyName1: PropertyValue1
...
LogicalResourceName2
:
Type: AWS::ServiceName::ResourceType
Properties:
PropertyName1: PropertyValue1
...
邏輯 ID (也稱為邏輯名稱)
在 CloudFormation 範本中,資源會以其邏輯資源名稱來識別。這些名稱必須是英數字元 (A-Za-z0-9),而且在範本中是唯一的。邏輯名稱用於參考範本其他區段的資源。
資源類型
每個資源都必須有一個Type
屬性,定義其資源類型 AWS 。Type
屬性的格式為 AWS::
。例如,Amazon S3 儲存貯體的ServiceName
::ResourceType
Type
屬性為 AWS::S3::Bucket
。
如需支援的資源類型完整清單,請參閱 AWS 資源和屬性類型參考。
資源屬性
資源屬性是您可以指定的其他選項,用於定義特定資源類型的組態詳細資訊。有些屬性是必要的,有些則是選用的。某些屬性具有預設值,因此指定這些屬性是選用的。
如需每個資源類型支援的屬性詳細資訊,請參閱 中的主題AWS 資源和屬性類型參考。
屬性值可以是常值字串、字串清單、布林值、動態參考、參數參考、虛擬參考或函數傳回的值。下列範例示範如何宣告不同的屬性值類型:
JSON
"Properties" : {
"String
" : "A string value
",
"Number
" : 123
,
"LiteralList
" : [ "first-value
", "second-value
" ],
"Boolean
" : true
}
YAML
Properties:
String
: A string value
Number
: 123
LiteralList
:
- first-value
- second-value
Boolean
: true
實體 ID
除了邏輯 ID 之外,特定資源也會有實體 ID,這是該資源的實際指派名稱 (例如 EC2 執行個體 ID 或 S3 儲存貯體名稱)。使用實體 IDs來識別 CloudFormation 範本以外的資源,但僅限於建立資源之後。例如,假設您為 EC2 執行個體資源指定邏輯 ID MyEC2Instance
。當 CloudFormation 建立執行個體時,CloudFormation 會自動產生實體 ID (例如 i-1234567890abcdef0
) 並指派給執行個體。您可以使用此實體 ID 來識別執行個體,以及使用 Amazon EC2 主控台來檢視其屬性 (例如 DNS 名稱)。
對於 Amazon S3 儲存貯體和許多其他資源,如果您未明確指定資源,CloudFormation 會自動為資源產生唯一的實體名稱。此實體名稱是以 CloudFormation 堆疊的名稱、CloudFormation 範本中指定的資源邏輯名稱,以及唯一 ID 的組合為基礎。例如,如果您的 Amazon S3 儲存貯體在名為 的堆疊MyBucket
中具有邏輯名稱MyStack
,CloudFormation 可能會使用下列實體名稱 命名儲存貯體MyStack-MyBucket-abcdefghijk1
。
對於支援自訂名稱的資源,您可以指派自己的實體名稱,以協助您快速識別資源。例如,您可以將存放日誌的 S3 儲存貯體命名為 MyPerformanceLogs
。如需詳細資訊,請參閱名稱類型。
參考資源
通常,您需要根據另一個資源的名稱或屬性,在某個資源上設定屬性。例如,您可以建立使用 EC2 安全群組的 EC2 執行個體,或 S3 儲存貯體支援的 CloudFront 分佈。所有這些資源都可以在相同的 CloudFormation 範本中建立。
CloudFormation 提供內部函數,您可以用來參考其他資源及其屬性。這些函數可讓您在資源之間建立相依性,並將值從一個資源傳遞到另一個資源。
Ref
函數
該Ref
函數通常用於擷取相同 CloudFormation 範本中定義的資源的識別屬性。傳回的內容取決於資源的類型。對於大多數資源,它會傳回資源的實體名稱。不過,對於某些資源類型,它可能會傳回不同的值,例如AWS::EC2::EIP
資源的 IP 地址或 Amazon SNS 主題的 Amazon Resource Name (ARN)。
下列範例示範如何在 屬性中使用 Ref
函數。在每個範例中,Ref
函數會傳回範本中其他位置宣告LogicalResourceName
的資源實際名稱。YAML !Ref
範例中的語法範例只是撰寫Ref
函數的較短方式。
JSON
"Properties" : {
"PropertyName
" : { "Ref" : "LogicalResourceName
" }
}
YAML
Properties:
PropertyName1
:
Ref: LogicalResourceName
PropertyName2
: !Ref LogicalResourceName
如需 Ref
函數的詳細資訊,請參閱 Ref 函數。
Fn::GetAtt
函數
如果為資源傳回的參數或值完全是您想要的,則Ref
函數會很有幫助。不過,您可能需要資源的其他屬性。例如,如果您想要建立有 S3 來源的 CloudFront 分佈,您需要使用 DNS 樣式地址指定儲存貯體位置。多項有其他屬性的資源,其值可用於範本中。若要取得這些屬性,請使用 Fn::GetAtt
函數。
下列範例示範如何在 屬性中使用 GetAtt
函數。Fn::GetAtt
函數需要兩個參數,即資源的邏輯名稱和要擷取的屬性名稱。YAML !GetAtt
範例中的語法範例只是撰寫GetAtt
函數的較短方式。
JSON
"Properties" : {
"PropertyName
" : {
"Fn::GetAtt" : [ "LogicalResourceName
", "AttributeName
" ]
}
}
YAML
Properties:
PropertyName1
:
Fn::GetAtt:
- LogicalResourceName
- AttributeName
PropertyName2
: !GetAtt LogicalResourceName
.AttributeName
如需 GetAtt
函數的詳細資訊,請參閱 Fn::GetAtt。
範例
下列範例說明如何宣告資源,以及 CloudFormation 範本如何參考相同範本和現有資源中定義的其他 AWS 資源。
宣告具有自訂名稱的單一資源
下列範例宣告 類型 的單一資源,AWS::S3::Bucket
其邏輯名稱為 MyBucket
。BucketName
屬性設定為 amzn-s3-demo-bucket
,應該以 S3 儲存貯體所需的名稱取代。
如果您使用此資源宣告來建立堆疊,CloudFormation 將建立具有預設設定的 Amazon S3 儲存貯體。對於其他資源,例如 Amazon EC2 執行個體或 Auto Scaling 群組,CloudFormation 需要更多資訊。
JSON
{
"Resources": {
"MyBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "amzn-s3-demo-bucket
"
}
}
}
}
YAML
Resources:
MyBucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: amzn-s3-demo-bucket
使用 Ref
函數參考其他資源
下列範例顯示定義 EC2 執行個體和安全群組的資源宣告。Ec2Instance
資源會使用 Ref
函數參考InstanceSecurityGroup
資源做為其SecurityGroupIds
屬性的一部分。它還包括範本中未宣告的現有安全群組 (sg-12a4c434
)。您要使用文字字串參考現有的 AWS
資源。
JSON
{
"Resources": {
"Ec2Instance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"SecurityGroupIds": [
{
"Ref": "InstanceSecurityGroup"
},
"sg-12a4c434"
],
"KeyName": "MyKey",
"ImageId": "ami-1234567890abcdef0"
}
},
"InstanceSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "Enable SSH access via port 22",
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": 22,
"ToPort": 22,
"CidrIp": "0.0.0.0/0"
}
]
}
}
}
}
YAML
Resources:
Ec2Instance:
Type: 'AWS::EC2::Instance'
Properties:
SecurityGroupIds:
- !Ref InstanceSecurityGroup
- sg-12a4c434
KeyName: MyKey
ImageId: ami-1234567890abcdef0
InstanceSecurityGroup:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: Enable SSH access via port 22
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
使用 Fn::GetAtt
函數參考資源屬性
下列範例顯示定義 CloudFront 分佈資源和 S3 儲存貯體的資源宣告。MyDistribution
資源會使用 Fn::GetAtt
函數來指定MyBucket
資源的 DNS DomainName
名稱,以取得儲存貯體的屬性。您會注意到Fn::GetAtt
函數在陣列中列出其兩個參數。對於需要多個參數的函數,您使用陣列指定它們的參數。
JSON
{
"Resources": {
"MyBucket": {
"Type": "AWS::S3::Bucket"
},
"MyDistribution": {
"Type": "AWS::CloudFront::Distribution",
"Properties": {
"DistributionConfig": {
"Origins": [
{
"DomainName": {
"Fn::GetAtt": [
"MyBucket",
"DomainName"
]
},
"Id": "MyS3Origin",
"S3OriginConfig": {}
}
],
"Enabled": "true",
"DefaultCacheBehavior": {
"TargetOriginId": "MyS3Origin",
"ForwardedValues": {
"QueryString": "false"
},
"ViewerProtocolPolicy": "allow-all"
}
}
}
}
}
}
YAML
Resources:
MyBucket:
Type: 'AWS::S3::Bucket'
MyDistribution:
Type: 'AWS::CloudFront::Distribution'
Properties:
DistributionConfig:
Origins:
- DomainName: !GetAtt
- MyBucket
- DomainName
Id: MyS3Origin
S3OriginConfig: {}
Enabled: 'true'
DefaultCacheBehavior:
TargetOriginId: MyS3Origin
ForwardedValues:
QueryString: 'false'
ViewerProtocolPolicy: allow-all