View a markdown version of this page

Rédigez des règles de Guard pour évaluer les ressources pour Guard Hooks - CloudFormation

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Rédigez des règles de Guard pour évaluer les ressources pour Guard Hooks

AWS CloudFormation Guard est un langage DSL (Domain Specific Language) open source à usage général que vous pouvez utiliser pour créer une politique en tant que code. Cette rubrique explique comment utiliser Guard pour créer des exemples de règles qui peuvent être exécutées dans le Guard Hook afin d'évaluer automatiquement CloudFormation les API de commande du Cloud AWS opérations. Il se concentrera également sur les différents types d'entrées disponibles pour vos règles de garde en fonction du moment où votre Guard Hook fonctionne. Un Guard Hook peut être configuré pour fonctionner lors des types d'opérations suivants :

  • Opérations de ressources

  • Opérations liées à la pile

  • Modifier les opérations relatives aux ensembles

Pour plus d'informations sur la rédaction des règles de Guard, voir AWS CloudFormation Guard Règles d'écriture

Règles de surveillance du fonctionnement des ressources

Chaque fois que vous créez, mettez à jour ou supprimez une ressource, cela est considéré comme une opération de ressource. Par exemple, si vous exécutez la commande Mettre à jour une CloudFormation pile qui crée une nouvelle ressource, vous avez terminé une opération sur les ressources. Lorsque vous créez, mettez à jour ou supprimez une ressource à l'aide de l'API Cloud Control, cela est également considéré comme une opération de ressource. Vous pouvez configurer votre Guard Hook pour cibler RESOURCE et exécuter CLOUD_CONTROL les opérations dans la TargetOperations configuration de votre Hook. Lorsque votre Guard Hook évalue une opération de ressource, le moteur Guard évalue une entrée de ressource.

Syntaxe d'entrée des ressources Guard

L'entrée de la ressource Guard est constituée des données qui sont mises à la disposition de vos règles Guard pour évaluation.

Voici un exemple de forme d'entrée de ressource :

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

L'ID du Compte AWS contenant la ressource en cours d'évaluation.

StackId

L'ID de pile de la CloudFormation pile qui fait partie de l'opération sur les ressources. Ce champ est vide si l'appelant est l'API Cloud Control.

HookTypeName

Le nom du Hook qui fonctionne.

HookTypeVersion

La version du Hook en cours d'exécution.

InvocationPoint

Le point exact de la logique de provisionnement où le Hook s'exécute.

Valeurs valides  : (CREATE_PRE_PROVISION| UPDATE_PRE_PROVISION |DELETE_PRE_PROVISION)

TargetName

Le type de cible en cours d'évaluation, par exempleAWS::S3::Bucket.

TargetType

Le type de cible en cours d'évaluation, par exempleAWS::S3::Bucket. Pour les ressources provisionnées avec l'API Cloud Control, cette valeur seraRESOURCE.

TargetLogicalId

Le nom TargetLogicalId de la ressource en cours d'évaluation. Si l'origine du Hook est CloudFormation, il s'agira de l'ID logique (également appelé nom logique) de la ressource. Si l'origine du Hook est l'API Cloud Control, il s'agira d'une valeur construite.

ChangeSetId

L'ID de l'ensemble de modifications qui a été exécuté pour provoquer l'invocation de Hook. Cette valeur est vide si la modification de ressource a été initiée par l'API Cloud Control ou par les delete-stack opérations create-stackupdate-stack, ou.

Resources
ResourceLogicalID

Lorsque l'opération est initiée par CloudFormation, ResourceLogicalID il s'agit de l'ID logique de la ressource dans le CloudFormation modèle.

Lorsque l'opération est lancée par l'API Cloud Control, ResourceLogicalID il s'agit d'une combinaison du type de ressource, du nom, de l'ID de l'opération et de l'ID de demande.

ResourceType

Nom de type de la ressource (exemple :AWS::S3::Bucket).

ResourceProperties

Les propriétés proposées de la ressource en cours de modification. Lorsque le Guard Hook s'exécute contre les modifications de CloudFormation ressources, toutes les fonctions, tous les paramètres et toutes les transformations sont entièrement résolus. Si la ressource est supprimée, cette valeur sera vide.

Previous
ResourceLogicalID

