Resources CloudFormation 範本的 區段語法參考 - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

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::ServiceName::ResourceType。例如,Amazon S3 儲存貯體的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: !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具有邏輯名稱 的 類型單一資源MyBucketBucketName 屬性設定為 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