Impedir atualizações nos recursos de pilha - AWS CloudFormation

Impedir atualizações nos recursos de pilha

Quando você cria uma pilha, todas as ações de atualização são permitidas em todos os recursos. Por padrão, qualquer usuário com permissões de atualização da pilha pode atualizar todos os recursos na pilha. Durante uma atualização, alguns recursos podem exigir uma interrupção ou ser completamente substituídos, o que resulta em novos IDs físicos ou armazenamento completamente novo. Você pode impedir que a pilha de recursos seja involuntariamente atualizada ou excluída durante uma atualização da pilha usando uma política de pilha. Uma política de pilha é um documento JSON que define quais ações de atualização podem ser executadas nos recursos designados.

Depois de definir uma política de pilha, todos os recursos na pilha são protegidos por padrão. Para permitir atualizações em recursos específicos, você especifica uma instrução explícita Allow para esses recursos em sua política de pilha. Você pode definir apenas uma política de pilha por pilha. Porém, é possível proteger vários recursos em uma única política. Uma política de pilha se aplica a todos os usuários do AWS CloudFormation que tentarem atualizar a pilha. Você não pode associar diferentes políticas de pilha com diferentes usuários.

Uma política de pilha é aplicada somente durante as atualizações da pilha. Ela não fornece controles de acesso como uma política do AWS Identity and Access Management (IAM). Use uma política de pilha somente como um mecanismo à prova de falhas que impede atualizações acidentais em recursos de pilha específicos. Para controlar o acesso a recursos ou ações da AWS, use o IAM.

Exemplo de política de pilha

A política de pilha de exemplo a seguir impede atualizações no recurso ProductionDatabase:

