Impida actualizaciones en los recursos de la pila - AWS CloudFormation

Impida actualizaciones en los recursos de la pila

Al crear una pila, todas las acciones de actualización están permitidas en todos los recursos. De forma predeterminada, cualquiera con permisos de actualización de pilas puede actualizar todos los recursos de la pila. Durante una actualización, algunos recursos podría necesitar una interrupción o ser sustituidos por completo, lo que se traduce en nuevos ID físicos o almacenamiento completamente nuevo. Puede impedir la actualización o eliminación involuntaria de recursos de pila durante la actualización de una pila mediante una política de pilas. Una política de pilas es un documento de JSON que describe las acciones de actualización que pueden realizarse en recursos designados.

Después de establecer una política de pilas, todos los recursos de la pila están protegidos de forma predeterminada. Para permitir actualizaciones en recursos concretos, usted especifica una declaración Allow explícita para esos recursos en su política de pilas. Solo es posible definir una política de pilas por pila, pero puede proteger varios recursos dentro de una sola política. Una política de pilas se aplica a todos los usuarios de AWS CloudFormation que traten de actualizar la pila. No es posible asociar diferentes políticas de pilas a diferentes usuarios.

La política de pilas se aplica únicamente durante las actualizaciones de la pila. No ofrece controles de acceso como una política de AWS Identity and Access Management (IAM). Utilice una política de pilas solo como un mecanismo a prueba de errores para evitar actualizaciones accidentales de determinados recursos de pila. Para controlar el acceso a recursos o acciones de AWS, utilice IAM.

Definición de una política de pilas

El siguiente ejemplo de política de pilas impide actualizaciones al recurso ProductionDatabase:

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

Cuando establece una política de pilas, todos los recursos de la pila están protegidos de forma predeterminada. Para permitir la actualización de todos los recursos, añadimos una declaración Allow que permite todas las acciones en todos los recursos. Aunque la declaración Allow especifica todos los recursos, la declaración Deny explícita invalida el permiso para el recurso con el ID lógico ProductionDatabase. Esta declaración Deny impide todas las acciones de actualización, como, por ejemplo, la sustitución o eliminación, en el recurso ProductionDatabase.

El elemento Principal es necesario, pero solo admite el comodín (*), lo que significa que la declaración se aplica a todas las entidades principales.

nota

Durante una actualización de la pila, AWS CloudFormation actualiza automáticamente los recursos que dependen de otros recursos actualizados. Por ejemplo, AWS CloudFormation actualiza un recurso que hace referencia a un recurso actualizado. AWS CloudFormation no realiza cambios físicos, como el ID del recurso, en recursos actualizados automáticamente, pero si hay una política de pilas asociada a dichos recursos, el usuario debe tener permiso para actualizarlos.

Definición de una política de pilas

Al crear una pila, no hay ninguna política de pilas establecida, por lo que todas las acciones de actualización están permitidas en todos los recursos. Para proteger los recursos de la pila de acciones de actualización, defina una política de pilas y, a continuación, establézcala en la pila. Una política de pilas es un documento JSON que define las acciones de actualización de la pila de AWS CloudFormation que los usuarios de AWS CloudFormation pueden realizar y los recursos a los que se aplican las acciones. Usted establece la política de pilas al crear una pila, especificando un archivo de texto que contiene la política de pilas o escribiéndola. Al establecer una política de pilas en la pila, por defecto se deniega cualquier actualización que no esté permitida de forma explícita.

Puede definir una política de pilas con cinco elementos: Effect, Action, Principal, Resource y Condition. El siguiente pseudocódigo muestra la sintaxis de la política de la pila.

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

Determina si las acciones que especifique se denegarán o permitirán en el recurso o recursos que especifique. Puede especificar solamente Deny o Allow, como por ejemplo:

"Effect" : "Deny"
importante

