View a markdown version of this page

Escribe reglas de Guard para evaluar los recursos de Guard Hooks - CloudFormation

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Escribe reglas de Guard para evaluar los recursos de Guard Hooks

AWS CloudFormation Guard es un lenguaje específico de dominio (DSL) de código abierto y de uso general que puedes usar para crear políticas como código. En este tema se explica cómo usar Guard para crear reglas de ejemplo que puedan ejecutarse en Guard Hook para evaluar y operar automáticamente. CloudFormation API de control de nube de AWS También se centrará en los diferentes tipos de entradas disponibles para las reglas de tu Guard Hook en función del momento en que se ejecute tu Guard Hook. Un Guard Hook se puede configurar para que se ejecute durante los siguientes tipos de operaciones:

  • Operaciones de recursos

  • Operaciones de pila

  • Operaciones de conjuntos de cambios

Para obtener más información sobre cómo escribir reglas de Guard, consulte Escribir AWS CloudFormation Guard reglas

Operación de recursos: reglas de Guard

Cada vez que creas, actualizas o eliminas un recurso, se considera una operación de recursos. Por ejemplo, si ejecutas la actualización de una CloudFormation pila que crea un nuevo recurso, habrás completado una operación de recurso. Cuando creas, actualizas o eliminas un recurso mediante la API de Cloud Control, también se considera una operación de recursos. Puedes configurar tu Guard Hook para que tenga como objetivo RESOURCE y CLOUD_CONTROL operaciones en la TargetOperations configuración de tu Hook. Cuando tu Guard Hook evalúa una operación con recursos, el motor Guard evalúa una entrada de recursos.

Sintaxis de entrada de recursos de Guard

La entrada de recursos de Guard son los datos que están disponibles para que tus reglas de Guard los evalúen.

A continuación se muestra un ejemplo de forma de una entrada de recursos:

HookContext: AWSAccountID: String StackId: String HookTypeName: String HookTypeVersion: String InvocationPoint: [CREATE_PRE_PROVISION, UPDATE_PRE_PROVISION, DELETE_PRE_PROVISION] TargetName: String TargetType: RESOURCE TargetLogicalId: String ChangeSetId: String Resources: {ResourceLogicalID}: ResourceType: {ResourceType} ResourceProperties: {ResourceProperties} Previous: ResourceLogicalID: ResourceType: {ResourceType} ResourceProperties: {PreviousResourceProperties}
HookContext
AWSAccountID

El ID del Cuenta de AWS que contiene el recurso que se está evaluando.

StackId

El ID de pila de la CloudFormation pila que forma parte de la operación de recursos. Está vacío si la persona que llama es la API de Cloud Control.

HookTypeName

El nombre del Hook que se está ejecutando.

HookTypeVersion

La versión del Hook que se está ejecutando.

InvocationPoint

El punto exacto de la lógica de aprovisionamiento en el que se ejecuta el Hook.

Valores válidos: (CREATE_PRE_PROVISION| UPDATE_PRE_PROVISION |DELETE_PRE_PROVISION)

TargetName

El tipo de objetivo que se está evaluando, por ejemplo,AWS::S3::Bucket.

TargetType

El tipo de objetivo que se está evaluando, por ejemploAWS::S3::Bucket. Para los recursos aprovisionados con la API de Cloud Control, este valor seráRESOURCE.

TargetLogicalId

El TargetLogicalId del recurso que se está evaluando. Si el origen del Hook es CloudFormation, será el identificador lógico (también conocido como nombre lógico) del recurso. Si el origen del Hook es la API de Cloud Control, será un valor construido.

ChangeSetId

El ID del conjunto de cambios que se ejecutó para provocar la invocación de Hook. Este valor está vacío si el cambio de recurso lo iniciaron la API de Cloud Control o las create-stack delete-stack operaciones. update-stack

Resources
ResourceLogicalID

Cuando la operación es iniciada por CloudFormation, ResourceLogicalID es el ID lógico del recurso en la CloudFormation plantilla.

Cuando la API de Cloud Control inicia la operación, ResourceLogicalID es una combinación del tipo de recurso, el nombre, el ID de operación y el ID de solicitud.

ResourceType

El nombre del tipo del recurso (ejemplo:AWS::S3::Bucket).

ResourceProperties

Las propiedades propuestas del recurso que se está modificando. Cuando el Guard Hook se ejecuta contra el CloudFormation recurso cambia, todas las funciones, parámetros y transformaciones se resuelven por completo. Si se elimina el recurso, este valor estará vacío.

Previous
ResourceLogicalID

Cuando la operación es iniciada por CloudFormation, ResourceLogicalID es el identificador lógico del recurso en la CloudFormation plantilla.

Cuando la API de Cloud Control inicia la operación, ResourceLogicalID es una combinación del tipo de recurso, el nombre, el ID de operación y el ID de solicitud.

ResourceType

El nombre del tipo del recurso (ejemplo:AWS::S3::Bucket).

ResourceProperties

Las propiedades actuales asociadas al recurso que se está modificando. Si se elimina el recurso, este valor estará vacío.

Ejemplo: entrada de una operación de recursos de Guard

El siguiente ejemplo de entrada muestra un Guard Hook que recibirá la definición del AWS::S3::Bucket recurso que se va a actualizar. Estos son los datos disponibles para que Guard los evalúe.

HookContext: AwsAccountId: "123456789012" StackId: "arn:aws:cloudformation:us-west-2:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000" HookTypeName: org::s3policy::hook HookTypeVersion: "00001" InvocationPoint: UPDATE_PRE_PROVISION TargetName: AWS::S3::Bucket TargetType: RESOURCE TargetLogicalId: MyS3Bucket ChangeSetId: "" Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: amzn-s3-demo-bucket ObjectLockEnabled: true Previous: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: amzn-s3-demo-bucket ObjectLockEnabled: false

Para ver todas las propiedades disponibles para el tipo de recurso, consulte AWS::S3::Bucket.

Reglas de protección para los cambios en los recursos

Cuando un Guard Hook evalúa los cambios en los recursos, comienza por descargar todas las reglas configuradas con el Hook. Luego, estas reglas se evalúan comparándolas con la entrada de recursos. The Hook fallará si alguna regla no pasa su evaluación. Si no hay errores, el Hook pasará.

El siguiente ejemplo es una regla de protección que evalúa si la ObjectLockEnabled propiedad es true para algún tipo de AWS::S3::Bucket recurso.

let s3_buckets_default_lock_enabled = Resources.*[ Type == 'AWS::S3::Bucket'] rule S3_BUCKET_DEFAULT_LOCK_ENABLED when %s3_buckets_default_lock_enabled !empty { %s3_buckets_default_lock_enabled.Properties.ObjectLockEnabled exists %s3_buckets_default_lock_enabled.Properties.ObjectLockEnabled == true << Violation: S3 Bucket ObjectLockEnabled must be set to true. Fix: Set the S3 property ObjectLockEnabled parameter to true. >> }

Cuando esta regla se ejecute con la siguiente entrada, no se ejecutará correctamente, ya que la ObjectLockEnabled propiedad no está establecida en. true

Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: amzn-s3-demo-bucket ObjectLockEnabled: false

Cuando esta regla se ejecute en la siguiente entrada, se aprobará ya que ObjectLockEnabled está establecida entrue.

Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: amzn-s3-demo-bucket ObjectLockEnabled: true

Cuando un Hook falla, las reglas que fallaron se propagarán de nuevo a la CloudFormation API de Cloud Control. Si se ha configurado un bucket de registro para el Guard Hook, allí se proporcionarán comentarios adicionales sobre las reglas. Estos comentarios adicionales incluyen la Fix información Violation y.

Reglas de Stack Operation Guard

Cuando se crea, actualiza o elimina una CloudFormation pila, puedes configurar tu Guard Hook para que comience por evaluar la nueva plantilla y, potencialmente, impedir que la operación de pila continúe. Puedes configurar tu Guard Hook para segmentar STACK las operaciones de la TargetOperations configuración de tu Hook.

Sintaxis de entrada de Guard Stack

La entrada para las operaciones de Guard Stack proporciona la CloudFormation plantilla completa para que las evalúen tus reglas de Guard.

A continuación se muestra un ejemplo de la forma de una entrada de pila:

HookContext: AWSAccountID: String StackId: String HookTypeName: String HookTypeVersion: String InvocationPoint: [CREATE_PRE_PROVISION, UPDATE_PRE_PROVISION, DELETE_PRE_PROVISION] TargetName: String TargetType:STACK ChangeSetId: String {Proposed CloudFormation Template} Previous: {CloudFormation Template}
HookContext
AWSAccountID

El identificador del recurso Cuenta de AWS que contiene.

StackId

El ID de pila de la CloudFormation pila que forma parte de la operación de pila.

HookTypeName

El nombre del Hook que se está ejecutando.

HookTypeVersion

La versión del Hook que se está ejecutando.

InvocationPoint

El punto exacto de la lógica de aprovisionamiento en el que se ejecuta el Hook.

Valores válidos: (CREATE_PRE_PROVISION| UPDATE_PRE_PROVISION |DELETE_PRE_PROVISION)

TargetName

El nombre de la pila que se está evaluando.

TargetType

Este valor será STACK cuando se ejecute como un Hook a nivel de pila.

ChangeSetId

El ID del conjunto de cambios que se ejecutó para provocar la invocación de Hook. Este valor está vacío si la operación de pila fue iniciada por una delete-stack operación create-stackupdate-stack, o.

Proposed CloudFormation Template

El valor completo CloudFormation de la plantilla que se pasó a CloudFormation create-stack nuestras update-stack operaciones. Esto incluye cosas como ResourcesOutputs, yProperties. Puede ser una cadena JSON o YAML, según lo que se haya proporcionado. CloudFormation

En delete-stack las operaciones, este valor estará vacío.

Previous

La última CloudFormation plantilla implementada correctamente. Este valor está vacío si la pila se está creando o eliminando.

En delete-stack las operaciones, este valor estará vacío.

nota

Las plantillas proporcionadas son lo que se transfiere a create las operaciones de update pila. Al eliminar una pila, no se proporcionan valores de plantilla.

Ejemplo de entrada de la operación Guard Stack

El siguiente ejemplo de entrada muestra un Guard Hook que recibirá una plantilla completa y la plantilla desplegada anteriormente. La plantilla de este ejemplo utiliza el formato JSON.

HookContext: AwsAccountId: 123456789012 StackId: "arn:aws:cloudformation:us-west-2:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000" HookTypeName: org::templatechecker::hook HookTypeVersion: "00001" InvocationPoint: UPDATE_PRE_PROVISION TargetName: MyStack TargetType: CHANGE_SET TargetLogicalId: arn:aws:cloudformation:us-west-2:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000 ChangeSetId: arn:aws:cloudformation:us-west-2:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000 Resources: { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { "ServerSideEncryptionConfiguration": [ {"ServerSideEncryptionByDefault": {"SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "KMS-KEY-ARN" }, "BucketKeyEnabled": true } ] } } } Previous: { "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": {} } } }

Reglas de protección para los cambios en la pila

Cuando un Guard Hook evalúa los cambios en la pila, comienza por descargar todas las reglas configuradas con el Hook. Luego, estas reglas se evalúan comparándolas con la entrada de recursos. The Hook fallará si alguna regla no pasa su evaluación. Si no hay errores, el Hook pasará.

El siguiente ejemplo es una regla de Guard que evalúa si hay algún tipo de AWS::S3::Bucket recurso que contenga una propiedad denominadaBucketEncryption, con el SSEAlgorithm valor de aws:kms oAES256.

let s3_buckets_s3_default_encryption = Resources.*[ Type == 'AWS::S3::Bucket'] rule S3_DEFAULT_ENCRYPTION_KMS when %s3_buckets_s3_default_encryption !empty { %s3_buckets_s3_default_encryption.Properties.BucketEncryption exists %s3_buckets_s3_default_encryption.Properties.BucketEncryption.ServerSideEncryptionConfiguration[*].ServerSideEncryptionByDefault.SSEAlgorithm in ["aws:kms","AES256"] << Violation: S3 Bucket default encryption must be set. Fix: Set the S3 Bucket property BucketEncryption.ServerSideEncryptionConfiguration.ServerSideEncryptionByDefault.SSEAlgorithm to either "aws:kms" or "AES256" >> }

Cuando la regla se ejecute en la siguiente plantilla, lo haráfail.

AWSTemplateFormatVersion: 2010-09-09 Description: S3 bucket without default encryption Resources: EncryptedS3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: !Sub 'encryptedbucket-${AWS::Region}-${AWS::AccountId}'

Cuando la regla se ejecute según la siguiente plantilla, lo harápass.

AWSTemplateFormatVersion: 2010-09-09 Description: S3 bucket with default encryption using SSE-KMS with an S3 Bucket Key Resources: EncryptedS3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: !Sub 'encryptedbucket-${AWS::Region}-${AWS::AccountId}' BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: 'aws:kms' KMSMasterKeyID: KMS-KEY-ARN BucketKeyEnabled: true

Cambie el conjunto de reglas de operación de Guard

Cuando se crea un conjunto de CloudFormation cambios, puedes configurar tu Guard Hook para que evalúe la plantilla y los cambios propuestos en el conjunto de cambios a fin de bloquear la ejecución del conjunto de cambios.

Sintaxis de entrada del conjunto de cambios de Guard

La entrada del conjunto de cambios de Guard son los datos que están disponibles para que tus reglas de Guard los evalúen.

A continuación se muestra un ejemplo de forma de la entrada de un conjunto de cambios:

HookContext: AWSAccountID: String StackId: String HookTypeName: String HookTypeVersion: String InvocationPoint: [CREATE_PRE_PROVISION, UPDATE_PRE_PROVISION, DELETE_PRE_PROVISION] TargetName: CHANGE_SET TargetType:CHANGE_SET TargetLogicalId:ChangeSet ID ChangeSetId: String {Proposed CloudFormation Template} Previous: {CloudFormation Template} Changes: [{ResourceChange}]

La sintaxis del ResourceChange modelo es:

lógico ResourceId: String resourceType: String acción: CREATE, UPDATE, DELETE Número de línea: Number BeforeContext: JSON String AfterContext: JSON String
HookContext
AWSAccountID

El identificador del recurso Cuenta de AWS que contiene.

StackId

El ID de pila de la CloudFormation pila que forma parte de la operación de pila.

HookTypeName

El nombre del Hook que se está ejecutando.

HookTypeVersion

La versión del Hook que se está ejecutando.

InvocationPoint

El punto exacto de la lógica de aprovisionamiento en el que se ejecuta el Hook.

Valores válidos: (CREATE_PRE_PROVISION| UPDATE_PRE_PROVISION |DELETE_PRE_PROVISION)

TargetName

El nombre de la pila que se está evaluando.

TargetType

Este valor será CHANGE_SET cuando se ejecute como un enlace a nivel de conjunto de cambios.

TargetLogicalId

Este valor será el ARN del conjunto de cambios.

ChangeSetId

El ID del conjunto de cambios que se ejecutó para provocar la invocación de Hook. Este valor está vacío si la operación de pila fue iniciada por una delete-stack operación create-stackupdate-stack, o.

Proposed CloudFormation Template

La CloudFormation plantilla completa que se proporcionó a una create-change-set operación. Puede ser una cadena JSON o YAML, según lo que se haya proporcionado. CloudFormation

Previous

La última CloudFormation plantilla implementada correctamente. Este valor está vacío si la pila se está creando o eliminando.

Changes

El Changes modelo. Aquí se enumeran los cambios en los recursos.

Cambios
lógico ResourceId

El nombre del recurso lógico del recurso modificado.

resourceType

El tipo de recurso que se va a cambiar.

acción

El tipo de operación que se está realizando en el recurso.

Valores válidos: (CREATE| UPDATE |DELETE)

Número de línea

El número de línea de la plantilla asociada al cambio.

BeforeContext

Una cadena JSON de propiedades del recurso antes del cambio:

{"properties": {"property1": "value"}}
AfterContext

Una cadena JSON de propiedades del recurso después del cambio:

{"properties": {"property1": "new value"}}

Ejemplo: entrada de la operación Guard Change Set

El siguiente ejemplo de entrada muestra un Guard Hook que recibirá una plantilla completa, la plantilla previamente implementada y una lista de los cambios en los recursos. La plantilla de este ejemplo utiliza el formato JSON.

HookContext: AwsAccountId: "00000000" StackId: MyStack HookTypeName: org::templatechecker::hook HookTypeVersion: "00001" InvocationPoint: UPDATE_PRE_PROVISION TargetName: my-example-stack TargetType:STACK TargetLogicalId: arn...:changeSet/change-set ChangeSetId: "" Resources: { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "amzn-s3-demo-bucket", "VersioningConfiguration":{ "Status": "Enabled" } } } Previous: { "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "amzn-s3-demo-bucket", "VersioningConfiguration":{ "Status": "Suspended" } } } } } Changes: [ { "logicalResourceId": "S3Bucket", "resourceType": "AWS::S3::Bucket", "action": "UPDATE", "lineNumber": 5, "beforeContext": "{\"Properties\":{\"VersioningConfiguration\":{\"Status\":\"Suspended\"}}}", "afterContext": "{\"Properties\":{\"VersioningConfiguration\":{\"Status\":\"Enabled\"}}}" } ]

Regla de protección para las operaciones de conjuntos de cambios

El siguiente ejemplo es una regla de protección que evalúa los cambios en los buckets de Amazon S3 y garantiza que no estén VersionConfiguration inhabilitados.

let s3_buckets_changing = Changes[resourceType == 'AWS::S3::Bucket'] rule S3_VERSIONING_STAY_ENABLED when %s3_buckets_changing !empty { let afterContext = json_parse(%s3_buckets_changing.afterContext) when %afterContext.Properties.VersioningConfiguration.Status !empty { %afterContext.Properties.VersioningConfiguration.Status == 'Enabled' } }