Atributo DependsOn - AWS CloudFormation

Atributo DependsOn

Com o atributo DependsOn, você pode especificar que a criação de um recurso específico segue outro. Quando você adiciona um atributo DependsOn a um recurso, esse recurso é criado apenas após a criação do recurso especificado no atributo DependsOn.

Importante

Pilhas dependentes também têm dependências implícitas na forma de propriedades de destino !Ref e !GetAtt. Por exemplo, as seguintes regras serão aplicadas se as propriedades do recurso A usarem um !Ref para o recurso B:

  • O recurso B é criado antes do recurso A.

  • O recurso A é excluído antes do recurso B.

  • O recurso B é atualizado antes do recurso A.

Você pode usar o atributo DependsOn com qualquer recurso. Estes são alguns usos típicos:

  • Determinar quando uma condição de espera entra em vigor. Para obter mais informações, consulte Criar condições de espera em um modelo.

  • Declarar dependências para recursos que devem ser criados ou excluídos em uma ordem específica. Por exemplo, você deve declarar explicitamente dependências de anexos de gateway para alguns recursos em uma VPC. Para obter mais informações, consulte Quando um atributo DependsOn é necessário.

  • Substituir o paralelismo padrão ao criar, atualizar ou excluir recursos. O AWS CloudFormation cria, atualiza e exclui recursos em paralelo até o máximo possível. Ele determina automaticamente quais recursos em um modelo podem ser paralelizados e quais têm dependências que exigem que outras operações encerrem primeiro. Você pode usar DependsOn para especificar explicitamente dependências, o que substitui o paralelismo padrão e instrui o CloudFormation a operar nesses recursos em uma ordem específica.

nota

Durante uma atualização de pilha, os recursos que dependem de recursos atualizados são atualizados automaticamente. O CloudFormation não faz alterações nos recursos atualizados automaticamente, mas, se uma política de pilha estiver associada a esses recursos, sua conta deverá ter as permissões para atualizá-los.

Sintaxe

O atributo DependsOn pode usar uma única sequência ou uma lista de sequências.

"DependsOn" : [ String, ... ]

Exemplo

O modelo a seguir contém um recurso AWS::EC2::Instance com um atributo DependsOn que especifica myDB, um AWS::RDS::DBInstance. Quando o CloudFormation cria essa pilha, ele primeiro cria o myDB e, em seguida, cria a 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

Quando um atributo DependsOn é necessário

Anexo de gateway de VPC

Alguns recursos em uma VPC exigem um gateway (um gateway de VPN ou de Internet). Se o modelo do CloudFormation definir uma VPC, um gateway e um anexo de gateway, todos os recursos que requeiram o gateway dependerão do anexo de gateway. Por exemplo, uma instância de Amazon EC2 com um endereço IP público será dependente do anexo de gateway de VPC se os recursos VPC e InternetGateway também forem declarados no mesmo modelo.

Atualmente, os seguintes recursos dependem de um anexo de gateway de VPC quando tiverem um endereço IP público associado e estiverem em uma VPC:

  • Grupos do Auto Scaling

  • Instâncias Amazon EC2

  • Load balancers Elastic Load Balancing

  • Endereços IP elásticos

  • Instâncias de bancos de dados Amazon RDS

  • Rotas da Amazon VPC que incluem o Internet gateway

A propagação de uma rota de gateway de VPN depende de um anexo de gateway de VPC quando você tem um gateway de VPN.

O trecho a seguir mostra um anexo de gateway de exemplo e uma instância Amazon EC2 que depende de um anexo de 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

Serviço Amazon ECS e grupo do Auto Scaling

Quando você usaAuto Scaling ouAmazon Elastic Compute Cloud (Amazon EC2) para criar instâncias de contêiner para umAmazon ECS cluster, o recurso de serviço Amazon ECS deve ter uma dependência do grupo Auto Scaling ou instâncias do Amazon EC2, conforme mostrado no snippet a seguir. Dessa forma, as instâncias de contêiner estão disponíveis e associadas ao Amazon ECS cluster antes de CloudFormation criar o serviço 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 função do IAM

Os recursos que fazem chamadas adicionais para a AWS exigem uma função de serviço, o que permite que um serviço faça chamadas para a AWS em seu nome. Por exemplo, o recurso AWS::CodeDeploy::DeploymentGroup exige uma função de serviço para que o CodeDeploy tenha permissões para implantar aplicativos em suas instâncias. Quando você tiver um único modelo que define uma função de serviço, a política de função (usando o recurso AWS::IAM::Policy ou AWS::IAM::ManagedPolicy) e um recurso que usa a função, adicione uma dependência para que o recurso dependa da política de função. Essa dependência garante que a política esteja disponível durante todo o ciclo de vida do recurso.

Por exemplo, imagine que você tem um modelo com um recurso de grupo de implantação, uma função de serviço e a política da função. Quando você cria uma pilha, o CloudFormation não cria o grupo de implantação até que a política de função seja criada. Sem a dependência, o CloudFormation pode criar o recurso de grupo de implantação antes de criar a política da função. Se isso acontecer, o grupo de implantação não poderá ser criado devido a permissões insuficientes.

Se a função tiver uma política inserida, não especifique uma dependência. O CloudFormation cria a função e a política dela ao mesmo tempo.