Si una política de pilas incluye declaraciones que se solapan (permitiendo y denegando actualizaciones en un recurso), una declaración Deny siempre anula una declaración Allow. Para garantizar que un recurso está protegido, utilice una declaración Deny para dicho recurso.

Acción

Especifica las acciones de actualización denegadas o permitidas:

Update:Modify

Especifica acciones de actualización durante las cuales los recursos podrían no experimentar interrupciones o algunas interrupciones mientras se aplican cambios. Todos los recursos mantienen sus ID físicos.

Update:Replace

Especifica acciones de actualización durante las cuales se vuelven a crear recursos. AWS CloudFormation crea un nuevo recurso con las actualizaciones especificadas y, a continuación, elimina el recurso anterior. Dado que se ha vuelto a crear el recurso, el ID físico del recurso nuevo podría ser diferente.

Update:Delete

Especifica acciones de actualización durante las cuales se eliminan recursos. Las actualizaciones que eliminan recursos completamente de una plantilla de pila requieren esta acción.

Update:*

Especifica todas las acciones de actualización. El asterisco es un comodín que representa todas las acciones de actualización.

El siguiente ejemplo muestra cómo especificar tan solo las acciones de sustitución y eliminación:

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

Para permitir todas las acciones de actualización excepto una, utilice NotAction. Por ejemplo, para permitir todas las acciones de actualización excepto Update:Delete, utilice NotAction, tal y como se muestra en este ejemplo:

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

Para obtener más información sobre las actualizaciones de pila, consulte Actualizaciones de pila de AWS CloudFormation.

Entidad principal

El elemento Principal especifica la entidad a la que se aplica la política. El elemento es necesario, pero solo admite el comodín (*), lo que significa que la política se aplica a todas las entidades principales.

Recurso

Especifica el ID lógico de los recursos a los que se aplica a la política. Para especificar tipos de recursos, utilice el elemento Condition.

Para especificar un único recurso, utilice su ID lógico. Por ejemplo:

"Resource" : ["LogicalResourceId/myEC2instance"]

Puede utilizar un comodín con ID lógicos. Por ejemplo, si utiliza un prefijo de ID lógico común para todos los recursos relacionados, puede especificar todos ellos con un comodín:

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

También puede utilizar un elemento Not con recursos. Por ejemplo, para permitir actualizaciones de todos los recursos a excepción de uno, utilice un elemento NotResource para proteger dicho recurso:

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

Al establecer una política de pilas, se deniega cualquier actualización que no esté permitida de forma explícita. Al permitir actualizaciones de todos los recursos, excepto para el recurso ProductionDatabase, deniega las actualizaciones del recurso ProductionDatabase.

Condiciones

Especifica el tipo de recurso al que se aplica la política. Para especificar el ID lógico de recursos concretos, utilice el elemento Resource.

Puede especificar un tipo de recurso, como todas las instancias de base de datos de RDS y EC2, tal y como se muestra en el siguiente ejemplo:

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

La declaración Allow concede permisos de actualización para todos los recursos y la declaración Deny deniega actualizaciones a instancias de bases de datos de RDS y EC2. La declaración Deny siempre anula acciones de permiso.

Puede utilizar un comodín con tipos de recursos. Por ejemplo, puede denegar permisos de actualización para todos los recursos de Amazon EC2 (como, por ejemplo, instancias, grupos de seguridad y subredes) utilizando un comodín, tal y como se muestra en el siguiente ejemplo:

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

Debe utilizar la condición StringLike cuando utiliza comodines.

Establecimiento de una política de pilas

Puede utilizar la consola o la AWS CLI para aplicar una política de pilas al crear una pila. También puede utilizar la AWS CLI para aplicar una política de pilas a una pila existente. Después de aplicar una política de pilas, no puede eliminarla de la pila, pero sí puede utilizar la AWS CLI para modificarla.

