DependsOn 属性 - AWS CloudFormation

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、网关和网关连接,则需要网关的所有资源都依赖于网关连接。例如,如果 VPCInternetGateway 资源也在相同模板中声明,则具有公有 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::PolicyAWS::IAM::ManagedPolicy 资源) 和使用此角色的资源添加了一种依赖关系,以便此资源依赖于角色的策略。此依赖关系确保策略在资源的整个生命周期内均可用。

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

如果角色具有嵌入的策略,请不要指定依赖关系。CloudFormation 同时创建角色及其策略。