DependsOn 属性 - AWS CloudFormation

DependsOn 属性

DependsOn 属性を使用すると、特定のリソースが他のリソースに続けて作成されるように指定できます。DependsOn 属性をリソースに追加した場合、そのリソースの作成は必ず、DependsOn 属性で指定したリソースの作成後に行われます。

重要

依存スタックには、ターゲットプロパティ !Ref!GetAtt および !Sub の形式の暗黙的な依存関係もあります。たとえば、リソース A のプロパティでリソース B への !Ref を使用する場合、次のルールが適用されます。

  • リソース B はリソース A の前に作成されます。

  • リソース A はリソース B の前に削除されます。

  • リソース B はリソース A の前に更新されます。

DependsOn 属性は任意のリソースで使用できます。以下に、代表的な用途をいくつか示します。

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

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

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

注記

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

Syntax

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

"DependsOn" : [ String, ... ]

次のテンプレートに含まれている AWS::EC2::Instance リソースの DependsOn 属性は、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 内の一部のリソースはゲートウェイ (インターネットゲートウェイまたは 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

"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 インスタンスに対する依存性があることが必要です。これにより、コンテナインスタンスが有効になり、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::Policy リソースまたは AWS::IAM::ManagedPolicy リソースを使用して)、およびそのロールを使用するリソースを定義する単一のテンプレートがある場合は、リソースがそのロールのポリシーに依存するように、依存性を追加します。この依存性により、ポリシーがリソースのライフサイクルを通じて利用できるようになります。

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

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