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, ...
]
示例
以下模板包含一个具有 DependsOn
属性的 AWS::EC2::Instance 资源,此属性指定了 myDB(一个 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 中的某些资源需要网关 (Internet 或 VPN 网关)。如果您的 CloudFormation 模板定义了 VPC、网关和网关连接,则需要网关的所有资源都依赖于网关连接。例如,如果 VPC
和 InternetGateway
资源也在相同模板中声明,则具有公有 IP 地址的 Amazon EC2 实例依赖于该 VPC 网关连接。
当前,当以下资源具有关联的公有 IP 地址并位于一个 VPC 中时,它们将依赖于 VPC 网关连接。
-
自动扩缩组
-
Amazon EC2 实例
-
Elastic Load Balancing 负载均衡器
-
弹性 IP 地址
-
Amazon RDS 数据库实例
-
包含 Internet 网关的 Amazon VPC 路由
当您有 VPN 网关时,VPN 网关路由传播依赖于 VPN 网关连接。
以下代码段演示了一个示例网关连接和依赖于一个网关连接的 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 或 Amazon Elastic Compute Cloud (Amazon EC2) 为 Amazon ECS 集群创建容器实例时,Amazon ECS 服务资源必须对自动扩缩组或 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 同时创建角色及其策略。