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, ...
]
例
次のテンプレートに含まれている 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 グループ」
-
アマゾン 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 は、ロールとポリシーを同時に作成します。