

これは新しい CloudFormation テンプレートリファレンスガイドです。ブックマークとリンクを更新してください。CloudFormation の開始方法については、『[AWS CloudFormation ユーザーガイド](https://docs.aws.amazon.com/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` 属性は任意のリソースで使用できます。以下に、代表的な用途をいくつか示します。
+ 待機条件が有効になるタイミングを指定する。詳細については、「*AWS CloudFormation ユーザーガイド*」の「[テンプレートで待機条件を作成する](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html)」を参照してください。
+ 特定の順序で作成または削除する必要のあるリソースの依存関係を宣言する。たとえば、VPC のあるリソースに対するゲートウェイアタッチメントの依存関係を明示的に宣言する必要があります。詳細については、「[`DependsOn` 属性が必須の場合](#gatewayattachment)」を参照してください。
+ リソースを作成、更新、削除する際のデフォルトの並列処理を上書きする。CloudFormation は、可能な限り並行してリソースを作成、更新、削除します。その際、並行して処理できるテンプレート内のリソースとオペレーションの実行順序を左右する依存関係とが自動的に判断されます。`DependsOn` を使用して依存関係を明示的に指定することで、デフォルトの並列処理をオーバーライドし、それらのリソースを決まった順序で処理するように CloudFormation に命令することができます。

**注記**  
スタックの更新時に、更新されたリソースに依存するリソースは自動的に更新されます。CloudFormation では、自動的に更新されるリソースは変更されませんが、スタックポリシーがこれらのリソースに関連付けられている場合、アカウントがそのポリシーを更新する権限を持っている必要があります。

## 構文
<a name="aws-attribute-dependson-syntax"></a>

`DependsOn` 属性には、単一の文字列または一連の文字列を指定できます。

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

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

次のテンプレートに含まれている [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) リソースの `DependsOn` 属性は、`myDB`、[AWS::RDS::DBInstance](https://docs.aws.amazon.com/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 内の一部のリソースはゲートウェイ (インターネットゲートウェイまたは VPN ゲートウェイのいずれか) を必要とします。VPC、ゲートウェイ、ゲートウェイアタッチメントを CloudFormation テンプレートで定義する場合、ゲートウェイを必要とするリソースはすべて、そのゲートウェイアタッチメントに依存することになります。たとえば、パブリック IP アドレスが割り当てられている Amazon EC2 インスタンスは、同じテンプレートで `VPC` リソースと `InternetGateway` リソースも宣言されている場合、VPC ゲートウェイのアタッチメントに依存します。

現在、次のリソースは、関連付けられたパブリック IP アドレスを持ち、VPC 内にある場合、VPC ゲートウェイのアタッチメントに依存します。
+ 「Auto Scaling グループ」
+ Amazon EC2 インスタンス
+ Elastic Load Balancing ロードバランサー
+ Elastic IP アドレス
+ Amazon RDS データベースインスタンス
+ インターネットゲートウェイを含む Amazon VPC のルート

VPN ゲートウェイがある場合、VPN ゲートウェイのルート伝達は、VPC ゲートウェイアタッチメントによって異なります。

以下のスニペットは、ゲートウェイのアタッチメントと、ゲートウェイアタッチメントに依存する 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 サービスと Auto Scaling グループ
<a name="w2aac19c19c17c19"></a>

Amazon ECS クラスター向けのコンテナインスタンスを作成する際 Auto Scaling あるいは Amazon Elastic Compute Cloud (Amazon EC2) を使用する場合、次のスニペットに示すように、Amazon ECS サービスリソースに Auto Scaling グループまたは 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>

AWS の追加呼び出しを行うリソースには、ユーザーに代わってサービスが AWS を呼び出せるようにするサービスロールが必要となります。たとえば、`AWS::CodeDeploy::DeploymentGroup` リソースには、インスタンスにアプリケーションをデプロイする権限を CodeDeploy に持たせるサービスロールが必要です。サービスロール、ロールのポリシー (`AWS::IAM::Policy` リソースまたは `AWS::IAM::ManagedPolicy` リソースを使用して)、およびそのロールを使用するリソースを定義する単一のテンプレートがある場合は、リソースがそのロールのポリシーに依存するように、依存性を追加します。この依存性により、ポリシーがリソースのライフサイクルを通じて利用できるようになります。

たとえば、デプロイグループリソース、サービスロール、およびロールのポリシーを持つテンプレートがあるとしましょう。スタックの作成時に、CloudFormation はロールのポリシーを作成するまでデプロイグループを作成しません。依存関係がない場合、CloudFormation はロールのポリシーを作成する前にデプロイグループリソースを作成できます。そうすると、デプロイグループは権限が不順分なため作成に失敗します。

ロールに組み込みポリシーがある場合は、依存関係を指定しないでください。CloudFormation は、ロールとポリシーを同時に作成します。