DependsOn 屬性 - AWS CloudFormation

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

DependsOn 屬性

使用 DependsOn 屬性,您可以指定特定資源遵循另一項資源建立。當您將 DependsOn 屬性新增至資源時,只有在建立 DependsOn 屬性中指定的資源之後才能建立該資源。

重要

相依堆疊也有目標屬性 !Ref!GetAtt!Sub 形式的隱含相依性。例如,如果資源 A 的屬性使用資源 B 的 !Ref,則適用下列規則:

  • 資源 B 會在資源 A 之前建立。

  • 資源 A 會在資源 B 之前刪除。

  • 資源 B 會在資源 A 之前更新。

您可以使用 DependsOn 屬性搭配任何資源。以下是一些典型用法:

  • 決定等待條件何時生效。如需詳細資訊,請參閱 在範本中建立等待條件

  • 針對必須依特定順序建立或刪除的資源宣告相依性。例如,您必須針對 VPC 中的一些資源,明確宣告對閘道連接的相依性。如需詳細資訊,請參閱 當 DependsOn 屬性是必要項目時

  • 建立、更新或刪除資源時覆寫預設平行處理原則。 AWS CloudFormation 會盡可能平行建立、更新及刪除資源。它會自動決定範本中的哪些資源可以平行處理,以及哪些資源具有需要先完成其他操作的相依性。您可以使用DependsOn明確指定相依性,這會覆寫預設的平行處理原則,並指示 CloudFormation 以指定的順序對這些資源進行作業。

注意

在堆疊更新期間,依賴於更新資源的資源會自動更新。 CloudFormation 不會對自動更新的資源進行任何變更,但是,如果堆疊策略與這些資源相關聯,您的帳戶必須具有更新資源的權限。

語法

DependsOn 屬性可以接受單一字串或字串清單。

"DependsOn" : [ String, ... ]

範例

下列範本包含具有指定 MyDB (AWS:: RDS:: AWS::EC2::Instance資料庫執行個體) DependsOn 屬性的資源。 CloudFormation 創建此堆棧時,它首先創建 MyDB,然後創建 EC2 實例。

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-0ff8a91507f77f867" }, "us-west-1" : { "AMI" : "ami-0bdb828fd58c52235" }, "eu-west-1" : { "AMI" : "ami-047bb4163c506cd98" }, "ap-northeast-1" : { "AMI" : "ami-06cd52961ce9f0d85" }, "ap-southeast-1" : { "AMI" : "ami-08569b978cc4dfa10" } } }, "Resources" : { "Ec2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId": { "Fn::FindInMap": [ "RegionMap", { "Ref": "AWS::Region" }, "AMI" ] } }, "DependsOn" : "myDB" }, "myDB" : { "Type" : "AWS::RDS::DBInstance", "Properties" : { "AllocatedStorage" : "5", "DBInstanceClass" : "db.t2.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : "MyName", "MasterUserPassword" : "MyPassword" } } } }

YAML

AWSTemplateFormatVersion: '2010-09-09' Mappings: RegionMap: us-east-1: AMI: ami-0ff8a91507f77f867 us-west-1: AMI: ami-0bdb828fd58c52235 eu-west-1: AMI: ami-047bb4163c506cd98 ap-northeast-1: AMI: ami-06cd52961ce9f0d85 ap-southeast-1: AMI: ami-08569b978cc4dfa10 Resources: Ec2Instance: Type: AWS::EC2::Instance Properties: ImageId: Fn::FindInMap: - RegionMap - Ref: AWS::Region - AMI DependsOn: myDB myDB: Type: AWS::RDS::DBInstance Properties: AllocatedStorage: '5' DBInstanceClass: db.t2.small Engine: MySQL EngineVersion: '5.5' MasterUsername: MyName MasterUserPassword: MyPassword

DependsOn 屬性是必要項目時

VPC 閘道連接

VPC 中有些資源需要閘道 (網際網路或 VPN 閘道)。如果您的 CloudFormation 範本定義了 VPC、閘道和閘道附件,則需要閘道的任何資源都取決於閘道附件。例如,如果同時在相同的範本中宣告了 VPCInternetGateway 資源,具有公有 IP 地址的 Amazon EC2 執行個體會相依於 VPC 閘道連接。

目前,當下列資源有相關聯的公有 IP 地址且位於 VPC 時,這些資源會相依於 VPC 閘道連接。

  • Auto Scaling 群組

  • Amazon EC2 執行個體

  • Elastic Load Balancing 負載平衡器

  • 彈性 IP 地址

  • Amazon RDS 資料庫執行個體

  • 包含網際網路閘道的 Amazon VPC 路由