{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" }, { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "LogicalResourceId/ProductionDatabase" } ] }

Quando você define uma política de pilha, todos os recursos na pilha são protegidos por padrão. Para permitir atualizações em todos os recursos, adicionamos uma instrução Allow que permite que todas as ações em todos os recursos. Embora a instrução Allow especifique todos os recursos, a instrução explícita Deny a substitui para o recurso com o ID lógico ProductionDatabase. Essa instrução Deny impede todas as ações de atualização, como substituição ou exclusão, no recurso ProductionDatabase.

O elemento Principal é necessário, mas suporta apenas o caractere curinga (*), o que significa que a instrução aplica-se a todos os principais.

nota

Durante uma atualização de pilha, o AWS CloudFormation atualiza recursos que dependem de outros recursos atualizados. Por exemplo, o AWS CloudFormation atualiza um recurso que faz referência a um recurso atualizado. O AWS CloudFormation não faz alterações físicas, como o ID do recurso, em recursos atualizados automaticamente. Porém, se uma política de pilha estiver associada a esses recursos, você deve ter permissão para atualizá-los.

Definir uma política de pilha

Quando você cria uma pilha, nenhuma política de pilha é definida, de modo que todas as ações de atualização são permitidas em todos os recursos. Para proteger os recursos da pilha de ações de atualização, defina uma pilha de política e, em seguida, configure-a em sua pilha. Uma política de pilha é um documento JSON que define as ações de atualização de pilha do AWS CloudFormation que os usuários do AWS CloudFormation podem executar e os recursos que as ações se aplicam. Você pode definir a política de pilha ao criar uma pilha, especificando um arquivo de texto que contém a sua política de pilha ou digitando-a. Quando você define uma política de pilha em sua pilha, qualquer atualização não explicitamente permitida é negada por padrão.

Você define uma política de pilha com cinco elementos: Effect, Action, Principal, Resource e Condition. O pseudocódigo a seguir mostra a sintaxe da política de pilha.

{ "Statement" : [ { "Effect" : "Deny_or_Allow", "Action" : "update_actions", "Principal" : "*", "Resource" : "LogicalResourceId/resource_logical_ID", "Condition" : { "StringEquals_or_StringLike" : { "ResourceType" : [resource_type, ...] } } } ] }
Effect

Determina se as ações que você especifica são negadas ou permitidas no(s) recurso(s) especificado(s). Você pode especificar apenas Deny ou Allow, como:

"Effect" : "Deny"
Importante

Se uma política de pilha inclui instruções de sobreposição (tanto para permitir e negar atualizações em um recurso), uma instrução Deny sempre substituirá uma instrução Allow. Para garantir que um recurso está protegido, use uma instrução Deny para esse recurso.

Ação

Especifica as ações de atualização que são negadas ou permitidas:

Update:Modify

Especifica ações de atualização durante as quais os recursos poderão não ter interrupções ou algumas interrupções enquanto as alterações estão sendo aplicadas. Todos os recursos mantêm seus IDs físicos.

Update:Replace

Especifica ações de atualização durante as quais os recursos são recriados. O AWS CloudFormation cria um novo recurso com as atualizações especificadas e, em seguida, exclui o recurso antigo. Como o recurso é recriado, o ID físico do novo recurso pode ser diferente.

Update:Delete

Especifica ações de atualização durante as quais os recursos são removidos. As atualizações que removem completamente os recursos de um modelo de pilha exigem esta ação.

Atualização:*

Especifica todas as ações de atualização. O asterisco é um caractere curinga que representa todas as ações de atualização.

O exemplo a seguir mostra como especificar apenas as ações de substituição e exclusão:

"Action" : ["Update:Replace", "Update:Delete"]

Para permitir todas as ações de atualização exceto para uma, use NotAction. Por exemplo, para permitir todas as ações de atualização exceto Update:Delete, use NotAction, como mostrado no exemplo a seguir:

{ "Statement" : [ { "Effect" : "Allow", "NotAction" : "Update:Delete", "Principal": "*", "Resource" : "*" } ] }

Para obter mais informações sobre atualizações de pilhas, consulte Atualizações de pilhas do AWS CloudFormation.

Entidade principal

O elemento Principal especifica a entidade que a política se aplica. Este elemento é necessário, mas suporta apenas o caractere curinga (*), o que significa que a política aplica-se a todos principais.

Recurso

Especifica os IDs lógicos dos recursos aos quais a política se aplica. Para especificar os tipos de recursos, use o elemento Condition.

Para especificar um único recurso, use seu ID lógico. Por exemplo:

"Resource" : ["LogicalResourceId/myEC2instance"]

Você pode usar um caractere curinga com IDs lógicos. Por exemplo, se você usar um prefixo de ID lógico comum para todos os recursos relacionados, é possível especificar todos eles com um caractere curinga:

"Resource" : ["LogicalResourceId/CriticalResource*"]

Você também pode usar um elemento Not com recursos. Por exemplo, para permitir as atualizações em todos os recursos, exceto um, use um elemento NotResource para proteger esse recurso:

{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "NotResource" : "LogicalResourceId/ProductionDatabase" } ] }

Quando você define uma política de pilha, qualquer atualização não explicitamente permitida é negada por padrão. Ao permitir atualizações para todos os recursos, exceto para o recurso ProductionDatabase, você nega atualizações para o recurso ProductionDatabase.

Condições

Especifica o tipo de recurso que a política se aplica. Para especificar os IDs lógicos de recursos específicos, use o elemento Resource.

Você pode especificar um tipo de recurso, como todas as instâncias de banco de dados do RDS e EC2, conforme mostrado no exemplo a seguir:

{ "Statement" : [ { "Effect" : "Deny", "Principal" : "*", "Action" : "Update:*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::EC2::Instance", "AWS::RDS::DBInstance"] } } }, { "Effect" : "Allow", "Principal" : "*", "Action" : "Update:*", "Resource" : "*" } ] }

A instrução Allow concede permissões de atualização para todos os recursos e a instrução Deny nega atualizações para instâncias de banco de dados do RDS e EC2. A declaração Deny sempre substitui as ações de permissão.

Você pode usar um caractere curinga com tipos de recursos. Por exemplo, você pode negar permissões de atualização para todos os recursos do Amazon EC2 — como instâncias, security groups e sub-redes — usando um caractere curinga, como mostrado no exemplo a seguir:

"Condition" : { "StringLike" : { "ResourceType" : ["AWS::EC2::*"] } }