Las políticas de pilas se aplican a todos los usuarios de AWS CloudFormation que traten de actualizar la pila. No es posible asociar diferentes políticas de pilas a diferentes usuarios.

Para obtener información sobre la escritura de políticas de pilas, consulte Definición de una política de pilas.

Para definir una política de pilas al crear una pila (consola)
  1. Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation.

  2. En la página CloudFormation Stacks (Pilas de CloudFormation), elija Create Stack (Crear pila).

  3. En el asistente para crear pilas, en la página Configure stack options (Configurar opciones de pila), expanda la sección Advanced (Avanzado) y, a continuación, elija Stack policy (Política de pila).

  4. Especifique la política de pila:

    • Para escribir una política directamente en la consola, elija Enter stack policy (Introducir política de pilas) y, a continuación, escriba la política de pilas directamente en el campo de texto.

    • Para utilizar una política definida en un archivo aparte, elija Upload a file (Cargar un archivo) y, a continuación, Choose file (Elegir archivo) para seleccionar el archivo que contiene la política de pilas.

Para definir una política de pilas al crear una pila (AWS CLI)
  • Utilice el comando aws cloudformation create-stack con la opción --stack-policy-body para escribir una política modificada o la opción --stack-policy-url para especificar un archivo que contenga la política.

Para establecer una política de pilas en una pila existente (AWS CLI solamente)
  • Utilice el comando aws cloudformation set-stack-policy con la opción --stack-policy-body para escribir una política modificada o la opción --stack-policy-url para especificar un archivo que contenga la política.

    nota

    Para añadir una política a una pila existente, debe tener permiso para la acción SetStackPolicy de AWS CloudFormation.

Actualización de recursos protegidos

Para actualizar recursos protegidos, cree una política temporal que anule la política de pilas y permita actualizaciones en esos recursos. Especifique la política de invalidación al actualizar la pila. La política de invalidación no cambia de manera permanente la política de pilas.

Para actualizar recursos protegidos, debe disponer de permiso para utilizar la acción SetStackPolicy de AWS CloudFormation. Para obtener más información sobre el establecimiento de permisos de AWS CloudFormation, consulte Control del acceso con AWS Identity and Access Management.

nota

Durante una actualización de la pila, AWS CloudFormation actualiza automáticamente los recursos que dependen de otros recursos actualizados. Por ejemplo, AWS CloudFormation actualiza un recurso que hace referencia a un recurso actualizado. AWS CloudFormation no realiza cambios físicos, como el ID de los recursos, en recursos actualizados automáticamente, pero si hay una política de pilas asociada a dichos recursos, el usuario debe tener permiso para actualizarlos.

