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
Rubriques
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.
Rubriques
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 exemple
AWS::S3::Bucket. TargetType-
Le type de cible en cours d'évaluation, par exemple
AWS::S3::Bucket. Pour les ressources provisionnées avec l'API Cloud Control, cette valeur seraRESOURCE. TargetLogicalId-
Le nom
TargetLogicalIdde 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-stackopérationscreate-stackupdate-stack, ou.
Resources-
ResourceLogicalID-
Lorsque l'opération est initiée par CloudFormation,
ResourceLogicalIDil 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,
ResourceLogicalIDil 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,
ResourceLogicalIDil 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,
ResourceLogicalIDil 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-bucketObjectLockEnabled: true Previous: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName:amzn-s3-demo-bucketObjectLockEnabled: 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-bucketObjectLockEnabled: 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-bucketObjectLockEnabled: 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.
Rubriques
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
STACKlors 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-stackopérationcreate-stackupdate-stack, ou.
Proposed CloudFormation Template-
La valeur complète du CloudFormation modèle qui a été transmise à CloudFormation
create-stacknosupdate-stackopérations. Cela inclut des éléments tels queResourcesOutputs, etProperties. Il peut s'agir d'une chaîne JSON ou YAML selon ce qui a été fourni à CloudFormation.Dans
delete-stackles 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-stackles 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.
Rubriques
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_SETlors 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-stackopérationcreate-stackupdate-stack, ou.
Proposed CloudFormation Template-
Le CloudFormation modèle complet qui a été fourni à une
create-change-setopé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
Changesmodè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' } }