Você deve usar a condição StringLike quando ao usar caracteres curinga.

Configurar uma política de pilha

Você pode usar o console ou a AWS CLI para aplicar uma política de pilha ao criar uma pilha. Você também pode usar a AWS CLI para aplicar uma política de pilha a uma pilha existente. Depois de aplicar uma política de pilha, você não pode removê-la da pilha, mas é possível usar a AWS CLI para modificá-la.

Uma política de pilha se aplica a todos os usuários do AWS CloudFormation que tentam atualizar a pilha. Você não pode associar diferentes políticas de pilha com diferentes usuários.

Para obter mais informações sobre como gravar políticas de pilhas, consulte Definir uma política de pilha.

Para definir uma política de pilha ao criar uma pilha (console)
  1. Abra o console do AWS CloudFormation em https://console.aws.amazon.com/cloudformation.

  2. Na página CloudFormation Stacks (Pilhas do CloudFormation), escolha Criar pilha (Create stack).

  3. No assistente Create Stack (Criar pilha), na página Configure stack options (Configurar opções de pilha), expanda a seção Advanced (Avançado) e escolha Stack policy (Política de pilha).

  4. Especifique a política da pilha:

    • Para gravar uma política diretamente no console, escolha Enter stack policy (Inserir política de pilha) e digite a política de pilha diretamente no campo de texto.

    • Para usar uma política definida em um arquivo separado, escolha Upload a file (Fazer upload de um arquivo) e Choose file (Escolher arquivo) para selecionar o arquivo que contém a política de pilha.

Para definir uma política de pilha ao criar uma pilha (AWS CLI)
  • Use o comando aws cloudformation create-stack com a opção --stack-policy-body para digitar em uma política modificada ou a opção --stack-policy-url para especificar um arquivo que contém a política.

Para definir uma política de pilha em uma pilha existente (AWS CLI apenas)
  • Use o comando aws cloudformation set-stack-policy com a opção --stack-policy-body para digitar em uma política modificada ou a opção --stack-policy-url para especificar um arquivo que contém a política.

    nota

    Para adicionar uma política a uma pilha existente, você deve ter permissão para a ação SetStackPolicy do AWS CloudFormation.

Atualizar recursos protegidos

Para atualizar recursos protegidos, crie uma política temporária que substitui a política de pilha e permite atualizações nesses recursos. Especifique a política de substituição quando você atualizar a pilha. A política de substituição não altera permanentemente a política de pilha.

Para atualizar recursos protegidos, você deve ter permissão para usar a ação SetStackPolicy do AWS CloudFormation. Para obter mais informações sobre configuração de permissões do AWS CloudFormation, consulte Controlar o acesso com o AWS Identity and Access Management.

nota

Durante uma atualização de pilha, o AWS CloudFormation atualiza recursos que dependem de outros recursos atualizados. Por exemplo, o AWS CloudFormation atualiza um recurso que faz referência a um recurso atualizado. O AWS CloudFormation não faz alterações físicas, como o ID dos recursos, em recursos atualizados automaticamente. Porém, se uma política de pilha estiver associada a esses recursos, você deve ter permissão para atualizá-los.