Para actualizar un recurso protegido (consola)
  1. Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation.

  2. Seleccione la pila que desea actualizar, elija Actions (Acciones) y, a continuación, elija Update Stack (Actualizar pila).

  3. Si no ha modificado la plantilla de pilas, seleccione Use current template (Usar plantilla actual) y, a continuación, haga clic en Next (Siguiente). Si ha modificado la plantilla, seleccione Replace current template (Sustituir plantilla actual) y especifique la ubicación de la plantilla actualizada en la sección Specify template (Especificar plantilla):

    • Para una plantilla almacenada localmente en su equipo, seleccione Upload a template file (Cargar un archivo de plantilla). Elija Choose File (Elegir archivo) para navegar hasta el archivo y seleccionarlo; a continuación, haga clic en Next (Siguiente).

    • Para una plantilla almacenada en un bucket de Amazon S3, seleccione Amazon S3 URL (URL de Amazon S3). Escriba o pegue la URL para la plantilla y, a continuación, haga clic en Next (Siguiente).

      Si tiene una plantilla en un bucket compatible con el control de versiones, puede especificar una versión concreta de la plantilla, como https://s3.amazonaws.com/templates/myTemplate.template?versionId=123ab1cdeKdOW5IH4GAcYbEngcpTJTDW. Para obtener más información, consulte Managing objects in a versioning-enabled bucket (Administración de objetos en un bucket con control de versiones habilitado) en la Guía del usuario de la consola de Amazon Simple Storage Service.

  4. Si la plantilla contiene parámetros, en la página Specify stack details (Especificar detalles de pila) escriba o modifique los valores de los parámetros y, a continuación, elija Next (Siguiente).

    AWS CloudFormation rellenará cada parámetro con el valor que actualmente está establecido en la pila excepto los parámetros declarados con el atributo NoEcho. Puede utilizar los valores actuales para los parámetros eligiendo Use existing value (Usar valor existente).

    Para obtener más información sobre cómo usar NoEcho para enmascarar información confidencial y usar parámetros dinámicos para administrar secretos, consulte la práctica recomendada No incluya credenciales en sus plantillas.

  5. Especifique una política de pila de sustitución.

    1. En la página Configure stack options (Configurar opciones de pila), en la sección Advanced options (Opciones avanzadas), seleccione Stack policy (Política de pila).

    2. Seleccione Upload a file (Cargar un archivo).

    3. Haga clic en Choose file (Seleccionar un archivo) y desplácese hasta el archivo que contiene la política de pila de sustitución o escriba una política.

    4. Elija Siguiente.

    La política de invalidación debe especificar una declaración Allow para los recursos protegidos que desea actualizar. Por ejemplo, para actualizar todos los recursos protegidos, especifique una política de invalidación temporal que permita todas las actualizaciones:

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

    AWS CloudFormation aplica la política de invalidación solo durante esta actualización. La política de invalidación no cambia de manera permanente la política de pilas. Para modificar una política de pilas, consulte Modificación de una política de pilas .

  6. Revise la información de la pila y los cambios que ha enviado.

    Compruebe que ha enviado la información correcta, como la URL de la plantilla o los valores de los parámetros correctos. Si la plantilla contiene recursos de IAM, elija I acknowledge that this template may create IAM resources (Confirmo que esta plantilla pueda crear recursos de IAM) para especificar que desea utilizar recursos de IAM en la plantilla. Para obtener más información sobre recursos de IAM en plantillas, consulte Control del acceso con AWS Identity and Access Management.

    En la sección Preview your changes (Vista previa de los cambios), compruebe que AWS CloudFormation realice todos los cambios que espera. Por ejemplo, compruebe que AWS CloudFormation añada, elimine y modifique los recursos que pretendía añadir, eliminar o modificar. AWS CloudFormation genera esta vista previa mediante la creación de un conjunto de cambios para la pila. Para obtener más información, consulte Actualización de pilas con conjuntos de cambios.

  7. Cuando esté satisfecho con los cambios, haga clic en Update (Actualizar).

    nota

    En este momento, también tiene la opción de ver el conjunto de cambios para revisar las actualizaciones propuestas más detenidamente. Para hacerlo, haga clic en View change set (Ver el conjunto de cambios) en lugar de Update (Actualizar). CloudFormation muestra el conjunto de cambios generados en función de sus actualizaciones. Cuando esté listo para actualizar la pila, haga clic en Execute (Ejecutar).

    CloudFormation muestra la página Stack details (Detalles de pila) de la pila. La pila ahora tiene un estado UPDATE_IN_PROGRESS (ACTUALIZACIÓN_EN_CURSO). Una vez CloudFormation que haya terminado correctamente de actualizar la pila, establece el estado de la pila en UPDATE_COMPLETE.

    Si se produce un error en la actualización de la pila, CloudFormation restaura automáticamente los cambios y establece el estado de la pila en UPDATE_ROLLBACK_COMPLETE (RESTAURACIÓN_ACTUALIZACIÓN_COMPLETA).

