

这是新的《Amazon CloudFormation 模板参考指南》**。请更新您的书签和链接。有关开始使用 CloudFormation 的帮助，请参阅《Amazon CloudFormation 用户指南》[https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/Welcome.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/Welcome.html)。

# `DependsOn` 属性
<a name="aws-attribute-dependson"></a>

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

**重要**  
依赖堆栈还具有 `!Ref`、`!GetAtt` 和 `!Sub`目标属性形式的隐式依赖关系。例如，如果资源 A 的属性对资源 B 使用了 `!Ref`，则以下规则适用：  
资源 B 在资源 A 之前创建。
资源 A 在资源 B 之前删除。
资源 B 在资源 A 之前更新。

您可以对任何资源使用 `DependsOn` 属性。下面是一些一般用途：
+ 确定等待条件生效的时间。有关更多信息，请参阅**《Amazon CloudFormation 用户指南》中的[在模板中创建等待条件](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html)。
+ 为必须按特定顺序创建或删除的资源声明依赖关系。例如，您必须显式声明对 VPC 中的某些资源的网关连接的依赖性。有关更多信息，请参阅 [当需要 `DependsOn` 属性时](#gatewayattachment)。
+ 在创建、更新或删除资源时覆盖默认并行机制。Amazon CloudFormation 尽可能并行地创建、更新和删除资源。它自动确定模板中的哪些资源可以并行处理，哪些资源具有要求其他操作先完成的依赖关系。您可以使用 `DependsOn` 明确指定依赖关系，这些依赖关系会覆盖默认的并行机制，指示 CloudFormation 按指定的顺序对这些资源执行操作。

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

## 语法
<a name="aws-attribute-dependson-syntax"></a>

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

```
"DependsOn" : [ String, ... ]
```

## 示例
<a name="aws-attribute-dependson-example"></a>

以下模板包含一个具有 `DependsOn` 属性的 [AWS::EC2::Instance](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 资源，此属性指定了 `myDB`（一个 [AWS::RDS::DBInstance](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)）。在创建此堆栈时，CloudFormation 将首先创建 `myDB`，然后创建 `Ec2Instance`。

### JSON
<a name="aws-attribute-dependson-example-1.json"></a>

```
 1. {
 2.     "Resources" : {
 3.         "Ec2Instance" : {
 4.             "Type" : "AWS::EC2::Instance",
 5.             "Properties" : {
 6.                 "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
 7.                 "InstanceType": "t2.micro"
 8.             },
 9.             "DependsOn" : "myDB"
10.         },
11.         "myDB" : {
12.             "Type" : "AWS::RDS::DBInstance",
13.             "Properties" : {
14.                "AllocatedStorage" : "5",
15.                "DBInstanceClass" : "db.t2.small",
16.                "Engine" : "MySQL",
17.                "EngineVersion" : "5.5",
18.                "MasterUsername" : "{{resolve:secretsmanager:MySecret:SecretString:username}}",
19.                "MasterUserPassword" : "{{resolve:secretsmanager:MySecret:SecretString:password}}"
20.             }
21.         }
22.     }
23. }
```

### YAML
<a name="aws-attribute-dependson-example-1.yaml"></a>

```
 1. Resources:
 2.   Ec2Instance:
 3.     Type: AWS::EC2::Instance
 4.     Properties:
 5.       ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
 6.       InstanceType: t2.micro
 7.     DependsOn: myDB
 8.   myDB:
 9.     Type: AWS::RDS::DBInstance
10.     Properties:
11.       AllocatedStorage: '5'
12.       DBInstanceClass: db.t2.small
13.       Engine: MySQL
14.       EngineVersion: '5.5'
15.       MasterUsername: '{{resolve:secretsmanager:MySecret:SecretString:username}}'
16.       MasterUserPassword: '{{resolve:secretsmanager:MySecret:SecretString:password}}'
```

## 当需要 `DependsOn` 属性时
<a name="gatewayattachment"></a>

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
<a name="aws-attribute-dependson-example-2.json"></a>

```
"GatewayToInternet" : {
  "Type" : "AWS::EC2::VPCGatewayAttachment",
  "Properties" : {
    "VpcId" : { 
      "Ref" : "VPC" 
    },
    "InternetGatewayId" : { 
      "Ref" : "InternetGateway" 
    }
  }
},

"EC2Host" : {
  "Type" : "AWS::EC2::Instance",
  "DependsOn" : "GatewayToInternet",
  "Properties" : {
    "InstanceType" : "t2.micro",
    "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
    "KeyName"  : { 
      "Ref" : "KeyName" 
    },
    "NetworkInterfaces" : [
      {
        "GroupSet" : [
          { 
            "Ref" : "EC2SecurityGroup" 
          }
        ],
        "AssociatePublicIpAddress" : "true",
        "DeviceIndex" : "0",
        "DeleteOnTermination" : "true",
        "SubnetId" : { 
          "Ref" : "PublicSubnet" 
        }
      }
    ]
  }
}
```

### YAML
<a name="aws-attribute-dependson-example-2.yaml"></a>

```
GatewayToInternet:
  Type: AWS::EC2::VPCGatewayAttachment
  Properties:
    VpcId:
      Ref: VPC
    InternetGatewayId:
      Ref: InternetGateway
EC2Host:
  Type: AWS::EC2::Instance
  DependsOn: GatewayToInternet
  Properties:
    InstanceType: t2.micro
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
    KeyName:
      Ref: KeyName
    NetworkInterfaces:
    - GroupSet:
      - Ref: EC2SecurityGroup
      AssociatePublicIpAddress: 'true'
      DeviceIndex: '0'
      DeleteOnTermination: 'true'
      SubnetId:
        Ref: PublicSubnet
```

### Amazon ECS 服务和自动扩缩组
<a name="w2aac19c19c17c19"></a>

当您使用 Auto Scaling 或 Amazon Elastic Compute Cloud (Amazon EC2) 为 Amazon ECS 集群创建容器实例时，Amazon ECS 服务资源必须对自动扩缩组或 Amazon EC2 实例具有依赖关系，如以下代码段所示。这样，在 CloudFormation 创建 Amazon ECS 服务之前就可以使用容器实例并将其与 Amazon ECS 群集相关联。

#### JSON
<a name="aws-attribute-dependson-example-3.json"></a>

```
"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
<a name="aws-attribute-dependson-example-3.yaml"></a>

```
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 角色策略
<a name="w2aac19c19c17c21"></a>

额外调用 Amazon 的资源需要服务角色，这允许服务代您调用 Amazon。例如，`AWS::CodeDeploy::DeploymentGroup` 资源需要服务角色，以便 CodeDeploy 拥有将应用程序部署到实例的权限。当您拥有定义服务角色的单一模板时，角色的策略 (使用 `AWS::IAM::Policy` 或 `AWS::IAM::ManagedPolicy` 资源) 和使用此角色的资源添加了一种依赖关系，以便此资源依赖于角色的策略。此依赖关系确保策略在资源的整个生命周期内均可用。

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

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