Detectar alterações de configuração não gerenciadas em conjuntos de pilhas - AWS CloudFormation

Detectar alterações de configuração não gerenciadas em conjuntos de pilhas

Mesmo que você gerencie as pilhas e seus respectivos recursos usando o CloudFormation, os usuários poderão alterar esses recursos fora do CloudFormation. Os usuários podem editar recursos diretamente usando o serviço subjacente que os criou. Ao realizar a detecção de desvios em um conjunto de pilhas, você pode determinar se existem instâncias da pilha pertencentes ao conjunto de pilhas que sejam diferentes ou apresentem desvios com relação à configuração esperada.

Como o CloudFormation realiza a detecção de desvios em um conjunto de pilhas

Quando o CloudFormation executa a detecção de desvio em um conjunto de pilhas, ele a executa na pilha associada a cada instância de pilha no conjunto de pilhas. Para isso, o CloudFormation compara o estado atual de cada recurso na pilha com o estado esperado desse recurso, conforme definido no modelo da pilha e em todos os parâmetros de entrada especificados. Se o estado atual de um recurso for diferente do estado esperado, esse recurso será considerado como contendo desvios. Se um ou mais recursos em uma pilha apresentarem desvios, a própria pilha será considerada como contendo desvios e as instâncias da pilha às quais a pilha está associada também serão consideradas como contendo desvios. Se uma ou mais instâncias da pilha em um conjunto de pilhas apresentarem desvios, o próprio conjunto de pilhas será considerado como contendo desvios.

A detecção de desvios identifica alterações não gerenciadas; ou seja, as alterações feitas nas pilhas fora do CloudFormation. As alterações feitas diretamente em uma pilha por meio do CloudFormation, em vez de no nível do conjunto de pilhas, não são consideradas como desvios. Por exemplo, suponha que você tenha uma pilha que está associada a uma instância de pilha de um conjunto de pilhas. Se você usar o CloudFormation para atualizar essa pilha a fim de usar um modelo diferente, isso não será considerado um desvio, mesmo que essa pilha tenha um modelo diferente das outras pilhas pertencentes a esse conjunto de pilhas. Isso ocorre porque a pilha ainda corresponderá ao modelo esperado e à configuração do parâmetro no CloudFormation.

Para obter informações detalhadas sobre como o CloudFormation realiza a detecção de desvios em uma pilha, consulte Detectar alterações de configuração não gerenciadas em pilhas e recursos.

Como o CloudFormation executa a detecção de desvios individualmente em cada pilha, ele considera todos os valores de parâmetros substituídos ao determinar se uma pilha está com desvios. Para saber mais sobre como substituir parâmetros de modelos em instâncias de pilhas, consulte Substituir parâmetros em instâncias de pilha.

Caso execute a detecção de desvios diretamente em uma pilha que esteja associada a uma instância de pilha, esses resultados de desvios não estarão disponíveis na página do console StackSets (Conjunto de pilhas).