Lorsque l'opération est initiée par CloudFormation, ResourceLogicalID il s'agit de l'ID logique de la ressource dans le CloudFormation modèle.

Lorsque l'opération est lancée par l'API Cloud Control, ResourceLogicalID il s'agit d'une combinaison du type de ressource, du nom, de l'ID de l'opération et de l'ID de demande.

ResourceType

Nom de type de la ressource (exemple :AWS::S3::Bucket).

ResourceProperties

Les propriétés actuelles associées à la ressource en cours de modification. Si la ressource est supprimée, cette valeur sera vide.

Exemple d'entrée d'opération de la ressource Guard

L'exemple d'entrée suivant montre un Guard Hook qui recevra la définition de la AWS::S3::Bucket ressource à mettre à jour. Il s'agit des données dont dispose Guard pour évaluation.

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

Pour voir toutes les propriétés disponibles pour le type de ressource, consultez AWS::S3::Bucket.

Règles de protection pour les changements de ressources

Lorsqu'un Guard Hook évalue des modifications de ressources, il commence par télécharger toutes les règles configurées avec le Hook. Ces règles sont ensuite évaluées par rapport à l'entrée des ressources. Le Hook échouera si l'une des règles échoue à son évaluation. S'il n'y a pas de panne, le Hook passera.

L'exemple suivant est une règle de garde qui évalue si la ObjectLockEnabled propriété est true destinée à un type de AWS::S3::Bucket ressource quelconque.

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. >> }

Lorsque cette règle est exécutée sur l'entrée suivante, elle échoue car la ObjectLockEnabled propriété n'est pas définie surtrue.

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

Lorsque cette règle est exécutée sur l'entrée suivante, elle est transmise car elle ObjectLockEnabled est définie surtrue.

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

En cas d'échec d'un Hook, les règles qui ont échoué sont retransmises à CloudFormation notre API Cloud Control. Si un compartiment de journalisation a été configuré pour le Guard Hook, des informations supplémentaires sur les règles y seront fournies. Ces commentaires supplémentaires incluent les Fix informations Violation et.

Règles de Stack Operation Guard

Lorsqu'une CloudFormation pile est créée, mise à jour ou supprimée, vous pouvez configurer votre Guard Hook pour commencer par évaluer le nouveau modèle et éventuellement bloquer l'opération de pile. Vous pouvez configurer votre Guard Hook pour cibler STACK les opérations dans la TargetOperations configuration de votre Hook.

Syntaxe d'entrée Guard Stack

L'entrée pour les opérations de la pile Guard fournit le CloudFormation modèle complet à évaluer par vos règles Guard.

Voici un exemple de forme d'entrée de pile :

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

L'ID du Compte AWS contenant la ressource.

StackId

L'ID de pile de la CloudFormation pile qui fait partie de l'opération de pile.

HookTypeName

Le nom du Hook qui fonctionne.

HookTypeVersion

La version du Hook en cours d'exécution.

InvocationPoint

Le point exact de la logique de provisionnement où le Hook s'exécute.

Valeurs valides  : (CREATE_PRE_PROVISION| UPDATE_PRE_PROVISION |DELETE_PRE_PROVISION)

TargetName

Le nom de la pile en cours d'évaluation.

TargetType

Cette valeur sera utilisée STACK lors de l'exécution en tant que Hook au niveau de la pile.

ChangeSetId

L'ID de l'ensemble de modifications qui a été exécuté pour provoquer l'invocation de Hook. Cette valeur est vide si l'opération de pile a été initiée par une delete-stack opération create-stackupdate-stack, ou.

Proposed CloudFormation Template

La valeur complète du CloudFormation modèle qui a été transmise à CloudFormation create-stack nos update-stack opérations. Cela inclut des éléments tels que ResourcesOutputs, etProperties. Il peut s'agir d'une chaîne JSON ou YAML selon ce qui a été fourni à CloudFormation.

Dans delete-stack les opérations, cette valeur sera vide.

Previous

Le dernier CloudFormation modèle déployé avec succès. Cette valeur est vide si la pile est créée ou supprimée.

Dans delete-stack les opérations, cette valeur sera vide.

Note

Les modèles fournis sont ceux qui sont transmis create ou update empilés dans les opérations. Lors de la suppression d'une pile, aucune valeur de modèle n'est fournie.

Exemple d'entrée d'opération Guard Stack

L'exemple d'entrée suivant montre un Guard Hook qui recevra un modèle complet et le modèle précédemment déployé. Le modèle de cet exemple utilise le format 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": {} } } }

Règles de protection pour les changements de pile

Lorsqu'un Guard Hook évalue les changements de pile, il commence par télécharger toutes les règles configurées avec le Hook. Ces règles sont ensuite évaluées par rapport à l'entrée des ressources. Le Hook échouera si l'une des règles échoue à son évaluation. S'il n'y a pas de panne, le Hook passera.

L'exemple suivant est une règle de garde qui évalue s'il existe des types de AWS::S3::Bucket ressources contenant une propriété appeléeBucketEncryption, SSEAlgorithm définie sur aws:kms ouAES256.

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" >> }

Lorsque la règle s'exécute selon le modèle suivant, elle le serafail.

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

Lorsque la règle s'exécute selon le modèle suivant, elle le serapass.

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

Modifier les règles de fonctionnement de la Garde

Lorsqu'un ensemble de CloudFormation modifications est créé, vous pouvez configurer votre Guard Hook pour évaluer le modèle et les modifications proposées dans l'ensemble de modifications afin de bloquer l'exécution de l'ensemble de modifications.

Syntaxe d'entrée du Guard Change Set

L'entrée de l'ensemble de modifications de Guard est constituée des données qui sont mises à la disposition de vos règles de Guard pour évaluation.

Voici un exemple de forme d'entrée d'un ensemble de modifications :

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 syntaxe du ResourceChange modèle est la suivante :

logique ResourceId: String resourceType: String action: CREATE, UPDATE, DELETE Numéro de ligne: Number Avant le contexte: JSON String Après le contexte: JSON String
HookContext
AWSAccountID

L'ID du Compte AWS contenant la ressource.

StackId

L'ID de pile de la CloudFormation pile qui fait partie de l'opération de pile.

HookTypeName

Le nom du Hook qui fonctionne.

HookTypeVersion

La version du Hook en cours d'exécution.

InvocationPoint

Le point exact de la logique de provisionnement où le Hook s'exécute.

Valeurs valides  : (CREATE_PRE_PROVISION| UPDATE_PRE_PROVISION |DELETE_PRE_PROVISION)

TargetName

Le nom de la pile en cours d'évaluation.

TargetType

Cette valeur sera utilisée CHANGE_SET lors de l'exécution en tant que Hook au niveau de l'ensemble de modifications.

TargetLogicalId

Cette valeur sera l'ARN de l'ensemble de modifications.

ChangeSetId

L'ID de l'ensemble de modifications qui a été exécuté pour provoquer l'invocation de Hook. Cette valeur est vide si l'opération de pile a été initiée par une delete-stack opération create-stackupdate-stack, ou.

Proposed CloudFormation Template

Le CloudFormation modèle complet qui a été fourni à une create-change-set opération. Il peut s'agir d'une chaîne JSON ou YAML selon ce qui a été fourni à CloudFormation.

Previous

Le dernier CloudFormation modèle déployé avec succès. Cette valeur est vide si la pile est créée ou supprimée.

Changes

Le Changes modèle. Cela répertorie les modifications apportées aux ressources.

Modifications
logique ResourceId

Le nom de ressource logique de la ressource modifiée.

resourceType

Type de ressource qui sera modifié.

action

Type d'opération en cours d'exécution sur la ressource.

Valeurs valides  : (CREATE| UPDATE |DELETE)

Numéro de ligne

Numéro de ligne du modèle associé à la modification.

Avant le contexte

Une chaîne JSON contenant les propriétés de la ressource avant la modification :

{"properties": {"property1": "value"}}
Après le contexte

Une chaîne JSON contenant les propriétés de la ressource après la modification :

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

Exemple d'entrée d'opération du kit de changement Guard

L'exemple d'entrée suivant montre un Guard Hook qui recevra un modèle complet, le modèle précédemment déployé et une liste des modifications apportées aux ressources. Le modèle de cet exemple utilise le format 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\"}}}" } ]

Règle de garde pour les opérations relatives aux ensembles de modifications

L'exemple suivant est une règle de protection qui évalue les modifications apportées aux compartiments Amazon S3 et garantit qu'elle n'VersionConfigurationest pas désactivée.

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' } }