Para atualizar um recurso protegido (console)
  1. Abra o console do AWS CloudFormation em https://console.aws.amazon.com/cloudformation.

  2. Selecione a pilha que deseja atualizar, escolha Stack actions (Ações de pilha) e selecione Update stack (Atualizar pilha).

  3. Se você não modificou o modelo de pilha, selecione Use current template (Usar modelo atual) e clique em Next (Próximo). Se você modificou o modelo, selecione Replace current template (Substituir modelo atual) e especifique a localização do modelo atualizado na seção Specify template (Especificar modelo):

    • Para um modelo armazenado localmente em seu computador, selecione Upload a template file (Fazer upload de um arquivo de modelo). Escolha Escolher arquivo para navegar até o arquivo e selecioná-lo e, em seguida, clique em Próximo.

    • Para um modelo armazenado em um bucket do Amazon S3, selecione Amazon S3 URL (URL do Amazon S3). Insira ou cole o URL do modelo e, em seguida, clique em Próximo.

      Se tiver um modelo em um bucket com versionamento habilitado, você poderá indicar uma versão específica do modelo, como https://s3.amazonaws.com/templates/myTemplate.template?versionId=123ab1cdeKdOW5IH4GAcYbEngcpTJTDW. Para obter mais informações, consulte Gerenciar objetos em um bucket habilitado para versionamento no Guia do usuário do Amazon Simple Storage Service.

  4. Se o seu modelo contém parâmetros, na página Specify stack details (Especificar detalhes da pilha), insira ou modifique os valores dos parâmetros e escolha Next (Próximo).

    O AWS CloudFormation preenche cada parâmetro com o valor que está atualmente definido na pilha, exceto os parâmetros declarados com o atributo NoEcho. É possível usar os valores atuais para esses parâmetros escolhendo Use existing value (Usar valor existente).

    Para obter mais informações sobre o uso de NoEcho para mascarar informações confidenciais, bem como o uso de parâmetros dinâmicos para gerenciar segredos, consulte a melhor prática Não incorporar credenciais em seus modelos.

  5. Especifique uma política de pilha de substituição.

    1. Na página Configure stack options (Configurar opções da pilha), na seção Advanced options (Opções avançadas), selecione Stack policy (Política de pilha).

    2. Selecione Upload a file (Fazer upload de um arquivo).

    3. Clique em Choose file (Escolher arquivo) e navegue até o arquivo que contém a política de pilha de sobreposição ou digite uma política.

    4. Escolha Próximo.

    A política de substituição deve especificar uma instrução Allow para os recursos protegidos que você deseja atualizar. Por exemplo, para atualizar todos os recursos protegidos, especifique uma política de substituição temporária que permite todas as atualizações:

    { "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }
    nota

    O AWS CloudFormation aplica a política de substituição apenas durante a atualização. A política de substituição não altera permanentemente a política de pilha. Para modificar uma política de pilha, consulte Modificar uma política de pilha .

  6. Analise as informações e as alterações da pilha que você enviou.

    Verifique se você enviou as informações corretas, como os valores de parâmetro ou modelo de URL correto. Se o seu modelo contém recursos do IAM, escolha I acknowledge that this template may create IAM resources (Eu reconheço que este modelo pode criar recursos do IAM) para especificar que você deseja usar recursos do IAM no modelo. Para obter mais informações sobre o uso de recursos do IAM em modelos, consulte Controlar o acesso com o AWS Identity and Access Management.

    Na seção Preview your changes (Visualizar suas alterações), verifique se o AWS CloudFormation fará todas as alterações que você espera. Por exemplo, verifique se o AWS CloudFormation adiciona, remove e modifica os recursos que você pretende adicionar, remover ou modificar. O AWS CloudFormation gera essa pré-visualização criando um conjunto de alterações para a pilha. Para ter mais informações, consulte Atualizar pilhas usando conjuntos de alterações.

  7. Quando estiver satisfeito com as alterações, clique em Update (Atualizar).

    nota

    Nesse ponto, você também tem a opção de visualizar o conjunto de alterações para rever as atualizações propostas mais cuidadosamente. Para fazer isso, clique em View change set (Visualizar conjunto de alterações) em vez de em Update (Atualizar). O CloudFormation mostra o conjunto de alterações gerado com base nas suas atualizações. Quando estiver pronto para executar a atualização da pilha, clique em Execute (Executar).

    CloudFormation exibe a página Stack details (Detalhes da pilha) para sua pilha. Sua pilha agora tem um status de UPDATE_IN_PROGRESS. Depois que o CloudFormation tiver concluído com êxito a atualização da pilha, ele definirá o status da pilha como UPDATE_COMPLETE.

    Caso a atualização da pilha falhe, o CloudFormation reverterá automaticamente as alterações e definirá o status como UPDATE_ROLLBACK_COMPLETE.

Para atualizar um recurso protegido (AWS CLI)
  • Use o comando aws cloudformation update-stack com a opção --stack-policy-during-update-body para digitar em uma política modificada ou a opção --stack-policy-during-update-url para especificar um arquivo que contém a política.

    nota

    O AWS CloudFormation aplica a política de substituição apenas durante a atualização. A política de substituição não altera permanentemente a política de pilha. Para modificar uma política de pilha, consulte Modificar uma política de pilha .

Modificar uma política de pilha

Para proteger os recursos adicionais ou para remover a proteção dos recursos, modifique a política da pilha. Por exemplo, quando você adiciona um banco de dados que você deseja proteger a sua pilha, adicione uma instrução Deny para o banco de dados à política de pilha. Para modificar a política, você deve ter permissão para usar a ação SetStackPolicy.

Use a AWS CLI para modificar políticas de pilha.

Para modificar uma política de pilha (AWS CLI)
  • Use o comando aws cloudformation set-stack-policy com a opção --stack-policy-body para digitar em uma política modificada ou a opção --stack-policy-url para especificar um arquivo que contém a política.

Você não pode excluir uma política de pilha. Para remover todas as proteções de todos os recursos, você modifica a política para explicitamente permitir todas as ações em todos os recursos. A política a seguir permite todas as atualizações em todos os recursos:

{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

Mais exemplos de políticas de pilha

As seguintes políticas de exemplo mostram como impedir atualizações em todos os recursos de pilha, especificar recursos e impedir determinados tipos de atualizações.

Impedir atualizações em todos os recursos de pilha

Para impedir atualizações em todos os recursos de pilha, a seguinte política especifica uma instrução Deny para todas as ações de atualização em todos os recursos.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

Impedir atualizações em um único recurso

A seguinte política nega todas as ações de atualização no banco de dados com o ID lógico MyDatabase. Isso permite todas as ações de atualização em todos os outros recursos de pilha com uma instrução Allow. A instrução Allow não se aplica ao recurso MyDatabase porque a instrução Deny sempre substitui as ações de permissão.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "LogicalResourceId/MyDatabase" }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

Você pode alcançar o mesmo resultado do exemplo anterior usando um padrão de negação. Quando você define uma política de pilha, o AWS CloudFormation bloqueia qualquer atualização que não é explicitamente permitida. A seguinte política permite atualizações em todos os recursos, exceto no recurso ProductionDatabase, que é negado por padrão.

{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "NotResource" : "LogicalResourceId/ProductionDatabase" } ] }
Importante

