Criar condições de espera em um modelo do CloudFormation
Este tópico explica como criar uma condição de espera em um modelo para coordenar a criação de recursos de pilha ou acompanhar o progresso de um processo de configuração. Por exemplo, você pode iniciar a criação de outro recurso depois que a configuração de um aplicativo é parcialmente concluída, ou você pode enviar sinais durante um processo de instalação e configuração para acompanhar seu progresso.
Quando o CloudFormation cria uma pilha que inclui uma condição de espera:
-
Ele cria uma condição de espera como qualquer outro recurso e define o status da condição de espera como
CREATE_IN_PROGRESS
. -
O CloudFormation espera até receber o número necessário de sinais de sucesso ou até que o período de tempo limite da condição de espera seja atingido.
-
Se ele receber o número necessário de sinais de sucesso antes que o período de tempo limite seja atingido:
-
Espere que o status da condição mude para
CREATE_COMPLETE
-
A criação da pilha continua
-
-
Se o tempo limite for atingido ou um sinal de falha for recebido:
-
Espere que o status da condição mude para
CREATE_FAILED
-
Reverter a pilha
-
Importante
Para recursos do Amazon EC2 e do Auto Scaling, recomendamos usar um atributo CreationPolicy, em vez de condições de espera. Adicione um atributo CreationPolicy a esses recursos e use o script auxiliar cfn-signal para sinalizar quando um processo de criação de instância foi concluído com êxito.
Para ter mais informações, consulte Atributo CreationPolicy ou Implantar aplicações no Amazon EC2.
nota
Se você usar o AWS PrivateLink, os recursos do VPC que respondem a condições de espera deverão ter acesso aos buckets do Amazon Simple Storage Service (Amazon S3) específicos do CloudFormation. Recursos devem enviar respostas à condição de espera para um URL pré-assinado do Amazon S3. Se não puderem enviar respostas para o Amazon S3, o CloudFormation não receberá uma resposta e há falha na operação de pilha. Para obter mais informações, consulte Acessar o CloudFormation usando um endpoint de interface (AWS PrivateLink) e Controlar o acesso a partir de VPC endpoints com políticas de bucket.
Tópicos
Criar uma condição de espera no modelo
1. Processamento de condição de espera
Você começa definindo um recurso AWS::CloudFormation::WaitConditionHandle no modelo da pilha. Esse recurso gera o URL pré-assinado necessário para enviar sinais. Isso permite que você envie um sinal sem precisar fornecer as suas credenciais da AWS. Por exemplo:
Resources:
MyWaitHandle
: Type: AWS::CloudFormation::WaitConditionHandle
2. Condição de espera
Depois, você define um recurso AWS::CloudFormation::WaitCondition no modelo da pilha. A estrutura básica de um recurso AWS::CloudFormation::WaitCondition
é assim:
MyWaitCondition
: Type: AWS::CloudFormation::WaitCondition Properties: Handle:String
Timeout:String
Count:Integer
O recurso AWS::CloudFormation::WaitCondition
tem duas propriedades obrigatórias e uma propriedade opcional.
-
Handle
(obrigatório): uma referência a umWaitConditionHandle
declarado no modelo. -
Timeout
(obrigatório): o número de segundos que o CloudFormation deve esperar até o número necessário de sinais ser recebido.Timeout
é uma propriedade de limite mínimo, o que significa que o tempo limite não ocorre antes do tempo especificado, mas pode ocorrer logo depois. O tempo máximo que você pode especificar é 43200 segundos (12 horas). -
Count
(opcional): o número de sinais de sucesso que o CloudFormation deve receber antes de definir o status dessa condição de espera comoCREATE_COMPLETE
e continuar criando a pilha. Se não for especificado, o valor padrão é 1.
Normalmente, você quer que uma condição de espera comece imediatamente após a criação de um determinado recurso. Para isso, adicione o atributo DependsOn a uma condição de espera. Quando você adiciona um atributo DependsOn
a uma condição de espera, o CloudFormation primeiro cria o recurso no atributo DependsOn
e depois cria a condição de espera.
O seguinte exemplo ilustra uma condição de espera que:
-
Começa após a criação bem-sucedida do recurso
MyEC2Instance
-
Usa o recurso
MyWaitHandle
comoWaitConditionHandle
-
Tem um tempo limite de 4.500 segundos
-
Tem a
Count
padrão de 1 (já que nenhuma propriedadeCount
está especificada)
MyWaitCondition
: Type: AWS::CloudFormation::WaitCondition DependsOn:MyEC2Instance
Properties: Handle:!Ref MyWaitHandle
Timeout:'4500'
3. Enviar um sinal
Para sinalizar sucesso ou falha para o CloudFormation, você normalmente executa algum código ou script. Por exemplo, uma aplicação em execução em uma instância do EC2 pode realizar algumas tarefas de configuração adicionais e enviar um sinal para o CloudFormation para indicar a conclusão.
O sinal deve ser enviado para o URL pré-assinado gerado pelo identificador da condição de espera. Você usa o URL pré-assinado para sinalizar sucesso ou falha.
Para enviar um sinal
-
Para recuperar o URL pré-assinado no modelo, use a função intrínseca
Ref
com o nome lógico do identificador da condição de espera.Conforme mostrado no exemplo a seguir, o modelo pode declarar uma instância do Amazon EC2 e passar o URL pré-assinado para instâncias EC2 usando a propriedade
UserData
do Amazon EC2. Isso permite que scripts ou aplicações executados nessas instâncias sinalizem sucesso ou falha para o CloudFormation.MyEC2Instance
: Type: AWS::EC2::Instance Properties: InstanceType:t2.micro
# Example instance type ImageId:ami-055e3d4f0bbeb5878
# Change this as needed (Amazon Linux 2023 in us-west-2) UserData: Fn::Base64: Fn::Join: - "" - -"SignalURL="
- { "Ref":"MyWaitHandle"
}Isso gera uma saída
UserData
assim:SignalURL=https://amzn-s3-demo-bucket.s3.amazonaws.com/....
Observação: no AWS Management Console e nas ferramentas de linha de comando, o URL pré-assinado é exibido como um ID físico do identificador de condição de espera.
-
(Opcional) Para detectar quando a pilha entra na condição de espera, você pode usar um dos seguintes métodos:
-
Se você criar a pilha com notificações habilitadas, o CloudFormation publicará uma notificação para cada evento da pilha no tópico especificado. Se você ou seu aplicativo se inscrever nesse tópico, você poderá monitorar as notificações do evento de criação do identificador de condição de espera e recuperará o pre-signed URL na mensagem de notificação.
-
Você também pode monitorar os eventos da pilha usando o AWS Management Console, a AWS CLI ou um SDK.
-
-
Para enviar um sinal, envie uma mensagem de solicitação HTTP usando o pre-signed URL. O método de solicitação deve ser
PUT
, e o cabeçalhoContent-Type
deve ser omitido ou uma string vazia. A mensagem de solicitação deve ser uma estrutura JSON do formulário especificado em Sintaxe de sinal da condição de espera.É necessário enviar o número de sinais de sucesso especificados pela propriedade
Count
para que o CloudFormation continue a criar a pilha. Se a propriedadeCount
for maior do que 1, o valor doUniqueId
de cada sinal deverá ser exclusivo em todos os sinais enviados a uma condição de espera específica. OUniqueId
é uma string alfanumérica arbitrária.Um comando
curl
é uma forma de enviar um sinal. O exemplo a seguir mostra uma linha do comandocurl
que sinaliza o êxito para uma condição de espera.$
curl -T/tmp/a
\"https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
em que o arquivo
contém a seguinte estrutura JSON:/tmp/a
{ "Status" :
"SUCCESS"
, "Reason" :"Configuration Complete"
, "UniqueId" :"ID1234"
, "Data" :"Application has completed configuration."
}Este exemplo mostra uma linha do comando
curl
que envia o mesmo sinal de êxito, exceto que ele envia a estrutura JSON como um parâmetro na linha de comando.$
curl -X PUT \ -H 'Content-Type:' --data-binary'{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}'
\"https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
Sintaxe de sinal da condição de espera
Ao enviar sinais para o URL gerado pela condição de espera, você deve usar o seguinte formato JSON:
{ "Status" :
"StatusValue"
, "UniqueId" :"Some UniqueId"
, "Data" :"Some Data"
, "Reason" :"Some Reason"
}
Propriedades
O campo Status
pode ter um dos seguintes valores:
-
SUCCESS
-
FAILURE
O campo UniqueId
identifica o sinal para o CloudFormation. Se a propriedade Count
da condição de espera for maior que 1, o valor de UniqueId
deverá ser exclusivo em todos os sinais enviados de uma determinada condição de espera; caso contrário, o CloudFormation considerará o sinal uma retransmissão dos sinais enviados anteriormente com o mesmo UniqueId
e o ignorará.
O campo Data
pode conter qualquer informação que você deseje enviar de volta com o sinal. Você pode acessar o valor Data
chamando a função Fn::GetAtt no modelo.
O campo Reason
é uma string sem nenhuma outra restrição em seu conteúdo além de conformidade com JSON.
Acessar dados de sinal
Para acessar os dados enviados por sinais válidos, você pode criar um valor de saída para a condição de espera no modelo do CloudFormation. Por exemplo:
Outputs:
WaitConditionData
: Description:The data passed back as part of signalling the WaitCondition
Value: !GetAttMyWaitCondition
.Data
Você pode visualizar esses dados usando o comando describe-stacks ou a guia Saídas do console do CloudFormation.
A função Fn::GetAtt
retorna o UniqueId
e os Data
como um par de nome/valor em uma estrutura JSON. Por exemplo:
{"Signal1":"Application has completed configuration."}