Como detectar desvios em um conjunto de pilhas usando o AWS Management Console

  1. Abra o console do AWS CloudFormation em https://console.aws.amazon.com/cloudformation.

  2. Na página StackSets (Conjuntos de pilhas), selecione o conjunto de pilhas no qual deseja executar a detecção de desvios.

  3. No menu Actions (Ações), selecione Detect drifts (Detectar desvios).

    O CloudFormation exibe uma barra de informações que declara que a detecção de desvios foi iniciada para o conjunto de pilhas selecionado.

  4. Opcional: para monitorar o progresso da operação de detecção de desvios:

    1. Selecione o nome do conjunto de pilhas para exibir a página Stackset details (Detalhes do conjunto de pilhas).

    2. Selecione a guia Operations (Operações), selecione a operação de detecção de desvios e selecione View drift details (Visualizar detalhes do desvio).

    O CloudFormation exibe a caixa de diálogo Operation details (Detalhes da operação).

  5. Aguarde até que o CloudFormation conclua a operação de detecção de desvios. Quando a operação de detecção de desvios estiver concluída, o CloudFormation atualizará o Drift status (Status de desvio) e o Last drift check time (Tempo da última verificação de desvio) para o conjunto de pilhas. Estes campos estão listados na guia Overview (Visão geral) da página StackSet details (Detalhes do conjunto de pilhas) para o conjunto de pilhas selecionado.

    A operação de detecção de desvios pode levar algum tempo, dependendo do número de instâncias de pilhas incluídas no conjunto de pilhas e do número de recursos inclusos no conjunto de pilhas. Só é possível executar uma operação de detecção de desvios em um determinado conjunto de pilhas de uma só vez. O CloudFormation continua a operação de detecção de desvios mesmo após você descartar a barra de informações.

  6. Para revisar os resultados de detecção de desvios para as instâncias da pilha em um conjunto de pilhas, selecione a guia Stack instances (Instâncias da pilha).

    A coluna Stack name (Nome da pilha) lista o nome da pilha associada a cada instância de pilha e a coluna Drift status (Status de desvio) lista o status do desvio da pilha. Considera-se que uma pilha foi desviada se um ou mais de seus recursos contêm desvios.

  7. Para revisar os resultados da detecção de desvios da pilha associada às instâncias de uma pilha específica:

    1. Anote a AWS account (Conta da AWS), o Stack name (Nome da pilha) e a AWS region (Região da AWS) da instância da pilha.

    2. Abra o console do AWS CloudFormation em https://console.aws.amazon.com/cloudformation.

      Faça login na conta da AWS que contém a instância da pilha.

    3. Selecione a região da AWS que contém a instância da pilha.

    4. No painel de navegação à esquerda, selecione Stacks (Pilhas).

    5. Selecione a pilha que deseja visualizar e selecione Drifts (Desvios).

      O CloudFormation exibe a página Drifts (Desvios) para a pilha associada à instância da pilha especificada.

    Na seção Resource drift status (Status de desvio do recurso), o CloudFormation lista cada recurso de pilha, seu status de desvio e a última vez em que a detecção de desvios foi iniciada no recurso. O ID lógico e o ID físico de cada recurso são exibidos para ajudar você a identificá-los. Além disso, para recursos com status MODIFIED (MODIFICADO) , o CloudFormation exibe detalhes de desvios do recurso.

    É possível classificar os recursos com base em seus status de desvio usando a coluna Drift status (Status de desvio).

    1. Para exibir os detalhes em um recurso modificado.

      1. Com o recurso modificado selecionado, escolha View drift details (Exibir detalhes de desvio).

        O CloudFormation exibe a página de detalhes de desvios desse recurso. Esta página lista os valores de propriedade esperados e atuais do recurso e quaisquer diferenças entre os dois.

        Para destacar uma diferença, na seção Differences (Diferenças), selecione o nome da propriedade.

        • As propriedades adicionadas são destacadas em verde na coluna Current (Atuais) da seção Details (Detalhes).

        • As propriedades excluídas são destacadas em vermelho na coluna Expected (Esperadas) da seção Details (Detalhes).

        • As propriedades que tiveram valor alterado serão destacadas em azul nas colunas Esperado e Atual.

    
                    A seção Resource drift status (Status de desvio de recursos) da página Drift Details (Detalhes do desvio), que contém as informações de desvio para cada recurso na pilha compatível com a detecção de desvios. Os detalhes incluem o status de desvio e os valores de propriedade esperados e atuais.

Como detectar desvios em um conjunto de pilhas usando a AWS CLI

