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
Temas
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.
Temas
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 ejemplo
AWS::S3::Bucket. Para los recursos aprovisionados con la API de Cloud Control, este valor seráRESOURCE. TargetLogicalId-
El
TargetLogicalIddel 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-stackdelete-stackoperaciones.update-stack
Resources-
ResourceLogicalID-
Cuando la operación es iniciada por CloudFormation,
ResourceLogicalIDes el ID lógico del recurso en la CloudFormation plantilla.Cuando la API de Cloud Control inicia la operación,
ResourceLogicalIDes 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,
ResourceLogicalIDes el identificador lógico del recurso en la CloudFormation plantilla.Cuando la API de Cloud Control inicia la operación,
ResourceLogicalIDes 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-bucketObjectLockEnabled: true Previous: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName:amzn-s3-demo-bucketObjectLockEnabled: 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-bucketObjectLockEnabled: 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-bucketObjectLockEnabled: 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.
Temas
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á
STACKcuando 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-stackoperacióncreate-stackupdate-stack, o.
Proposed CloudFormation Template-
El valor completo CloudFormation de la plantilla que se pasó a CloudFormation
create-stacknuestrasupdate-stackoperaciones. Esto incluye cosas comoResourcesOutputs, yProperties. Puede ser una cadena JSON o YAML, según lo que se haya proporcionado. CloudFormationEn
delete-stacklas 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-stacklas 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.
Temas
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_SETcuando 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-stackoperacióncreate-stackupdate-stack, o.
Proposed CloudFormation Template-
La CloudFormation plantilla completa que se proporcionó a una
create-change-setoperació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
Changesmodelo. 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' } }