本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Resources CloudFormation 範本的 區段語法參考
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執行個體資源提供 的邏輯 IDMyEC2Instance
。 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
: !RefLogicalResourceName
如需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
: !GetAttLogicalResourceName
.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