メニュー
AWS CloudFormation
ユーザーガイド (API Version 2010-05-15)

DependsOn 属性

DependsOn 属性を使用すると、特定のリソースが他のリソースに続けて作成されるように指定できます。DependsOn 属性をリソースに追加した場合、そのリソースの作成は必ず、DependsOn 属性で指定したリソースの作成後に行われます。DependsOn 属性は任意のリソースで使用できます。以下に、代表的な用途をいくつか示します。

  • 待機条件が有効になるタイミングを指定する。詳細については、「テンプレートでの待機条件の作成」を参照してください。

  • 特定の順序で作成または削除する必要のあるリソースの依存関係を宣言する。たとえば、VPC のあるリソースに対するゲートウェイアタッチメントの依存関係を明示的に宣言する必要があります。詳細については、「DependsOn 属性が必要なとき」を参照してください。

  • リソースを作成、更新、削除する際のデフォルトの並列処理をオーバーライドする。AWS CloudFormation は、可能な限り並行してリソースを作成、更新、削除します。その際、並行して処理できるテンプレート内のリソースとオペレーションの実行順序を左右する依存関係とが自動的に判断されます。DependsOn を使用して依存関係を明示的に指定することで、デフォルトの並列処理をオーバーライドし、それらのリソースを決まった順序で処理するように CloudFormation に命令することができます。

Note

スタックの更新時に、更新されたリソースに依存するリソースは自動的に更新されます。AWS CloudFormation は自動更新されたリソースを一切変更しませんが、リソースにスタックポリシーが関連付けられている場合は、リソースの更新を許可される必要があります。

構文

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

"DependsOn" : [ String, ... ]

以下のテンプレートに記述されている AWS::EC2::Instance リソースの DependsOn 属性には、myDB (AWS::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 内の一部のリソースはゲートウェイ (インターネットゲートウェイまたは VPN ゲートウェイのいずれか) を必要とします。VPC、ゲートウェイ、ゲートウェイアタッチメントを AWS 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

"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 ECS クラスター向けのコンテナインスタンスを作成する際 Auto Scaling あるいは Amazon Elastic Compute Cloud (Amazon EC2) を使用する場合、次のスニペットに示すように、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::Policy リソースまたは AWS::IAM::ManagedPolicy リソースを使用して)、およびそのロールを使用するリソースを定義する単一のテンプレートがある場合は、リソースがそのロールのポリシーに依存するように、依存性を追加します。この依存性により、ポリシーがリソースのライフサイクルを通じて利用できるようになります。

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

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