當您有 VPN 閘道時,VPN 閘道路由傳播會相依於 VPC 閘道連接。

下列程式碼片段示範閘道連接範例,以及相依於閘道連接的 Amazon EC2 執行個體:

JSON

"GatewayToInternet" : { "Type" : "AWS::EC2::VPCGatewayAttachment", "Properties" : { "VpcId" : { "Ref" : "VPC" }, "InternetGatewayId" : { "Ref" : "InternetGateway" } } }, "EC2Host" : { "Type" : "AWS::EC2::Instance", "DependsOn" : "GatewayToInternet", "Properties" : { "InstanceType" : { "Ref" : "EC2InstanceType" }, "KeyName" : { "Ref" : "KeyName" }, "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "EC2InstanceType" }, "Arch" ] } ] }, "NetworkInterfaces" : [ { "GroupSet" : [ { "Ref" : "EC2SecurityGroup" } ], "AssociatePublicIpAddress" : "true", "DeviceIndex" : "0", "DeleteOnTermination" : "true", "SubnetId" : { "Ref" : "PublicSubnet" } } ] } }

YAML

GatewayToInternet: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: Ref: VPC InternetGatewayId: Ref: InternetGateway EC2Host: Type: AWS::EC2::Instance DependsOn: GatewayToInternet Properties: InstanceType: Ref: EC2InstanceType KeyName: Ref: KeyName ImageId: Fn::FindInMap: - AWSRegionArch2AMI - Ref: AWS::Region - Fn::FindInMap: - AWSInstanceType2Arch - Ref: EC2InstanceType - Arch NetworkInterfaces: - GroupSet: - Ref: EC2SecurityGroup AssociatePublicIpAddress: 'true' DeviceIndex: '0' DeleteOnTermination: 'true' SubnetId: Ref: PublicSubnet

Amazon ECS 服務和 Auto Scaling 群組

當您使用 Auto Scaling 或 Amazon Elastic Compute Cloud (Amazon EC2) 建立 Amazon ECS 叢集的容器執行個體時,Amazon ECS 服務資源必須相依於 Auto Scaling 群組或 Amazon EC2 執行個體,如下列程式碼片段所示。如此一來,在建立 Amazon ECS 服務之前,就可以使用容器執行個體並與 Amazon ECS 叢集 CloudFormation 建立關聯。

JSON

"service": { "Type": "AWS::ECS::Service", "DependsOn": [ "ECSAutoScalingGroup" ], "Properties" : { "Cluster": { "Ref": "ECSCluster" }, "DesiredCount": "1", "LoadBalancers": [ { "ContainerName": "simple-app", "ContainerPort": "80", "LoadBalancerName" : { "Ref" : "EcsElasticLoadBalancer" } } ], "Role" : { "Ref":"ECSServiceRole" }, "TaskDefinition" : { "Ref":"taskdefinition" } } }

YAML

service: Type: AWS::ECS::Service DependsOn: - ECSAutoScalingGroup Properties: Cluster: Ref: ECSCluster DesiredCount: 1 LoadBalancers: - ContainerName: simple-app ContainerPort: 80 LoadBalancerName: Ref: EcsElasticLoadBalancer Role: Ref: ECSServiceRole TaskDefinition: Ref: taskdefinition

IAM 角色政策

進行額外呼叫以 AWS 需要服務角色的資源,這會允許服務代表您撥 AWS 打電話。例如,AWS::CodeDeploy::DeploymentGroup資源需要服務角色,才能 CodeDeploy 擁有將應用程式部署到執行個體的權限。當您有定義服務角色的單一範本時,角色的政策 (使用 AWS::IAM::PolicyAWS::IAM::ManagedPolicy 資源) 及使用角色的資源會新增相依性,讓資源相依於角色的政策。此相依性可確保資源整個生命週期都能使用政策。

例如,假設您有一個範本,其中包含部署群組資源、服務角色和角色的政策。建立堆疊時,在建立角色原則之前,不 CloudFormation 會建立部署群組。如果沒有相依性,則 CloudFormation 可以先建立部署群組資源,然後再建立角色的原則。如果發生此情況,由於許可不足,因此部署群組將無法建立。

如果角色具有內嵌政策,請勿指定相依性。 CloudFormation 會同時建立角色及其原則。