DependsOn-Attribut - AWS CloudFormation

DependsOn-Attribut

Mit dem DependsOn-Attribut können Sie angeben, dass die Erstellung einer bestimmten Ressource einer anderen folgt. Wenn Sie einer Ressource ein DependsOn-Attribut hinzufügen, wird die Ressource erst nach der Erstellung der im DependsOn-Attribut angegebenen Ressource erstellt.

Wichtig

Abhängige Stacks haben auch implizite Abhängigkeiten in Form der Zieleigenschaften !Ref und !GetAtt. Wenn beispielsweise die Eigenschaften der Ressource A einen !Ref auf Ressource B verwenden, gelten die folgenden Regeln:

  • Ressource B wird vor Ressource A erstellt.

  • Ressource A wird vor Ressource B gelöscht.

  • Ressource B wird vor Ressource A aktualisiert.

Sie können das DependsOn-Attribut mit jeder Ressource verwenden. Hier finden Sie einige typische Anwendungsfälle:

  • Ermitteln, wann eine Wartebedingung in Kraft tritt. Weitere Informationen finden Sie unter Erstellen von Wartebedingungen in einer Vorlage.

  • Deklarieren Sie Abhängigkeiten für Ressourcen, die in einer bestimmten Reihenfolge erstellt oder gelöscht werden müssen. Beispiel: Sie müssen für einige Ressourcen in einer VPC explizit Abhängigkeiten von Gateway-Anhängen deklarieren. Weitere Informationen finden Sie unter Wann ist ein DependsOn-Attribut erforderlich?.

  • Überschreiben Sie beim Erstellen, Aktualisieren und Löschen von Ressourcen Standardparallelität. AWS CloudFormation erstellt, aktualisiert und löscht Ressourcen soweit möglich parallel. Es wird automatisch bestimmt, welche Ressourcen in einer Vorlage parallel ausgeführt werden und welche Ressourcen Abhängigkeiten aufweisen, bei denen zuerst andere Vorgänge abgeschlossen werden müssen. Sie können DependsOn verwenden, um explizit Abhängigkeiten anzugeben, was die Standardparallelität außer Kraft setzt und CloudFormation anweist, diese Ressourcen in einer bestimmten Reihenfolge auszuführen.

Anmerkung

Während einer Stack-Aktualisierung werden Ressourcen, die von aktualisierten Ressourcen abhängen, automatisch aktualisiert. CloudFormation führt keine Änderungen an den automatisch aktualisierten Ressourcen durch. Wenn diesen Ressourcen allerdings eine Stack-Richtlinie zugeordnet ist, muss Ihr Konto über die Berechtigungen verfügen, diese zu aktualisieren.

Syntax

Für das DependsOn-Attribut kann eine einzelne Zeichenfolge oder eine Liste von Zeichenfolgen verwendet werden.

"DependsOn" : [ String, ... ]

Beispiel

Die folgende Vorlage enthält eine AWS::EC2::Instance-Ressource mit einem DependsOn-Attribut, das myDB angibt,eine AWS::RDS::DBInstance. Wenn CloudFormation diesen Stack erstellt, wird erst myDB und dann Ec2Instance erstellt.

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

Wann ist ein DependsOn-Attribut erforderlich?

VPC-Gateway-Anhang

Einige Ressourcen in einer VPC benötigen ein Gateway (entweder ein Internet- oder VPN-Gateway). Wenn Ihre CloudFormation-Vorlage eine VPC, ein Gateway und einen Gateway-Anhang definiert, dann sind alle Ressourcen, die das Gateway benötigen, von dem Gateway-Anhang abhängig. Eine Amazon EC2-Instance mit einer öffentlichen IP-Adresse ist beispielsweise von dem VPC-Gateway-Anhang abhängig, wenn die VPC- und InternetGateway-Ressourcen ebenfalls in der gleichen Vorlage deklariert sind.

Derzeit sind die folgenden Ressourcen von einem VPC-Gateway-Anhang abhängig, wenn sie über eine dazugehörige öffentliche IP-Adresse verfügen und in einer VPC sind.

  • Auto Scaling-Gruppen

  • Amazon EC2-Instances

  • Elastic Load Balancing-Load Balancer

  • Elastic IP-Adressen

  • Amazon RDS-Datenbank-Instances

  • Amazon VPC-Routen, die das Internet-Gateway enthalten

Eine VPN-Gateway-Routing-Verbreitung hängt von einem VPC-Gateway-Anhang ab, wenn Sie über ein VPN-Gateway verfügen.

Der folgende Codeausschnitt zeigt ein Beispiel für einen Gateway-Anhang und eine Amazon EC2-Instance, die von einem Gateway-Anhang abhängt:

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-Service und Auto Scaling-Gruppe

Wenn Sie Auto Scaling oder Amazon Elastic Compute Cloud (Amazon EC2) zum Erstellen von Container-Instances für einen Amazon ECS-cluster verwenden, muss die Amazon ECS-Service-Ressource eine Abhängigkeit von der Auto Scaling-Gruppe oder den Amazon EC2-Instances aufweisen, wie im folgenden Codeausschnitt dargestellt. Auf diese Weise sind die Container-Instances verfügbar und dem Amazon ECScluster zugeordnet, bevor CloudFormation den Amazon ECS-Service erstellt.

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-Rollenrichtlinie

Ressourcen, die zusätzliche Aufrufe an AWS vornehmen, benötigen eine Servicerolle, die einem Service erlaubt, in Ihrem Namen Aufrufe an AWS durchzuführen. Beispiel: Die AWS::CodeDeploy::DeploymentGroup-Ressource benötigt eine Servicerolle, damit CodeDeploy Berechtigungen zum Bereitstellen von Anwendungen auf Ihren Instances besitzt. Wenn Sie über eine einzelne Vorlage verfügen, die eine Servicerolle definiert, wird durch die Richtlinie der Rolle (mithilfe der AWS::IAM::Policy- oder AWS::IAM::ManagedPolicy-Ressource) und eine Ressource, welche die Rolle verwendet, eine Abhängigkeit hinzugefügt, sodass die Ressource von der Richtlinie der Rolle abhängt. Diese Abhängigkeit stellt sicher, dass die Richtlinie während des gesamten Lebenszyklus der Ressource verfügbar ist.

Angenommen, Sie haben beispielsweise eine Vorlage mit einer Bereitstellungsgruppenressource, einer Servicerolle und der Richtlinie der Rolle. Wenn Sie einen Stack erstellen, erstellt CloudFormation die Bereitstellungsgruppe erst, wenn die Richtlinie der Rolle erstellt wurde. Ohne die Abhängigkeit kann CloudFormation die Bereitstellungsgruppenressource erstellen, bevor die Richtlinie der Rolle erstellt wurde. Wenn dies der Fall ist, kann die Bereitstellungsgruppe aufgrund unzureichender Berechtigungen nicht erstellt werden.

Wenn die Rolle über eine eingebettete Richtlinie verfügt, geben Sie keine Abhängigkeit an. CloudFormation erstellt die Rolle und die entsprechende Richtlinie gleichzeitig.