Atributo DependsOn - AWS CloudFormation

Atributo DependsOn

Con el atributo DependsOn puede especificar que a la creación de un recurso específico le sigue otra: Cuando añade un atributo DependsOn a un recurso, ese recurso se crea solo tras la creación del recurso especificado en el atributo DependsOn.

importante

Las pilas dependientes también tienen dependencias implícitas en forma de propiedades de destino !Ref, !GetAtt y !Sub. Por ejemplo, si las propiedades de un recurso A utilizan una !Ref al recurso B, se aplican las siguientes reglas:

  • El recurso B se crea antes que el recurso A.

  • El recurso A se elimina antes que el recurso B.

  • El recurso B se actualiza antes que el recurso A.

Puede utilizar el atributo DependsOn con cualquier recurso. A continuación le presentamos algunos usos habituales:

  • Determine cuándo entra en vigor una condición de espera. Para obtener más información, consulte Creación de condiciones de espera en una plantilla.

  • Declare dependencias para recursos que deben crearse o eliminarse en un orden específico. Por ejemplo, debe declarar explícitamente dependencias en las vinculaciones de la gateway para algunos recursos en una VPC. Para obtener más información, consulte Cuándo es obligatorio un atributo DependsOn.

  • Invalidación de paralelismo predeterminado al crear, actualizar o eliminar recursos. AWS CloudFormation crea, actualiza y elimina los recursos en paralelo en la medida de lo posible. Determina automáticamente qué recursos de una plantilla pueden paralelizarse y cuáles tienen dependencias que requieren que primero terminen otras operaciones. Puede utilizar DependsOn para especificar explícitamente dependencias, lo cual invalida el paralelismo predeterminado e indica a CloudFormation que opere en esos recursos en un orden especificado.

nota

Mientras se actualiza la pila, los recursos que dependen de recursos actualizados se actualizan automáticamente. CloudFormation no realiza cambios a recursos que se han actualizado automáticamente, pero, si existe una política de pilas asociada a estos recursos, la cuenta debe tener permiso para actualizarlos.

Sintaxis

El atributo DependsOn puede tomar una única cadena o una lista de cadenas.

"DependsOn" : [ String, ... ]

Ejemplo

La siguiente plantilla contiene un recurso AWS::EC2::Instance con un atributo DependsOn que especifica myDB, un AWS::RDS::DBInstance. Cuando CloudFormation crea esta pila, crea myDB, en primer lugar y, a continuación, crea 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

Cuándo es obligatorio un atributo DependsOn

Vinculación VPC-gateway

Algunos recursos de una VPC requieren una gateway (ya sea una gateway de Internet o VPN). Si su plantilla de CloudFormation define una VPC, una gateway y una vinculación de la gateway, cualquier recurso que requiera la gateway depende de la vinculación de la gateway. Por ejemplo, una instancia Amazon EC2 con una dirección IP pública depende de la conexión de gateway de VPC si los recursos VPC e InternetGateway también se declaran en la misma plantilla.

En la actualidad, los siguientes recursos dependen de una vinculación de una puerta de enlace VPC cuando tienen una dirección IP pública asociada y están en una VPC.

  • Grupos de escalado automático

  • Instancias de Amazon EC2

  • Balanceadores de carga de Elastic Load Balancing

  • Direcciones IP elásticas

  • Instancia de base de datos de Amazon RDS

  • Rutas de Amazon VPC que incluyen la gateway de Internet

La propagación de una ruta de gateway de VPN depende de una vinculación VPC-gateway cuando tiene una gateway de VPN.

El siguiente ejemplo muestra una vinculación de gateway de ejemplo y una instancia Amazon EC2 que depende de una vinculación de la gateway:

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

Servicio de Amazon ECS y grupo de Auto Scaling

Al utilizar Auto Scaling o Amazon Elastic Compute Cloud (Amazon EC2) para crear instancias de contenedor de un clúster de Amazon ECS, el recurso del servicio de Amazon ECS debe tener una dependencia en el grupo de Auto Scaling o las instancias Amazon EC2 tal y como se muestra en el siguiente fragmento de código. De esta manera las instancias de contenedor están disponibles y asociadas al clúster de Amazon ECS antes de que CloudFormation cree el servicio de 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

Política de roles de IAM

Los recursos que realizan llamadas adicionales a AWS necesitan un rol de servicio, lo que permite a un servicio realizar llamadas a AWS en su nombre. Por ejemplo, el recurso AWS::CodeDeploy::DeploymentGroup requiere un rol de servicio para que CodeDeploy tenga permisos para la implementación de aplicaciones en sus instancias. Cuando tenga una única plantilla que define un rol de servicio, la política del rol (a través del recurso AWS::IAM::Policy o AWS::IAM::ManagedPolicy) y un recurso que utiliza el rol, añada una dependencia para que el recurso dependa de la política del rol. Esta dependencia garantiza que la política esté disponible durante todo el ciclo de vida del recurso.

Por ejemplo, imagine que tiene una plantilla con un recurso de grupo de implementaciones, un rol de servicio y la política del rol. Cuando crea una pila, CloudFormation no creará el grupo de implementaciones hasta que cree la política del rol. Sin la dependencia, CloudFormation puede crear el recurso del grupo de implementaciones antes de crear la política del rol. Si esto ocurre, no se creará el grupo de implementaciones debido a que los permisos son insuficientes.

Si el rol tiene una política incrustada, no especifique una dependencia. CloudFormation crea el rol y su política al mismo tiempo.