本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
DependsOn
屬性
使用 DependsOn
屬性,您可以指定特定資源遵循另一項資源建立。當您將 DependsOn
屬性新增至資源時,只有在建立 DependsOn
屬性中指定的資源之後才能建立該資源。
重要
相依堆疊也有目標屬性 !Ref
、!GetAtt
和 !Sub
形式的隱含相依性。例如,如果資源 A 的屬性使用資源 B 的 !Ref
,則適用下列規則:
-
資源 B 會在資源 A 之前建立。
-
資源 A 會在資源 B 之前刪除。
-
資源 B 會在資源 A 之前更新。
您可以使用 DependsOn
屬性搭配任何資源。以下是一些典型用法:
-
決定等待條件何時生效。如需詳細資訊,請參閱在 CloudFormation範本中建立等待條件。
-
針對必須依特定順序建立或刪除的資源宣告相依性。例如,您必須明確宣告 中某些資源的閘道附件相依性VPC。如需詳細資訊,請參閱當 DependsOn 屬性是必要項目時。
-
建立、更新或刪除資源時覆寫預設平行處理原則。 AWS CloudFormation 會盡可能平行建立、更新及刪除資源。它會自動決定範本中的哪些資源可以平行處理,以及哪些資源具有需要先完成其他操作的相依性。您可以使用
DependsOn
明確指定相依性,這會覆寫預設平行處理,並指示 CloudFormation 以指定的順序在這些資源上操作。
注意
在堆疊更新期間,依賴更新資源的資源會自動更新。 不會對自動更新的資源 CloudFormation 進行任何變更,但如果堆疊政策與這些資源相關聯,您的帳戶必須具有更新資源的許可。
語法
DependsOn
屬性可以接受單一字串或字串清單。
"DependsOn" : [
String, ...
]
範例
下列範本包含 AWS::EC2::Instance 資源,其中包含指定 myDB 的DependsOn
屬性:AWS:RDS::DBInstance。 CloudFormation 建立此堆疊時,它會先建立 myDB ,然後建立 Ec2Instance 。
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、閘道和閘道連接,則任何需要閘道的資源都取決於閘道連接。例如,如果在同一範本中也宣告 InternetGateway
VPC
和資源,則具有公有 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執行個體,如下列程式碼片段所示。如此一來,容器執行個體即可使用,並在 CloudFormation 建立 Amazon ECS服務之前與 Amazon ECS叢集建立關聯。
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::Policy
或 AWS::IAM::ManagedPolicy
資源) 及使用角色的資源會新增相依性,讓資源相依於角色的政策。此相依性可確保資源整個生命週期都能使用政策。
例如,假設您有一個範本,其中包含部署群組資源、服務角色和角色的政策。當您建立堆疊時,在建立角色的政策之前, CloudFormation 不會建立部署群組。如果沒有相依性, CloudFormation 則可以在建立角色的政策之前建立部署群組資源。如果發生此情況,由於許可不足,因此部署群組將無法建立。
如果角色具有內嵌政策,請勿指定相依性。 會同時 CloudFormation 建立角色及其政策。