Não há risco em usar uma negação padrão. Se você tiver uma instrução Allow em outro lugar na política (como uma instrução Allow que usa um caractere curinga), talvez você conceda inadvertidamente permissão de atualização a recursos que você não pretendia. Como uma negação explícita substitui quaisquer ações de permissão, você pode garantir que um recurso seja protegido usando uma instrução Deny.

Impedir atualizações em todas as instâncias de um tipo de recurso

A seguinte política nega todas as ações de atualização no tipo de recurso de instância de banco de dados do RDS. Isso permite todas as ações de atualização em todos os outros recursos de pilha com uma instrução Allow. A instrução Allow não se aplica ao recurso de instância de banco de dados do RDS porque uma instrução Deny sempre substitui as ações de permissão.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::RDS::DBInstance"] } } }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

Impedir atualizações de substituição em uma instância

A seguinte política nega atualizações que poderiam causar uma substituição da instância com o ID lógico MyInstance. Isso permite todas as ações de atualização em todos os outros recursos de pilha com uma instrução Allow. A instrução Allow não se aplica ao recurso MyInstance porque a instrução Deny sempre substitui as ações de permissão.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:Replace", "Principal": "*", "Resource" : "LogicalResourceId/MyInstance" }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

Impedir atualizações em pilhas aninhadas

A seguinte política nega todas as ações de atualização no tipo de recurso de pilha do AWS CloudFormation (pilhas aninhadas). Isso permite todas as ações de atualização em todos os outros recursos de pilha com uma instrução Allow. A declaração Allow não se aplica aos recursos de pilha do AWS CloudFormation porque a instrução Deny sempre substitui as ações de permissão.

{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::CloudFormation::Stack"] } } }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }