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
, !GetAtt
e !Sub
. 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 ter mais informações, consulte Criar condições de espera em um modelo do CloudFormation.
-
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 ter mais informações, consulte Quando um atributo DependsOn é obrigató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 CloudFormation a operar nesses recursos em uma ordem específica.
nota
Durante a atualização de uma 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
é obrigató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 do 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ê usa o Auto Scaling ou Amazon Elastic Compute Cloud (Amazon EC2) para criar instâncias de contêiner para um cluster de Amazon ECS o recurso do serviço de Amazon ECS deve ter uma dependência do grupo de Auto Scaling ou de instâncias de Amazon EC2 conforme mostrado no trecho a seguir. Dessa forma, as instâncias de contêiner estão disponíveis e associadas ao cluster de Amazon ECS antes do CloudFormation criar o serviço 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 perfil 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 aplicações 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 sua política ao mesmo tempo.