Para detectar desvios em uma pilha inteira usando a AWS CLI, use os seguintes comandos aws cloudformation:

  • detect-stack-set-drift para iniciar uma operação de detecção de desvios em uma pilha.

  • describe-stack-set-operation para monitorar o status da operação de detecção de desvios da pilha.

  • Após a operação de detecção de desvios ter sido concluída, use os comandos a seguir para retornar as informações de desvios desejadas:

    • Use describe-stack-set para retornar informações detalhadas sobre o conjunto de pilhas, incluindo informações detalhadas sobre a última operação de desvio concluída realizada no conjunto de pilhas. (As informações sobre operações de desvios em andamento não estão incluídas.)

    • Use list-stackinstances para retornar uma lista de instâncias da pilha que pertencem ao conjunto de pilhas, incluindo o status de desvio e a hora da última verificação do desvio de cada instância.

    • Use describe-stack-instance para retornar informações detalhadas sobre uma instância de pilha específica, incluindo o status de desvio e a hora da última verificação de desvio.

  1. Use detect-stack-set-drift para detectar desvios em todo um conjunto de pilhas e nas instâncias de pilha associadas.

    O exemplo a seguir inicia a detecção de desvios no conjunto de pilhas stack-set-drift-example.

    aws cloudformation detect-stack-set-drift --stack-set-name stack-set-drift-example { "OperationId": "c36e44aa-3a83-411a-b503-cb611example" }
  2. Como as operações de detecção de desvios do conjunto de pilhas podem ser de longa execução, use describe-stack-set-operation para monitorar o status da operação de desvios. Este comando usa o ID da operação do conjunto de pilhas retornado pelo comando detect-stack-set-drift.

    Os exemplos a seguir usam o ID da operação do exemplo anterior para retornar informações sobre a operação de detecção de desvios do conjunto de pilhas. Neste exemplo, a operação ainda está em andamento. Das sete instâncias de pilha associadas a este conjunto de pilhas, uma instância da pilha já foi detectada como dessincronizada, duas instâncias estão sincronizadas e a detecção de desvios para as outras quatro instâncias da pilha ainda está em andamento. Como uma instância está com desvio, o status de desvio do próprio conjunto de pilhas está como DRIFTED.

    aws cloudformation describe-stack-set-operation --stack-set-name stack-set-drift-example --operation-id c36e44aa-3a83-411a-b503-cb611example { "StackSetOperation": { "Status": "RUNNING", "AdministrationRoleARN": "arn:aws:iam::012345678910:role/AWSCloudFormationStackSetAdministrationRole", "OperationPreferences": { "RegionOrder": [] }, "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole", "StackSetDriftDetectionDetails": { "DriftedStackInstancesCount": 1, "TotalStackInstancesCount": 7, "LastDriftCheckTimestamp": "2019-12-04T20:34:28.543Z", "InSyncStackInstancesCount": 2, "InProgressStackInstancesCount": 4, "DriftStatus": "DRIFTED", "FailedStackInstancesCount": 0 }, "Action": "DETECT_DRIFT", "CreationTimestamp": "2019-12-04T20:33:13.673Z", "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22example", "OperationId": "c36e44aa-3a83-411a-b503-cb611example" } }

    Ao executar o mesmo comando posteriormente, este exemplo mostra as informações retornadas após a operação de detecção de desvios ter sido concluída. Duas das sete instâncias da pilha associada a este conjunto de pilhas estão dessincronizadas, renderizando o status de desvio do próprio conjunto de pilhas como DRIFTED.

    aws cloudformation describe-stack-set-operation --stack-set-name stack-set-drift-example --operation-id c36e44aa-3a83-411a-b503-cb611example { "StackSetOperation": { "Status": "SUCCEEDED", "AdministrationRoleARN": "arn:aws:iam::012345678910:role/AWSCloudFormationStackSetAdministrationRole", "OperationPreferences": { "RegionOrder": [] } "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole", "EndTimestamp": "2019-12-04T20:37:32.829Z", "StackSetDriftDetectionDetails": { "DriftedStackInstancesCount": 2, "TotalStackInstancesCount": 7, "LastDriftCheckTimestamp": "2019-12-04T20:36:55.612Z", "InSyncStackInstancesCount": 5, "InProgressStackInstancesCount": 0, "DriftStatus": "DRIFTED", "FailedStackInstancesCount": 0 }, "Action": "DETECT_DRIFT", "CreationTimestamp": "2019-12-04T20:33:13.673Z", "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22example", "OperationId": "c36e44aa-3a83-411a-b503-cb611example" } }
  3. Quando a operação de detecção de desvios do conjunto de pilhas estiver concluída, use os comandos describe-stack-set, list-stackinstances e describe-stack-instance para revisar os resultados.

    O comando describe-stack-set inclui as mesmas informações detalhadas de desvios retornadas pelo comando describe-stack-set-operation.

    aws cloudformation describe-stack-set --stack-set-name stack-set-drift-example { "StackSet": { "Status": "ACTIVE", "Description": "Demonstration of drift detection on stack sets.", "Parameters": [], "Tags": [ { "Value": "Drift detection", "Key": "Feature" } ], "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole", "Capabilities": [], "AdministrationRoleARN": "arn:aws:iam::012345678910:role/AWSCloudFormationStackSetAdministrationRole", "StackSetDriftDetectionDetails": { "DriftedStackInstancesCount": 2, "TotalStackInstancesCount": 7, "LastDriftCheckTimestamp": "2019-12-04T20:36:55.612Z", "InProgressStackInstancesCount": 0, "DriftStatus": "DRIFTED", "DriftDetectionStatus": "COMPLETED", "InSyncStackInstancesCount": 5, "FailedStackInstancesCount": 0 }, "StackSetARN": "arn:aws:cloudformation:us-east-1:012345678910:stackset/stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22example", "TemplateBody": [details omitted], "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22ebexample", "StackSetName": "stack-set-drift-example" } }

    Você pode usar o comando list-stack-instances para retornar informações resumidas sobre as instâncias da pilha associada a um conjunto de pilhas, incluindo o status de desvio de cada instância da pilha.

    Neste exemplo, executar list-stack-instances no conjunto de pilhas de exemplo permite identificar quais das duas instâncias da pilha têm o status de desvio DRIFTED.

    aws cloudformation list-stack-instances --stack-set-name stack-set-drift-example { "Summaries": [ { "StackId": "arn:aws:cloudformation:ap-northeast-1:012345678910:stack/StackSet-stack-set-drift-example-29168cdd-e587-4709-8a1f-90f752ec65e1/1a8a98f0-16d4-11ea-9844-060a5example", "Status": "CURRENT", "Account": "012345678910", "Region": "ap-northeast-1", "LastDriftCheckTimestamp": "2019-12-04T20:36:18.481Z", "DriftStatus": "IN_SYNC", "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample" }, { "StackId": "arn:aws:cloudformation:eu-west-1:012345678910:stack/StackSet-stack-set-drift-example-b0fb6083-60c0-4e39-af15-2f071e0db90c/0e4f0940-16d4-11ea-93d8-0641cexample", "Status": "CURRENT", "Account": "012345678910", "Region": "eu-west-1", "LastDriftCheckTimestamp": "2019-12-04T20:37:32.687Z", "DriftStatus": "DRIFTED", "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample }, { "StackId": "arn:aws:cloudformation:us-east-1:012345678910:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example", "Status": "CURRENT", "Account": "012345678910", "Region": "us-east-1", "LastDriftCheckTimestamp": "2019-12-04T20:34:28.275Z", "DriftStatus": "DRIFTED", "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample" }, [additional stack instances omitted] ] }

    O comando describe-stack-instance também retorna essas informações, mas para uma única instância da pilha, conforme exibido no exemplo abaixo.

    aws cloudformation describe-stack-instance --stack-set-name stack-set-drift-example --stack-instance-account 012345678910 --stack-instance-region us-east-1 { "StackInstance": { "StackId": "arn:aws:cloudformation:us-east-1:012345678910:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example", "Status": "CURRENT", "Account": "012345678910", "Region": "us-east-1", "ParameterOverrides": [], "DriftStatus": "DRIFTED", "LastDriftCheckTimestamp": "2019-12-04T20:34:28.275Z", "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample" } }
  4. Após identificar quais instâncias estão dessincronizadas, você pode usar as informações sobre as instâncias da pilha retornadas pelos comandos list-stack-instances ou describe-stack-instance para executar describe-stack-resource-drifts. Este comando retorna as informações detalhadas sobre quais recursos na pilha estão dessincronizados.

    O exemplo a seguir usa o ID da pilha de uma das pilhas com desvio, retornado pelo comando list-stack-instances no exemplo acima, para retornar informações detalhadas sobre os recursos que foram modificados ou excluídos fora do CloudFormation. Nesta pilha, duas propriedades em um recurso do AWS::SQS::Queue, DelaySeconds e maxReceiveCount foram modificadas.

    aws cloudformation describe-stack-resource-drifts --stack-name arn:aws:cloudformation:us-east-1:012345678910:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example --stack-resource-drift-status-filters "MODIFIED" "DELETED" { "StackResourceDrifts": [ { "StackId": "arn:aws:cloudformation:us-east-1:012345678910:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f8925a37c4", "ActualProperties": "{\"DelaySeconds\":10,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:012345678910:StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2-DLQ-1H0SQCOKALBDJ\",\"maxReceiveCount\":20},\"VisibilityTimeout\":60}", "ResourceType": "AWS::SQS::Queue", "Timestamp": "2019-12-04T20:33:57.261Z", "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/012345678910/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2-Queue-6FNDEY4AUEPV", "StackResourceDriftStatus": "MODIFIED", "ExpectedProperties": "{\"DelaySeconds\":20,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:012345678910:StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2-DLQ-1H0SQCOKALBDJ\",\"maxReceiveCount\":10},\"VisibilityTimeout\":60}", "PropertyDifferences": [ { "PropertyPath": "/DelaySeconds", "ActualValue": "10", "ExpectedValue": "20", "DifferenceType": "NOT_EQUAL" }, { "PropertyPath": "/RedrivePolicy/maxReceiveCount", "ActualValue": "20", "ExpectedValue": "10", "DifferenceType": "NOT_EQUAL" } ], "LogicalResourceId": "Queue" } ] }

Interromper a detecção de desvios em um conjunto de pilhas

Como a detecção de desvios em um conjunto de pilhas pode ser uma operação de longa execução, é possível que existam instâncias quando decidir interromper uma operação de detecção de desvios em andamento em um conjunto de pilhas.

Para interromper a detecção de desvios em um conjunto de pilhas usando o AWS Management Console

  1. Abra o console do AWS CloudFormation em https://console.aws.amazon.com/cloudformation.

  2. Na página StackSets (Conjuntos de pilhas) selecione o nome do conjunto de pilhas.

    O CloudFormation exibe a página StackSets details (Detalhes dos conjuntos de pilhas) para o conjunto de pilhas selecionado.

  3. Na página StackSets details (Detalhes dos conjuntos de pilhas), selecione a guia Operations (Operações) e selecione a operação de detecção de desvios.

  4. Selecione Stop operation (Interromper operação).

Para interromper a detecção de desvios em um conjunto de pilhas usando a AWS CLI

  • Use o comando stop-stack-set-operation. Você deve fornecer o nome do conjunto de pilhas e o ID da operação de detecção de desvios do conjunto de pilhas.

    aws cloudformation stop-stack-set-operation --stack-set-name stack-set-drift-example --operation-id 624af370-311a-11e8-b6b7-500cexample