Para actualizar un recurso protegido (AWS CLI)
  • Utilice el comando aws cloudformation update-stack con la opción --stack-policy-during-update-body para escribir una política modificada o la opción --stack-policy-during-update-url para especificar un archivo que contenga la política.

    nota

    AWS CloudFormation aplica la política de invalidación solo durante esta actualización. La política de invalidación no cambia de manera permanente la política de pilas. Para modificar una política de pilas, consulte Modificación de una política de pilas .

Modificación de una política de pilas

Para proteger recursos adicionales o para eliminar la protección de recursos, modifique la política de pilas. Por ejemplo, cuando añada a su pila una base de datos que desea proteger, añada una declaración Deny para esa base de datos a la política de pilas. Para modificar la política, debe disponer de permiso para utilizar la acción SetStackPolicy.

Utilice la AWS CLI para modificar las políticas de pilas.

Para modificar una política de pilas (AWS CLI)
  • Utilice el comando aws cloudformation set-stack-policy con la opción --stack-policy-body para escribir una política modificada o la opción --stack-policy-url para especificar un archivo que contenga la política.

No puede eliminar una política de pilas. Para eliminar toda la protección de todos los recursos, usted modifica la política para permitir explícitamente todas las acciones en todos los recursos. La siguiente política permite todas las actualizaciones en todos los recursos:

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

Más políticas de pilas de ejemplo

Las siguientes políticas de ejemplo muestran cómo evitar actualizaciones en todos los recursos de la pila y en recursos concretos, y cómo prevenir determinados tipos de actualizaciones.

Impida actualizaciones en todos los recursos de la pila

Para impedir las actualizaciones de todos los recursos de la pila, la siguiente política especifica una declaración Deny para todas las acciones de actualización en todos los recursos.

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

Impida actualizaciones en un solo recurso

La siguiente política deniega todas las acciones de actualización en la base de datos con el ID lógico MyDatabase. Permite todas las acciones de actualización en los recursos de pila restantes con una declaración Allow. La declaración Allow no se aplica al recurso MyDatabase porque la declaración Deny siempre invalida las acciones de permiso.

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

Puede conseguir el mismo resultado que el ejemplo anterior mediante una denegación predeterminada. Al establecer una política de pilas, AWS CloudFormation deniega cualquier actualización que no esté permitida de forma explícita. La siguiente política permite las actualizaciones de todos los recursos, excepto para el recurso ProductionDatabase, que se deniega de forma predeterminada.

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

Existe riesgo en la utilización de una denegación predeterminada. Si dispone de una declaración Allow en otro punto de la política (como, por ejemplo, una declaración Allow que utiliza un comodín), podría conceder sin saberlo permiso de actualización a recursos que no tenía la intención de hacerlo. Dado que una denegación explícita invalida cualquier acción de permiso, puede garantizar la protección de un recurso mediante una declaración Deny.

Impida las actualizaciones de todas las instancias de un tipo de recurso

La siguiente política deniega todas las acciones de actualización en el tipo de recurso de instancia de base de datos de RDS. Permite todas las acciones de actualización en los recursos de pila restantes con una declaración Allow. La declaración Allow no se aplica a los recursos de instancia de base de datos de RDS porque una declaración Deny siempre invalida las acciones de permiso.

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

Evite las actualizaciones de sustitución de una instancia

La siguiente política deniega las actualizaciones que provocarían una sustitución de la instancia por el ID lógico MyInstance. Permite todas las acciones de actualización en los recursos de pila restantes con una declaración Allow. La declaración Allow no se aplica al recurso MyInstance porque la declaración Deny siempre invalida las acciones de permiso.

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

Evite las actualizaciones de pilas anidadas

La siguiente política deniega todas las acciones de actualización en el tipo de recurso de pila de AWS CloudFormation (pilas anidadas). Permite todas las acciones de actualización en los recursos de pila restantes con una declaración Allow. La declaración Allow no se aplica a los recursos de pila de AWS CloudFormation porque la declaración Deny siempre invalida las acciones de permiso.

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