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 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.
Tópicos
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 CloudFormation atualiza recursos que dependem de outros recursos atualizados. Por exemplo, o CloudFormation atualiza um recurso que faz referência a um recurso atualizado. O CloudFormation não faz alterações físicas, como o ID de recursos, para recursos atualizados automaticamente, mas se uma política de pilha é associada a esses recursos, você deve ter permissão para atualizá-las.
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 CloudFormation que os usuários do 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
ouAllow
, 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çãoAllow
. Para garantir que um recurso está protegido, use uma instruçãoDeny
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 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 excetoUpdate:Delete
, useNotAction
, como mostrado no exemplo a seguir:{ "Statement" : [ { "Effect" : "Allow", "NotAction" : "Update:Delete", "Principal": "*", "Resource" : "*" } ] }
- 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 elementoNotResource
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 recursoProductionDatabase
. - 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çãoDeny
nega atualizações para instâncias de banco de dados do RDS e EC2. A declaraçãoDeny
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 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)
Abra o console do AWS CloudFormation em https://console.aws.amazon.com/cloudformation
. -
Na barra de navegação na parte superior da tela, escolha a Região da AWS na qual a pilha deve ser criada.
-
Na página CloudFormation Stacks (Pilhas do CloudFormation), escolha Criar pilha (Create stack).
-
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).
-
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 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 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 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 CloudFormation. Para obter mais informações sobre configuração de permissões do CloudFormation, consulte Controle o acesso ao CloudFormation com o AWS Identity and Access Management.
nota
Durante uma atualização de pilha, o CloudFormation atualiza recursos que dependem de outros recursos atualizados. Por exemplo, o CloudFormation atualiza um recurso que faz referência a um recurso atualizado. O CloudFormation não faz alterações físicas, como o ID de recursos, para recursos atualizados automaticamente, mas se uma política de pilha é associada a esses recursos, você deve ter permissão para atualizá-las.
Para atualizar um recurso protegido (console)
Abra o console do AWS CloudFormation em https://console.aws.amazon.com/cloudformation
. -
Selecione a pilha que deseja atualizar, escolha Stack actions (Ações de pilha) e selecione Update stack (Atualizar pilha).
-
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 você tiver um modelo em um bucket com versionamento habilitado, poderá especificar uma versão específica do modelo anexando
?versionId=
ao URL. Para obter mais informações, consulte Trabalhar com objetos em um bucket com versionamento habilitado no Guia do usuário do Amazon Simple Storage Service.version-id
-
-
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 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 ocultar informações confidenciais e sobre o uso de parâmetros dinâmicos para gerenciar segredos, consulte a melhor prática Não incorporar credenciais em seus modelos. -
Especifique uma política de pilha de substituição.
-
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).
-
Selecione Upload a file (Fazer upload de um arquivo).
-
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.
-
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 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 .
-
-
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 ter mais informações, consulte Confirmar recursos do IAM em modelos do CloudFormation.
Na seção Visualizar suas alterações, verifique se o CloudFormation fará todas as alterações que você espera. Por exemplo, verifique que o CloudFormation adiciona, remove e modifica os recursos que você pretende adicionar, remover ou modificar. O CloudFormation gera esta pré-visualização criando um conjunto de alterações para a pilha. Para ter mais informações, consulte Atualizar pilhas do CloudFormation usando conjuntos de alterações.
-
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 comoUPDATE_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 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 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 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 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 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 da pilha do CloudFormation porque a declaração Deny
sempre substitui as ações permitidas.
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::CloudFormation::Stack"] } } }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }