AWS CloudFormation
User Guide (API Version 2010-05-15)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

DependsOn 属性

使用 DependsOn 属性可以指定特定资源紧跟着另一个资源创建。在您为资源添加 DependsOn 属性时,该资源仅在创建 DependsOn 属性中指定的资源之后创建。

重要

依赖堆栈也具有隐式依赖关系。例如,如果资源 A 的属性对资源 B 使用了 !Ref,则以下规则适用:

  • 资源 B 在资源 A 之前创建。

  • 资源 A 在资源 B 之前删除。

您可以对任何资源使用 DependsOn 属性。下面是一些一般用途:

  • 确定等待条件生效的时间。有关更多信息,请参阅 在模板中创建等待条件

  • 为必须按特定顺序创建或删除的资源声明依赖关系。例如,您必须显式声明对 VPC 中的某些资源的网关连接的依赖性。有关更多信息,请参阅 何时需要使用 DependsOn 属性

  • 在创建、更新或删除资源时会覆盖默认的并行机制。AWS CloudFormation 会尽可能并行地创建、更新和删除资源。它自动确定模板中的哪些资源可以并行处理,哪些资源具有要求其他操作先完成的依赖关系。您可以使用 DependsOn 明确指定依赖关系,这些依赖关系会覆盖默认的并行机制,指示 CloudFormation 按指定的顺序对这些资源执行操作。

注意

在堆栈更新期间,依赖更新资源的资源会自动更新。AWS CloudFormation 不会对自动更新的资源进行任何更改,但是,如果这些资源关联有堆栈策略,则您的账户必须具有相应的权限才能更新它们。

语法

DependsOn 属性可以包含一个字符串或字符串列表。

"DependsOn" : [ String, ... ]

示例

以下模板包含一个 AWS::EC2::Instance 资源,该资源具有指定 myDB 即 DependsOnAWS::RDS::DBInstance 属性。在创建此堆栈时,AWS CloudFormation 将首先创建 myDB,然后创建 Ec2Instance。

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-76f0061f" }, "us-west-1" : { "AMI" : "ami-655a0a20" }, "eu-west-1" : { "AMI" : "ami-7fd4e10b" }, "ap-northeast-1" : { "AMI" : "ami-8e08a38f" }, "ap-southeast-1" : { "AMI" : "ami-72621c20" } } }, "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.m1.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : "MyName", "MasterUserPassword" : "MyPassword" } } } }

YAML

AWSTemplateFormatVersion: '2010-09-09' Mappings: RegionMap: us-east-1: AMI: ami-76f0061f us-west-1: AMI: ami-655a0a20 eu-west-1: AMI: ami-7fd4e10b ap-northeast-1: AMI: ami-8e08a38f ap-southeast-1: AMI: ami-72621c20 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.m1.small Engine: MySQL EngineVersion: '5.5' MasterUsername: MyName MasterUserPassword: MyPassword

何时需要使用 DependsOn 属性

VPC 网关连接

VPC 中的某些资源需要网关(Internet 或 VPN 网关)。如果您的 AWS CloudFormation 模板定义了 VPC、网关和网关连接,则需要网关的所有资源都依赖于网关连接。例如,如果 VPCInternetGateway 资源也在相同模板中声明,则具有公有 IP 地址的 Amazon EC2 实例依赖于该 VPC 网关连接。

当前,当以下资源具有关联的公有 IP 地址并位于一个 VPC 中时,它们将依赖于 VPC 网关连接:

  • Auto Scaling 组

  • 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 组

当您使用 Auto Scaling 或 Amazon Elastic Compute Cloud (Amazon EC2) 为 Amazon ECS 群集创建容器实例时,Amazon ECS 服务资源必须对 Auto Scaling 组或 Amazon EC2 实例具有依赖关系,如以下代码段所示。这样,在 AWS 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 资源需要服务角色,以便 AWS CodeDeploy 拥有将应用程序部署到实例的权限。当您拥有定义服务角色的单一模板时,角色的策略(使用 AWS::IAM::PolicyAWS::IAM::ManagedPolicy 资源)和使用此角色的资源添加了一种依赖关系,以便此资源依赖于角色的策略。此依赖关系确保策略在资源的整个生命周期内均可用。

例如,假定您有一个包含部署组资源、服务角色和角色策略的模板。当您创建堆栈时,AWS CloudFormation 在创建角色策略前不会创建部署组。如果没有此依赖关系,则 AWS CloudFormation 可在创建角色策略前创建部署组资源。如果是这种情况,部署组将由于权限不足而创建失败。

如果角色拥有嵌入式策略,则不要指定依赖关系。AWS CloudFormation 同时创建角色及其策略。